C
分叉後中斷信號的行為
我在研究信號時使用了以下程式碼。
#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 驅動程序在同一程序組中的所有程序。