내가 C로 작성한 프로그램은 자식 프로세스를 닫기 위해 fork()를 사용합니다. 두 프로세스 모두 종료되지 않습니다. 명령줄에서 프로그램을 시작하고 control-c를 누르면 어떤 프로세스가 인터럽트 신호를 받게 됩니까?
답변1
한번 시도해 보는 게 어떨까요? 사용하는 간단한 프로그램입니다.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!
단말에서 발생한 인터럽트 신호는 상위 프로세스 그룹과 하위 프로세스 그룹을 포함하는 활성 프로세스 그룹으로 전달된다.. 볼 수 child_trap
있고parent_trap
Ctrl-를 누르면 실행됩니다 C.
하나 있다fork
POSIX 중화 신호 간의 상호 작용에 대한 긴 논의. 여기서 가장 중요한 부분은 다음과 같습니다.
fork() 이후 프로세스 그룹으로 전송되는 신호는 상위 프로세스와 하위 프로세스 모두에 전달되어야 합니다.
그들은 또한 일부 시스템이 정확히 올바른 방식으로 작동하지 않을 수 있다는 점을 지적합니다. 특히 신호가 매우 가까운 시간에 도착하는 경우 더욱 그렇습니다 fork()
. 각 개별 시도에서 상호 작용이 거의 발생하지 않기 때문에 이러한 시스템 중 하나를 사용하고 있는지 파악하려면 코드를 읽거나 많은 행운이 필요할 수 있습니다.
기타 유용한 점은 다음과 같습니다.
- 수동으로 생성되어 단일 프로세스로 전송되는 신호(아마도
kill
) 전달됩니다오직상위 프로세스인지 하위 프로세스인지 여부에 관계없이 프로세스에 적용됩니다. - 프로세스 간에 신호 처리기가 실행되는 순서는 정의되어 있지 않으므로 먼저 실행되는 신호 처리기에 의존할 수 없습니다.
- 만약 너라면아니요인터럽트 핸들러를 정의하거나 명시적으로 신호를 무시하면 두 프로세스 모두
SIGINT
코드와 함께 종료됩니다(기본 동작). - 하나는 치명적이지 않게 신호를 처리하고 다른 하나는 처리하지 않으면 핸들러가 없는 하나는 종료되고 다른 하나는 계속됩니다.