在c中运行后台进程

时间:2013-09-20 12:19:49

标签: c++ c linux exec

我想在c中使用main函数在后台运行子进程。我使用fork和execv函数来实现。但是我也希望在父进程结束时终止子进程,以防子进程尚未退出。我将使用kill(pChildPid)函数来执行此操作。所以我的问题是

假设子进程在父进程之前退出,linux OS是否可以将与子进程相同的pid分配给其他进程?如果是,那么我将无意中杀死这个过程?

4 个答案:

答案 0 :(得分:4)

是的,从理论上讲,它可以,是的,你可以。

但是,如果您拥有该进程,那么它将是一个“僵尸”进程,直到您的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秒结束时,它就会消失。

答案 1 :(得分:2)

如果你分叉,你还必须为你的孩子做wait。如果孩子在你这样做之前就退出了,它会像僵尸一样留下来。因此,如果你想要杀死孩子并且你没有等待它的返回状态,那么它将会停留并且不会采取PID。在这种情况下,你可以安全地杀死它,即使它不再具有效果,如果它不再运行。 如果你等待,然后发送杀戮,那么如果你没有看到你孩子的状态,那么可能会在同时由另一个进程采取PID。

答案 2 :(得分:1)

如果子进程退出,它将变成一个僵尸进程 - 死进程仍在运行进程表中,因此其父进程可以检索其退出代码。

答案 3 :(得分:0)

是的,PID会递增并最终循环回零 - 因此进程可以退出,并在稍后的时间运行它的PID。但你可以随时检查它的PPID,以确保它的父母。