【发布时间】:2016-03-15 10:37:38
【问题描述】:
我正在尝试为我的学校作业制作自己的外壳,在成功的 fork 调用之后,我想将来自 fork() 函数的 pid 放入前台,然后我想将自己的外壳放入后台。然后在waitpid函数之后,我需要把我自己的shell再次放到前台。为此,我认为是这样的:
if(tcsetpgrp(0, getpgid(pid))!=0)
perror("Foreground error: ");
waitpid(pid, NULL, 0);
if(tcsetpgrp(0, getpgid(shellpid))!=0)
perror("Foreground error: ");}
但是在新进程完成后,linux shell 会停止我自己的 shell。 例如, ls 命令就是图中的新进程。 Please look at here: for terminal screen shot
【问题讨论】:
-
相关:How do I get tcsetpgrp() to work in C。当它是后台进程并尝试更改 tty 的 pgrp 时,您的 shell 将停止。修复是(暂时)忽略 SIGTTOU。
-
感谢您帮助添加“signal(SIGTTOU, SIG_IGN);”在 tcsetpgrp 解决我的问题之前。但是,我需要使用 Ctrl+Z 命令来停止进程,所以当我忽略它时,我不能这样做。
-
Control-Z 向前台进程组发送 SIGTSTP 信号。它具有与 SIGTTOU 类似的效果,但它们是不同的信号。添加忽略 SIGTTOU 的代码行是否会阻止 Control-Z 正常工作?
-
在添加 sigprocmask 调用之前,Control-Z 是否有效?
-
你能问这个问题吗?如果可以,请在父子代码中包含执行任何 setpgid、tcsetgrp、fork、waitpid 和 exec* 调用的所有代码。