簡體   English   中英

在C語言中的基本Shell程序中,如何退出與父代關聯的所有進程?

[英]In a basic Shell Program in C, how to exit all processes associated with a parent?

我正在編寫用於大學作業的基本Shell程序,並且需要測試用戶何時輸入字符串“ exit”。 發生這種情況時,程序應退出。

我可以成功地對此進行測試,但是如果我在程序中派生了處理錯誤的新進程,那么無論當前當前有多少活動進程在運行,我都必須保持退出狀態。

在這種情況下,是否可以退出與程序相關的所有進程?

干杯。

如評論中所述,您不應在后台生成交互過程(至少您的shell和命令將如何處理唯一的stdin?)。

同樣,作為外殼程序,您應該跟蹤所有生成的進程(在后台),以便您能夠捕獲它們的返回代碼,至少在sh / bash中是如此。 以bash為例:

> sleep 1 &
[1] 8215
>
(1 sec later)
[1]+  Terminated      sleep 1

因此,如果您有現有子級的列表,則可以將SIGINT / SIGKILL發送給所有這些子級。

無論您是否真的想確保殺死所有人,都應該使用進程組(PG)殺死。 在PID = 0時使用kill()函數會將終止信號發送到與您相同的進程組中的所有進程。 因此,您可以通過設置一個新的進程組來啟動Shell(以確保不會殺死其他東西),並且該PG將由您的孩子繼承(當然,如果孩子設置了新的PG,這也適用)。

看起來像:

// at the begining of your main code
// try to get a new process group for me
x = setpgid(0,0);
if (x == -1) {
  perror("setpgid");
  exit(1);
}
(…)
// here you're about to exit from main, just kill
// all members of your group
kill(0, SIGINT);  // send an INT signal
kill(0, SIGKILL); // paranoid: if a child catch INT it will get a KILL

// now you can exit, but you're probably dead 'cause you
// also receive the SIGINT. If you want to survive you have to
// catch SIGINT, but you will not catch KILL whatever

如果您需要生存下來,可以使用signal()或更好的sigaction()捕獲信號,這樣您就不會被殺死,因此可以執行其他退出前動作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM