2017-05-12 12 views
0

5 명의 하위 프로세스를 생성하는 상위 프로세스가 있습니다. 그 자식 프로세스는 뭔가하고 있습니다. 학부모는 자녀 과정에 여전히 활동 중인지와 대답 할 시간이 있는지 자주 묻습니다. 특정 프로세스가 응답하지 않으면 부모 프로세스는 하위 프로세스가 중단되었음을 알립니다. 신호를 사용해야합니다.부모가 신호를 보내고 응답을 기다리는 중

편집

당신이 부모에게 다시 신호를 보내 당신의 자식 프로세스의 어느 검사 할 필요가 다음이 방법으로 신호를 사용하려면; sigaction() 시스템 호출을 사용해야합니다.

AS 맥케이 (My Mackay)가 제안한대로 sigaction()을 사용했습니다. 그러나 나는 아이의 말똥가슴이 있고 아이가 대답하지 않을 때,이 아이가 탈락 한 것을 알리는 방법. 나는 if 문을 사용해야 만한다는 것을 알고 있지만 어떤 조건을 검사 할 것인가?

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

pid_t pid; 

void chandler(int signum) 
{ 
    psignal(signum, "Signal handled \n "); 
    kill(pid, SIGUSR2); 
} 

void phandler(int signum, siginfo_t*siginfo, void *context) 
{ 
    printf("Signal received from child:%d \n", siginfo->si_pid); 
} 

int main(){ 
    int i; 
    struct sigaction sig; 
    sig.sa_handler = &chandler; 
    struct sigaction sig1; 
    sig1.sa_handler = &phandler; 
    sig.sa_flags = SA_SIGINFO; 
    sig1.sa_flags = SA_SIGINFO; 
    printf("Parent = %d\n", getppid()); 
    for(i = 0; i<5; i++) 
    { 
     pid = fork(); 
     if(pid<0){ 
      perror("Error!"); 
      exit(1); 
     } 
     else if(pid ==0){ 
      sleep(3); 
      sigaction(SIGUSR2, &sig, NULL); 
      kill(getppid(), SIGUSR1); 
      pause(); 
      for(;;); 
     } 
     else{ 
      sigaction(SIGUSR1, &sig1, NULL); 
      pause(); 
     } 
    } 
    for(i = 0; i<100000; i++); 
    return 0; 
} 
+0

이식성을 위해 프로그램을 일시 중지하려면 for() 루프 대신 sleep() 또는 nanosleep() 함수를 사용하는 것이 가장 이상적입니다. –

답변

0

신호를이 방법으로 사용하려면 자녀 프로세스가 신호를 부모에게 보냈는지 확인해야합니다. sigaction() 시스템 호출을 사용해야합니다. 더 많은 정보가 있습니다. this answer

그러나 프로세스 간 통신의 경우 많은 프로그래머가 파이프를 사용합니다. 귀하의 경우에는 부모와 자녀 프로세스간에 종단 간 의사 소통을 제공 할 수 있습니다. 파이프에 대한 정보가 있습니다. here

예를 들어, 파이프 및 select() 시스템 호출을 사용하여 시간 초과 메커니즘을 사용하는 것이 좋습니다.

+0

제 경우에는 신호를 사용해야합니다. 나는 sigaction()을 시도 할 것이다. –