在C语言中后台运行进程

3
我希望能够在 c 的主函数中运行一个子进程。我已经使用了 fork 和 execv 函数来实现这一点。但是,在父进程结束时,如果子进程尚未退出,我还想杀死后台的子进程。为此,我将使用 kill(pChildPid)函数。所以我的问题是:如果子进程在父进程之前退出,Linux 操作系统会分配相同的 pid 给其他进程吗?如果是的话,那么我将会无意中杀死该进程吗?

在这里阅读相关内容:https://dev59.com/CXA75IYBdhLWcg3wJFmY。这是一个很好的解释。 - Dusan Plavak
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秒结束后,它就会消失。


2
如果您进行分叉操作,那么您必须为子进程执行wait操作。如果子进程在您执行wait操作之前退出,则会变成僵尸进程。因此,如果您想杀死子进程,并且没有等待其返回状态,那么它将继续存在,PID不会被占用。在这种情况下,即使子进程已经停止运行,您仍然可以安全地杀死它,但不会产生任何效果。
如果您执行了wait操作,然后稍后发送了杀死命令,那么在此期间,PID可能已被其他进程占用,如果您不查看子进程的状态。

1

如果子进程退出了,它将成为僵尸进程-已经死亡的进程,但仍在运行进程表中,因此其父进程可以检索其退出代码。


0

是的,PIDs会递增并最终循环回零 - 因此进程可以退出,并在以后的某个时间再次运行。但您始终可以检查其PPID以确保它的父级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接