2017-12-15 16 views
0

으로 처리됩니다 :아니 모든 신호는 내가 포크를 사용하여 3 개 자식 프로세스를 만드는거야 약간의 C 프로그램이 C

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 

void handler(int signum) { 
    printf("SIGNAL ARRIVED\n"); 
} 

int main() { 
    signal(SIGTERM, handler); 
    pid_t pid; 
    pid_t parent = getpid(); 
    int i; 
    for(i = 0; i < 3; i++) { 
     pid = fork(); 
     if(pid == 0) { 
     kill(parent, SIGTERM); 
     exit(0); 
    } 
} 
    while(wait(NULL) > 0) {} 
    exit(0); 
} 

내 예상 출력이 세 SIGNAL ARRIVED이다, 그러나 때때로 나는 단지 그 두 가지를 얻을. 왜 이런가, 내가 무엇을 놓치고, 매번 세 번이나 얻을 수 있습니까?

+2

시그널은 비동기 적으로 전달됩니다. 시그널은 비동기 적으로 전달됩니다. 시그널링 프로세스가 종료된다. 상위 프로세스가 실제로 세 신호 모두를보고 처리하도록 보장해야하는 경우 동기식 신호 처리를 시도 할 수 있습니다. 자세한 내용은 signal (7)을 참조하십시오. http://man7.org/linux/man-pages/man7/signal.7.html – David

+0

잘못된 코드입니다. [signal-safety (7)] (http://man7.org/linux/man-pages/man7/signal-safety.7.html) 및 [signal (7)] (http://man7.org/ –

+2

@ChrisDodd는 정규 신호가 대기하지 않았 음을 지적합니다. 이것은 또 다른 오류의 원인 일 수 있습니다. linux/man-pages/man7/signal.7.html Linux는 큐에 넣을 수있는 소위 "실시간 신호"를 지원합니다. 자세한 내용은 위의 man 페이지를 참조하십시오. – David

답변

3

신호는 대기열에 들어 있지 않으며 단지 플래그입니다. 프로세스에 신호를 보내면 플래그가 설정되고 플래그가 이미 설정되어 있으면 추가 효과가 없습니다. 따라서 여러 시그널이 프로세스에 전달되어 시그널 핸들러를 실행하고 플래그를 지우면 일부 시그널은 "손실"될 것입니다.