2015-01-23 3 views
0

문제가 있습니다.이 두 코드를 실행하고 두 번째 코드를 실행하면 터미널이 닫히고 첫 번째 코드는 그 때문에 차단됩니다.터미널 중 하나가 신호를 보내는 코드가 닫힙니다.

첫 번째 코드 :

#include <signal.h> 
#include <pthread.h> 
#include <stdio.h> 
#define N 10 // Numero de plazas disponibles en total 

int POcupadas; 

int main(){ 
    POcupadas = 0; 
    int sig; 
    union sigval user_sigval; 

    sigset_t sigset; 
    siginfo_t siginfo; 

    sigemptyset(&sigset); 
    sigaddset(&sigset, SIGRTMIN); 
    pthread_sigmask(SIG_BLOCK, &sigset, NULL); 

    while(1){ 
     sig=sigwaitinfo(&sigset, &siginfo); 
     int pid = siginfo.si_value.sival_int; 

     if (sig!=-1){ 
      if (POcupadas != N){ 
       ++POcupadas; 
       user_sigval.sival_int = 0; 
       sigqueue(pid, SIGRTMIN+1, user_sigval); 
      }else{ 
       user_sigval.sival_int = 1; 
       sigqueue(pid, SIGRTMIN+1, user_sigval); 

       break; 
      } 

     }else{ 
      printf("Error"); 
     } 

    } 
    return 0; 
} 

두 번째 코드 : 왜

#include <signal.h> 
#include <stdio.h> 
#include <pthread.h> 

int main() { 
    int sig; 
    srand(time(NULL)); 
    sigset_t set; 
    siginfo_t siginfo; 

    union sigval user_sigval; 
    int i, num; 

    sigemptyset(&set); 
    sigaddset(&set,SIGRTMIN+1); 
    pthread_sigmask(SIG_BLOCK, &set, NULL);  

    // PID 
    int pid = 5845; 
    // PID 

    for(i=0; i<30; i++) { 
     user_sigval.sival_int = getppid(); 
     sigqueue(pid, SIGRTMIN, user_sigval); 

     sig=sigwaitinfo(&set, &siginfo); 

     if (siginfo.si_value.sival_int == 0){ 
      printf ("Continue executing the code.\n"); 

     }else{ // No hay sitio 1 
      printf ("Finish executing the code.\n"); 
      break; 
     } 

     sleep(1); 
    } 

    return 0; 
} 

입니까? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

신호를 보내고있는 프로세스의 PID를 하드 코딩하는 것은 매우 이상합니다. 프로세스 자체에 신호를 보내려면'getpid()'를 통해 자체 PID를 얻을 수 있습니다. '5845 '가 로그인 셸의 PID 일 경우, SIGRTMIN을 보내면 프로세스가 차단하거나 처리기를 설치하지 않는 한 그것을 죽일 가능성이 있습니다. 그것은 관찰 된 행동을 설명 할 수 있습니다. –

답변

1

너 스스로하는 것처럼 보입니다.

user_sigval.sival_int = getppid(); 
    sigqueue(pid, SIGRTMIN, user_sigval); 

지금 첫 번째 코드의 중앙 부분을보고 : 두 번째 코드의 발췌 고려

sig=sigwaitinfo(&sigset, &siginfo); 
    int pid = siginfo.si_value.sival_int; 

    if (sig!=-1){ 
     if (POcupadas != N){ 
      ++POcupadas; 
      user_sigval.sival_int = 0; 
      sigqueue(pid, SIGRTMIN+1, user_sigval); 
     }else{ 
      user_sigval.sival_int = 1; 
      sigqueue(pid, SIGRTMIN+1, user_sigval); 

      break; 
     } 

    }else{ 
     printf("Error"); 
    } 

프로세스가 두 번째 코드를 실행하는 것을 가정하면을 (과정 2) 성공적으로 그것의 신호를 지시 첫 번째 코드를 실행하는 프로세스 (프로세스 1)에서 프로세스 1은 PID가 전달 된 프로세스에 신호를 보내 응답합니다. 즉, 프로세스 2의 부모입니다 (두 번째 코드에서 발췌 한 getppid() 참조). 실시간 신호의 기본 처리는 프로세스 종료입니다.

아마도 프로세스 2가 신호와 함께 자체 PID를 보내길 원할 것입니다. 그건 철자가 된 getpid()입니다.

관련 문제