【发布时间】:2019-09-01 13:03:08
【问题描述】:
我自己有一个守护程序forks,然后有一个无限循环检查系统条件,当满足某些条件时,它运行一个命令。这些命令可以长时间运行,这意味着它们需要是异步的,所以我使用fork 和execvp 来运行这些命令。我的代码如下所示:
int main(int argc, char *argv[])
{
signal(SIGCHLD, SIG_IGN);
pid_t pid, sid;
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
umask(0);
sid = setsid();
if (sid < 0)
{
exit(EXIT_FAILURE);
}
if ((chdir("/")) < 0)
{
exit(EXIT_FAILURE);
}
while (1)
{
// Check conditions
...
if (conditions_met)
{
pid_t pid2, sid2;
pid2 = fork();
if (pid2 == 0)
{
sid2 = setsid();
// Define command_argv
...
execvp(command_argv[0], command_argv);
}
}
sleep(60);
}
exit(EXIT_SUCCESS);
}
这一切正常,我的命令运行良好 - 但是,它正在离开僵尸进程。这是我第一次尝试异步使用fork 和exec,但我认为signal(SIGCHLD, SIG_IGN) 应该忽略孩子并让init 进程获得它们。为什么这些僵尸还在徘徊?
【问题讨论】:
标签: c signals fork exec zombie-process