首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何防止在Linux中使用fork()和exec()时创建僵尸进程?

如何防止在Linux中使用fork()和exec()时创建僵尸进程?
EN

Stack Overflow用户
提问于 2014-12-08 23:26:58
回答 4查看 11.4K关注 0票数 1

当我使用fork()和exec()在后台运行应用程序时,有没有办法防止创建僵尸进程?父进程不应该等待()到子进程完成。另外,我不能使用sigaction()和sigaction.sa_handler,因为它会影响我不想要的所有子进程。我想要的东西将只收获特定的孩子,或将防止产卵任何僵尸。请帮帮忙。

EN

回答 4

Stack Overflow用户

发布于 2014-12-08 23:34:06

如果你想创建一个不需要等待的“分离”进程,最好的方法是分叉两次,这样它就是一个“孙”进程。在直接子进程上立即执行waitpid,它应该在再次派生之后立即调用_exit (这样这个waitpid就不会阻塞父进程中的前进进程)。子进程将成为孤立进程,因此它将被init进程继承,您再也不必处理它了。

或者,您可以使用SA_NOCLDWAIT安装用于SIGCHLD的信号处理程序。然而,总的来说,这是一个非常糟糕的想法,因为它的影响是全球性的。它将严重破坏您使用的任何需要等待子进程的库代码,包括标准库函数,如popen,可能是wordexp,可能是grantpt等。

票数 3
EN

Stack Overflow用户

发布于 2014-12-08 23:39:03

为了防止僵尸进程,您需要告诉父进程等待孩子,直到孩子的进程终止。

您需要使用库'sys/wait.h‘中包含的waitpid()函数。

下面是一个示例代码,您可以使用waitpid()函数。

代码语言:javascript
复制
 #include <unistd.h>
    #include <sys/types.h>
    #include <errno.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <stdlib.h>


int main()
{
    pid_t child_pid;
    int status;
    int local = 0;
    /* now create new process */
    child_pid = fork();

    if (child_pid >= 0) /* fork succeeded */
    {
        if (child_pid == 0) /* fork() returns 0 for the child process */
        {
            printf("child process!\n");

            // Increment the local and global variables

            printf("child PID =  %d, parent pid = %d\n", getpid(), getppid());



         }
         else /* parent process */
         {
             printf("parent process!\n");
             printf("parent PID =  %d, child pid = %d\n", getpid(), child_pid);
             wait(&status); /* wait for child to exit, and store child's exit status */
       }

     //code ..
票数 1
EN

Stack Overflow用户

发布于 2016-10-21 03:01:19

@R:公平地说,在一些用户案例中,人们可能会派生一个作业,并且绝对不需要对产生的孩子的结果做出反应。如果没有应答,对wait()函数的任何调用都可能最终阻塞父进程,对吗?这可能会坠毁一架飞机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27361227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档