【发布时间】:2012-03-14 16:24:28
【问题描述】:
作为任务的一部分,我正在编写自己的 unix shell,但我无法处理创建后台进程。我编写了一个信号处理函数并在我的代码中实现了必要的(从我的角度来看,但显然不够好)部分如下:
void handler(int sig)
{
int pid;
int status;
pid = wait(NULL);
printf("[%d]retval: %d \n", pid, WEXITSTATUS(status));
fflush(stdout);
}
int main() {
.....
....
struct sigaction sigchild;
memset (&sigchild, 0, sizeof(sigchild));
sigchild.sa_handler = handler;
sigchild.sa_flags = SA_SIGINFO | SA_NOCLDWAIT;
...
...
if(isBackground) //background process
{
sigaction(SIGCHLD, &sigchild, 0);
}
例如,当我输入“sleep 5 &”然后输入“ps”查看进程时,没有睡眠。可能是什么问题?提前致谢。
【问题讨论】:
-
与您的问题无关,但您绝对不能在信号处理程序中使用
printf()。您可能会发现信号处理程序中的wait()也是一场灾难。 -
也许“man 3 daemon”可以提供帮助? Afaik 这是守护几乎任何东西的最简单方法。