신호 함수가 내 신호 처리기를 호출할 수 없는 이유는 무엇입니까? [폐쇄]

신호 함수가 내 신호 처리기를 호출할 수 없는 이유는 무엇입니까? [폐쇄]

여기에 그에 따라 이름이 지정된 신호 처리 함수를 작성했습니다. 이 처리기는 신호 함수를 사용하여 커널에 등록되며 handler 내 하위 프로세스가 신호를 생성할 때 호출됩니다. SIGCHLD이게 내 코드야

#include<stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
void handler(int sig){
    pid_t pid;
    printf("The name of the PID=%d\n",getpid());
    pid=wait(NULL);
    printf("Pid %d exited \n",pid);
}
int main(){
    signal(SIGCHLD,handler)

    if(!fork()){
        printf("This is the child process %d\n",getpid());
        exit(1);
    }
    printf("Parent pid is %d\n",getpid());
    printf("The parent is waiting");
    return 0;

}

출력은 다음과 같습니다

Parent pid is 4356
The parent is waitingThis is the child process 4357

제 질문은 핸들러 함수를 등록하기 위해 신호 함수를 사용했는데도 핸들러가 호출되지 않는 이유입니다. 이는 내 핸들러가 등록되지 않은 경우에만 발생합니다. 왜?

답변1

"부모 프로세스가 기다리고 있습니다"라고 말하고 몇 사이클을 기다렸다가 "0을 반환"하여 종료됩니다. SIGCHLD를 수신하려면 하위 프로세스가 작업을 수행하기 전에 상위 프로세스가 종료되지 않는지 확인해야 합니다.

가장 간단한 방법은 다음과 같습니다 return 0. 앞에 줄을 삽입합니다.

sleep(10);

이로 인해 부모님이 최대 10초 동안 기다리게 됩니다.

당신은 당신의 부모님을 알아차릴 것이다아니요실제로 10초만 기다리세요. 그 이유는 독자들에게 연습 문제로 남겨두었습니다. (힌트: 매뉴얼 페이지를 읽어보세요 ;-)

관련 정보