신호를 조사하는 동안 다음 코드를 사용했습니다.
#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를 보냅니다.