C

分叉後中斷信號的行為

  • June 14, 2018

我在研究信號時使用了以下程式碼。

#include<stdio.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/types.h>

int handler(int sig)
{
   printf("interrupt has been invoked\n");
}

int main(){
   pid_t pid;//pid_t is the datatype for process ids
   int status;

   signal(SIGINT,handler);
   if((pid=fork())==0)
   {
       while(1)
           sleep(1);
       exit(0);
   }
   else
   {
       wait(NULL);
   }
}

使用 ctrl+c 收到的輸出是這樣的:

^Cinterrupt has been invoked
interrupt has been invoked
^Cinterrupt has been invoked
interrupt has been invoked
^Cinterrupt has been invoked
interrupt has been invoked

有人可以解釋為什麼每次使用 ctrl+c 時都會列印兩次“已呼叫中斷”嗎?

這是因為信號處理程序在 fork() 呼叫之後對父子程序都有效。

由於分叉的子程序與父程序在同一個程序組中執行,因此兩個程序都會收到信號。

您可能喜歡使用此 printf() 命令:

printf("interrupt has been invoked in pid %d\n", (int)getpid());

tty 驅動程序設置了一個 tty 程序組,如果您鍵入 ^C 並且 ^C 設置為 TTY INTR 字元,則 tty 驅動程序將 SIGINT 發送到與 tty 驅動程序在同一程序組中的所有程序。

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