2009-10-04 18 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