在c中后台运行一个进程

qua*_*rtz 3 c c++ linux exec

我想从 c 中的 main 函数在后台运行一个子进程。我已经使用 fork 和 execv 函数来执行此操作。但我也想在父进程结束时杀死子后台进程,以防子进程尚未退出。我将使用kill(pChildPid)函数来执行此操作。所以我的问题是

假设子进程先于父进程退出,Linux操作系统可以将与子进程相同的pid分配给其他进程吗?如果是,那么我会无意中杀死该进程?

Mat*_*son 5

是的,理论上可以,而且你也可以。

但是,如果您拥有该进程,则它将是一个“僵尸”进程,直到您waitpid或类似的函数收到该进程死亡的消息[除非分叉进程使用detach与拥有进程的连接断开连接]。

展示:

#include <sys/wait.h>
#include <sys/types.h>
#include <unistd.h>
#include <iostream>

int main()
{
    int pid = fork();
    if (pid)
    {
        int p = 0;
        int status;
        sleep(60);
        p = wait(&status);
        std::cout << "Pid " << p << " exited..." << std::endl;
    }
    else
    {
        for(int i = 0; i < 20; i++)
        {
            std::cout << "Child is sleeping..." << std::endl;
            sleep(1);
        }
        std::cout << "Child exited..." << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您运行此命令并使用它ps a来查看进程,您将看到a.out两次,并且 PID 彼此接近。一旦打印出来child exited,您将看到第二个进程的状态如下所示:

12362 pts/0    Z+     0:00 [a.out] <defunct>
Run Code Online (Sandbox Code Playgroud)

这里的Z表示这是一个“僵尸”进程。当第一个过程的 60 秒结束后,它就会消失。