我正在写一个shell。它分叉背景和前景进程。我的SIGTSTP信号有问题。因此,在给出Ctrl ^ Z之后,生成SIGTSTP,因为此信号被传递到我的shell及其子进程(我的shell已经分叉的所有后台进程和前台进程)。但就像在实际的shell中一样,SIGTSTP只传递给前台进程,而不是后台进程。那么如何控制这种行为意味着阻止信号被发送到我的shell的后台进程?
我也尝试了setpgid()
,这意味着要更改后台进程的pgid。但是一旦进程执行了exec,setpgid()
就会返回错误。
答案 0 :(得分:1)
如果您为SIGTSTP
安装自己的处理程序,则可以控制其传播给您的孩子(或不是)。由于您正在编写shell,因此您可能希望使用其他一些信号(至少SIGINT
)执行此操作。
孩子在setpgid
编辑后不能exec
?很容易,在孩子setpgid
之前致电exec
。您之后不需要更改它 - 每个作业都应该有一个唯一的pgid
,您应该设置终端的控制组以匹配预期的活动作业pgid
。