답변:
우리는 그것을 시도하고 보지 않겠습니까? 다음 은 부모 프로세스와 자식 프로세스를 모두 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_trap
I 누를 때 실행되었다 Ctrl- C.
POSIX에서와 신호 사이의 상호 작용에fork
대한 긴 토론이 있습니다. 여기에서 가장 중요한 부분은 다음과 같습니다.
fork () 이후에 프로세스 그룹으로 전송 된 신호는 부모와 자식 모두에게 전달되어야합니다.
또한 일부 시스템은 특히 신호가 시간에 매우 가깝게 도착할 때 정확하게 작동하지 않을 수 있습니다 fork()
. 이러한 시스템 중 하나를 사용하고 있는지 확인하려면 각 개별 시도에서 상호 작용이 거의 없기 때문에 코드를 읽거나 운이 많이 필요할 것입니다.
다른 유용한 점은 다음과 같습니다.
kill
) 부모 또는 자식인지 여부에 관계없이 해당 프로세스 에만 전달 됩니다 .SIGINT
코드 (기본 동작).