3

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

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

4

4 回答 4

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;
}

如果你运行它,并使用它ps a来查看进程,你会看到a.out两次,PID 彼此接近。打印child exited后,您会看到第二个进程的状态变为:

12362 pts/0    Z+     0:00 [a.out] <defunct>

这里的 Z 意味着它是一个“僵尸”进程。当第一个过程的 60 秒结束时,它就会消失。

于 2013-09-20T12:25:20.480 回答
2

如果你分叉,你也必须wait为你的孩子做一个。如果孩子在您执行此操作之前退出,它将保持僵尸状态。因此,如果您想杀死孩子并且您没有等待它的返回状态,它会一直存在并且不会占用 PID。在这种情况下,您可以安全地杀死它,即使它不再起作用,如果它不再运行。如果您等待,然后发送终止,如果您不查看孩子的状态,则可能会发生 PID 在此期间被另一个进程占用。

于 2013-09-20T12:24:50.940 回答
1

如果子进程退出,它就变成了一个僵尸进程——死进程,它仍然在运行进程表中,所以它的父进程可以检索它的退出代码。

于 2013-09-20T12:24:46.820 回答
0

是的,PID 会递增并最终循环回零 - 因此一个进程可以退出并在稍后使用它的 PID 运行另一个进程。但是您始终可以检查它的 PPID 以确保您的它是父级。

于 2013-09-20T12:23:40.130 回答