当我使用fork()和exec()在后台运行应用程序时,有没有办法防止创建僵尸进程?父进程不应该等待()到子进程完成。另外,我不能使用sigaction()和sigaction.sa_handler,因为它会影响我不想要的所有子进程。我想要的东西将只收获特定的孩子,或将防止产卵任何僵尸。请帮帮忙。
发布于 2014-12-08 23:34:06
如果你想创建一个不需要等待的“分离”进程,最好的方法是分叉两次,这样它就是一个“孙”进程。在直接子进程上立即执行waitpid,它应该在再次派生之后立即调用_exit (这样这个waitpid就不会阻塞父进程中的前进进程)。子进程将成为孤立进程,因此它将被init进程继承,您再也不必处理它了。
或者,您可以使用SA_NOCLDWAIT安装用于SIGCHLD的信号处理程序。然而,总的来说,这是一个非常糟糕的想法,因为它的影响是全球性的。它将严重破坏您使用的任何需要等待子进程的库代码,包括标准库函数,如popen,可能是wordexp,可能是grantpt等。
发布于 2014-12-08 23:39:03
为了防止僵尸进程,您需要告诉父进程等待孩子,直到孩子的进程终止。
您需要使用库'sys/wait.h‘中包含的waitpid()函数。
下面是一个示例代码,您可以使用waitpid()函数。
#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 ..发布于 2016-10-21 03:01:19
@R:公平地说,在一些用户案例中,人们可能会派生一个作业,并且绝对不需要对产生的孩子的结果做出反应。如果没有应答,对wait()函数的任何调用都可能最终阻塞父进程,对吗?这可能会坠毁一架飞机。
https://stackoverflow.com/questions/27361227
复制相似问题