Process
fork() 以及如何將信號傳遞給程序
我在 C fork() 中編寫的程序脫離了子程序。兩個程序都不會終止。如果我從命令行啟動程序並按 control-c 哪個程序會收到中斷信號?
我們為什麼不試試看呢?這是一個簡單的程序,
signal(3)
用於擷取SIGINT
父程序和子程序,並在程序到達時列印出一條標識程序的消息。#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <signal.h> void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");} void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");} int main(int argc, char **argv) { if (!fork()) { signal(SIGINT, &child_trap); sleep(1000); exit(0); } signal(SIGINT, &parent_trap); sleep(1000); return 0; }
讓我們稱之為
test.c
。現在我們可以執行它了:$ gcc test.c $ ./a.out ^CCaught signal in CHILD. They got back together!
終端產生的中斷信號被傳遞給活動程序組,這裡包括父程序組和子程序組。當我按下-時,您可以看到兩者
child_trap
和都被執行了。parent_trap
Ctrl``C
對 POSIX 中的信號和信號之間的互動進行了冗長的討論
fork
。這裡最重要的部分是:在 fork() 之後發送到程序組的信號應該同時傳遞給父程序和子程序。
他們還指出,某些系統可能不會以完全正確的方式執行,特別是當信號非常接近
fork()
. 弄清楚您是否在其中一個系統上可能需要閱讀程式碼或很多運氣,因為在每次嘗試中都不太可能發生互動。其他有用的點是:
- 手動生成並發送到單個程序(可能帶有
kill
)的信號將僅傳遞給該程序,無論它是父程序還是子程序。- 未定義信號處理程序在程序之間執行的順序,因此您不能依賴任何一個先執行。
- 如果您沒有定義中斷處理程序(或顯式忽略信號),則兩個程序都只會以
SIGINT
程式碼退出(預設行為)。- 如果一個非致命地處理信號而另一個不處理,則沒有處理程序的一個將死亡,另一個將繼續。