フォーク後の割り込み信号の動作

フォーク後の割り込み信号の動作

信号の調査中に、次のコードを使用しました。

#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を使用するたびに「割り込みが呼び出されました」が2回印刷される理由を誰かが説明できますか?

答え1

これは、fork()呼び出し後に親と子の両方がシグナルハンドラを使用できるためです。

分岐した子プロセスは親プロセスと同じプロセスグループで実行されるため、両方のプロセスがシグナルを受け取ります。

次のprintf()コマンドを使用したい場合があります。

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

ttyドライバはttyプロセスグループを設定し、^ Cを入力し、^ CがTTY INTR文字に設定されている場合、ttyドライバはttyドライバと同じプロセスグループ内のすべてのプロセスにSIGINTを送信します。

関連情報