답변:
우리는 그것을 시도하고 보지 않겠습니까? 다음 은 부모 프로세스와 자식 프로세스를 모두 signal(3)트랩 SIGINT하고 프로세스가 도착했을 때이를 식별하는 메시지를 인쇄하는 데 사용하는 간단한 프로그램 입니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void parent_trap(int sig) {fprintf(stderr, "They got back together!\n");}
void child_trap(int sig) {fprintf(stderr, "Caught signal in CHILD.\n");}
int main(int argc, char **argv) {
if (!fork()) {
signal(SIGINT, &child_trap);
sleep(1000);
exit(0);
}
signal(SIGINT, &parent_trap);
sleep(1000);
return 0;
}
이라고 부릅시다 test.c. 이제 우리는 그것을 실행할 수 있습니다 :
$ gcc test.c
$ ./a.out
^CCaught signal in CHILD.
They got back together!
터미널에서 생성 된 인터럽트 신호는 활성 프로세스 그룹으로 전달되며 여기에는 parent 및 child가 모두 포함됩니다 . 둘 다 볼 수 child_trap와는 parent_trapI 누를 때 실행되었다 Ctrl- C.
POSIX에서와 신호 사이의 상호 작용에fork 대한 긴 토론이 있습니다. 여기에서 가장 중요한 부분은 다음과 같습니다.
fork () 이후에 프로세스 그룹으로 전송 된 신호는 부모와 자식 모두에게 전달되어야합니다.
또한 일부 시스템은 특히 신호가 시간에 매우 가깝게 도착할 때 정확하게 작동하지 않을 수 있습니다 fork(). 이러한 시스템 중 하나를 사용하고 있는지 확인하려면 각 개별 시도에서 상호 작용이 거의 없기 때문에 코드를 읽거나 운이 많이 필요할 것입니다.
다른 유용한 점은 다음과 같습니다.
kill) 부모 또는 자식인지 여부에 관계없이 해당 프로세스 에만 전달 됩니다 .SIGINT코드 (기본 동작).