포크 후 인터럽트 신호의 동작

포크 후 인터럽트 신호의 동작

신호를 조사하는 동안 다음 코드를 사용했습니다.

#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를 사용할 때마다 "인터럽트가 호출되었습니다"가 두 번 인쇄되는 이유를 누군가 설명할 수 있습니까?

답변1

이는 fork() 호출 후에 부모와 자식 모두 신호 처리기를 사용할 수 있기 때문입니다.

분기된 하위 프로세스는 상위 프로세스와 동일한 프로세스 그룹에서 실행되므로 두 프로세스 모두 신호를 받습니다.

다음 printf() 명령을 사용하고 싶을 수도 있습니다:

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

tty 드라이버는 tty 프로세스 그룹을 설정하고, ^C를 입력하고 ^C가 TTY INTR 문자로 설정된 경우 tty 드라이버는 tty 드라이버와 동일한 프로세스 그룹에 있는 모든 프로세스에 SIGINT를 보냅니다.

관련 정보