【发布时间】:2013-02-26 00:06:44
【问题描述】:
我有一个分叉进程的程序,并确定子进程是否应该在前台和后台运行。我在分叉之前调用信号函数来处理子信号,以确保死去的子进程不会变成僵尸。
到目前为止,我的程序运行良好,它会创建一个子进程并在用户输入带有“&”的命令时在后台运行它,并在用户输入不带“&”的命令时在前台运行它。
但是,我发现了一个非常有趣的行为。假设我调用了这个操作序列:
sleep 5 &
ls
第一个命令可以正常工作,父进程不会等待 sleep 5 完成。但是,当我运行“ls”时,它会打印该文件夹中的所有文件(这很好),但是外壳卡住了,等待之前的“sleep 5 &”完成......
为什么会发生这种情况?我的子进程和父进程代码(分叉后)如下所示:
if (pid == 0)
{
// child process, execute stuff
execv();
}
else if (pid > 0)
{
// parent process: call waitpid to wait for foreground child
}
我试图做一些研究,但找不到任何可以帮助我的东西。我尝试通过在 execv() 之前调用它来为子进程使用“set session-id”,但它会阻止我的子进程在终端上打印任何内容。 任何帮助将不胜感激。谢谢!
【问题讨论】:
-
有很多可能性。没有看到更多代码,很难猜出问题所在。