【发布时间】:2010-12-09 18:41:03
【问题描述】:
我已经对一个进程执行了 fork 和 exec(),但我想在后台运行它。我怎样才能做到这一点? 我可以避免在其上调用 waitpid,但随后该进程将永远坐在那里,等待将其状态返回给父级。有没有其他方法可以做到这一点?
【问题讨论】:
我已经对一个进程执行了 fork 和 exec(),但我想在后台运行它。我怎样才能做到这一点? 我可以避免在其上调用 waitpid,但随后该进程将永远坐在那里,等待将其状态返回给父级。有没有其他方法可以做到这一点?
【问题讨论】:
捕获 SIGCHLD 并在处理程序中调用 wait()。
Posix 的一些风格(我认为是 *BSD,但不要引用我的话),如果你忽略 SIGCHLD,内核将自动清理僵尸进程(这是你在 ps 中看到的)。这是一个不错的功能,但不便于携带。
【讨论】:
我认为您正在尝试做的是创建一个守护进程。阅读维基百科上的this 链接以获得解释。
使进程成为守护进程的示例(来自 Steven 的 Unix 环境中的高级编程)是:
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
int daemon_int(void)
{
pid_t pid;
if ((pid = fork()) < 0)
return (-1) ;
else if (pid != 0)
exit(0) ; /* The parent process exits */
setsid() ; /* become session leader */
chdir("/") ; /* change the working dir */
umask(0) ; /* clear out the file mode creation mask */
return(0) ;
}
当然,这假设是一个类似 Unix 的操作系统。
所以你的程序包含了上述函数,并在运行后立即调用它。然后它会与它的父进程解除关联,并继续运行,直到它终止或被杀死。
【讨论】:
waitpid(-1, &status, WNOHANG) 可能会做您需要的事情:如果没有子进程退出,它应该立即返回。或者,您可以监听 SIGCHLD 信号。
【讨论】:
fork 创建后台线程,然后执行。在这个网站上看到一个欺骗问题:Can we start a background process using exec() giving & as an argument?
【讨论】: