fork() 및 신호가 프로세스에 전달되는 방법

fork() 및 신호가 프로세스에 전달되는 방법

내가 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_trapCtrl-를 누르면 실행됩니다 C.

하나 있다forkPOSIX 중화 신호 간의 상호 작용에 대한 긴 논의. 여기서 가장 중요한 부분은 다음과 같습니다.

fork() 이후 프로세스 그룹으로 전송되는 신호는 상위 프로세스와 하위 프로세스 모두에 전달되어야 합니다.

그들은 또한 일부 시스템이 정확히 올바른 방식으로 작동하지 않을 수 있다는 점을 지적합니다. 특히 신호가 매우 가까운 시간에 도착하는 경우 더욱 그렇습니다 fork(). 각 개별 시도에서 상호 작용이 거의 발생하지 않기 때문에 이러한 시스템 중 하나를 사용하고 있는지 파악하려면 코드를 읽거나 많은 행운이 필요할 수 있습니다.

기타 유용한 점은 다음과 같습니다.

  • 수동으로 생성되어 단일 프로세스로 전송되는 신호(아마도kill) 전달됩니다오직상위 프로세스인지 하위 프로세스인지 여부에 관계없이 프로세스에 적용됩니다.
  • 프로세스 간에 신호 처리기가 실행되는 순서는 정의되어 있지 않으므로 먼저 실행되는 신호 처리기에 의존할 수 없습니다.
  • 만약 너라면아니요인터럽트 핸들러를 정의하거나 명시적으로 신호를 무시하면 두 프로세스 모두 SIGINT코드와 함께 종료됩니다(기본 동작).
  • 하나는 치명적이지 않게 신호를 처리하고 다른 하나는 처리하지 않으면 핸들러가 없는 하나는 종료되고 다른 하나는 계속됩니다.

관련 정보