2009-10-04 20 views
0

我正在写一个shell。它分叉背景和前景过程。我遇到了SIGTSTP信号问题。因此,在给出Ctrl^Z之后,由于该信号被传递到我的shell及其子进程(我的shell已分叉的所有后台进程和前台进程),因此会生成SIGTSTP。但是就像在实际的shell中一样,SIGTSTP仅被传递到前台进程,而不是后台进程。那么如何控制这种行为意味着阻止信号发送到我的外壳的后台进程?如何控制SIGTSTP信号到子进程?

我也试过setpgid(),这意味着改变后台进程的pgid。但是一旦进程执行完成,setpgid()将返回错误。

回答

1

如果您为SIGTSTP安装您自己的处理程序,您可以控制其传播给您的孩子(或不)。由于你正在编写一个shell,你可能想用其他几个信号来做这件事(至少SIGINT)。

孩子有exec ed后不能setpgid?很简单,请在子女exec之前拨打电话setpgid。以后不需要更改–每个作业都应该有一个唯一的pgid,并且应该设置终端的控制组以匹配预期的活动作业pgid

+0

我也需要exec之后。我可以通过fg内建函数为foregorund带来一个后台进程。我已经在做信号处理器 – avd 2009-10-04 03:26:02

+1

你做错了。就像我在最后一段所说的那样,给每个工作一个不同的'pgid'。当你想把工作带到前台时,使用'tcsetpgrp'来给这个终端的组控制。当你想把作业放到后台时,使用'tcsetpgrp'命令给你的shell的组端控制。 – ephemient 2009-10-04 23:58:58