2017-05-12 224 views
0

我有一個父進程創建5個子進程。那些兒童進程正在做一些事情。父母經常詢問孩子的過程是否仍然活躍,他們有一段時間來回答。如果某個進程沒有回答,則父進程通知該進程已經退出。我必須使用信號。父發送信號並等待響應

編輯

如果你想使用的信號這種方式,那麼你需要檢查你的子進程發送了信號反饋給家長;爲此,您需要使用sigaction()系統調用。

正如麥凱建議我使用了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

如果你想暫停程序,那麼爲了便於攜帶,你最好使用sleep()或者nanosleep()函數而不是for()循環。 –

回答

0

如果你想以這種方式使用信號,那麼你需要檢查你的子進程中的哪一個發送信號回到父;爲此,您需要使用sigaction()系統調用。有更多的信息在this answer

但是,對於進程間通信,許多程序員會使用管道;在你的情況下,這些可以提供父母和子女流程之間的端到端通信。有一些關於管道的信息here

對於你給出的例子,我會建議使用管道和帶有超時機制的select()系統調用。

+0

就我而言,我必須使用信號。我會嘗試使用sigaction()。 –