Process

fork() 以及如何將信號傳遞給程序

  • December 28, 2014

我在 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_trapCtrl``C

對 POSIX 中的信號和信號之間的互動進行了冗長的討論fork。這裡最重要的部分是:

在 fork() 之後發送到程序組的信號應該同時傳遞給父程序和子程序。

他們還指出,某些系統可能不會以完全正確的方式執行,特別是當信號非常接近fork(). 弄清楚您是否在其中一個系統上可能需要閱讀程式碼或很多運氣,因為在每次嘗試中都不太可能發生互動。

其他有用的點是:

  • 手動生成並發送到單個程序(可能帶有kill)的信號將僅傳遞該程序,無論它是父程序還是子程序。
  • 未定義信號處理程序在程序之間執行的順序,因此您不能依賴任何一個先執行。
  • 如果您沒有定義中斷處理程序(或顯式忽略信號),則兩個程序都只會以SIGINT程式碼退出(預設行為)。
  • 如果一個非致命地處理信號而另一個不處理,則沒有處理程序的一個將死亡,另一個將繼續。

引用自:https://unix.stackexchange.com/questions/176235