여기에 그에 따라 이름이 지정된 신호 처리 함수를 작성했습니다. 이 처리기는 신호 함수를 사용하여 커널에 등록되며 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초만 기다리세요. 그 이유는 독자들에게 연습 문제로 남겨두었습니다. (힌트: 매뉴얼 페이지를 읽어보세요 ;-)