2012-12-05 60 views
3

我的目標是讓主流程及其「叉」兒童相互通信。通信是通過信號傳遞完成的。sigsuspend()不會對信號做出反應

我的問題出現在第一個孩子在等待SIGUSR1信號時卡住等待。

我沒有真正的想法,爲什麼它卡在那一點。如果我通過控制檯發送信號,那麼這個子進程似乎沒有被關注。

有人能幫助我嗎?


這裏談到的代碼

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <signal.h> 

int N = 5; 
int _pipe[2]; 
pid_t children[5]; 

void main(){ 
    pid_t parent_pid; 
    pid_t pid; 
    int i = 0; 

    sigset_t set; 
    sigfillset(&set); 

    parent_pid = getpid(); 
    fprintf(stderr,"I am main process, here comes my pid %u\n",getpid()); 

    if (0>pipe(_pipe)) fprintf(stderr,"Error when creating pipe"); 

    //Start creating child processes 
    while (i < N){ 
      pid = fork(); 
      if (pid == 0){ 
       close(_pipe[1]); 
      break; 
     } 
     else{ 
      fprintf(stderr,"Created child with pid %u\n",pid); 
      children[i] = pid; 
      write(_pipe[1],&pid,sizeof(pid_t)); 
     } 
     i = i+1; 
    } 

    i = 0; 

    // What main process does 
    if (pid>0){ 
     close(_pipe[0]); 
     close(_pipe[1]); 

     sigdelset(&set,SIGUSR2); 

     sigdelset(&set,SIGTERM); 
     sigdelset(&set,SIGKILL); 

     // Main process sends signal to each child 
     while(i < N){   
      kill(children[i],SIGUSR1); 
      fprintf(stderr,"Sent SIGUSR1 to child %u\n",children[i]); 
      // .. Now just wait for SIGUSR2 arrival 
      sigsuspend(&set); 

      i = i+1; 
     } 
    } 
    // What children do 
    else{ 
     // Wait for main process SIGUSR1 delivery 
     sigdelset(&set,SIGUSR1); 
     sigsuspend(&set); 

     fprintf(stderr, "SIGUSR1 arrived child %u from its father",getpid()); 

     // Once SIGUSR1 has arrived, pipe is read N times 
     while((i < N) && (read(_pipe[0],&pid,sizeof(pid_t))>0)){ 
      children[i] = pid; 
      i = i+1; 
     } 
     close(_pipe[0]); 

     // After reading pipe, a reply is sent to parent process 
     kill(parent_pid,SIGUSR2); 
    } 
} 

回答

3

問題最有可能有待辦事項的事實,家長是將信號發送到它分叉後立即子進程,而子進程不會阻止信號。因此,當你在子進程中呼叫sigsuspend()時,信號已經傳遞給孩子,現在它只是坐在那裏等待一個永遠不會到來的信號。在開始發送信號之前,您可以通過在主進程中撥打sleep()一秒鐘或兩秒鐘來快速測試該理論。請記住,因爲你的代碼是現在的結構,sigsuspend()將不對沒有爲你等待的信號,信號處理工作...所以我建議用信號工作時,下面這個:

  1. 在父進程中,阻止您計劃使用的所有信號用於父進程和子進程之間的通信。你需要撥打電話sigprocmask()
  2. 有父叉子進程
  3. 在子進程簡單地使用含有堵塞信號的信號集叫sigwait()用於通信...你不需要sigsuspend()爲你做什麼這裏。
  4. 在父進程已將信號發送給子代後,它也可以調用sigwait()來等待子進程回覆。

這裏是不工作的代碼示例:http://ideone.com/TRcqga

+0

非常感謝@jason,但真正的問題是沒有的,其時收到「sigsuspended」信號定義RAS方法。 在接下來的幾天中,我將恢復我所做的最終代碼。 – xsubira

相關問題