2017-05-12 3 views
0

5つの子プロセスを作成する親プロセスがあります。それらの子プロセスは何かをしています。親は頻繁に子プロセスが依然として活動しているかどうか、そして彼らには答える時間があるかどうかを尋ねます。特定のプロセスが応答しない場合、親プロセスは子プロセスが脱落したことを通知します。私は信号を使わなければならない。親が信号を送信して応答を待っています

EDIT

あなたが親に戻って信号を送信し、あなたの子プロセスのWHICHチェックする必要があり、この方法で信号を使用する場合は。そのためには、sigaction()システムコールを使用する必要があります。

私がsigaction()を使用したとAS Mackayが提案したとおりです。しかし、私が子供の子供がいて、子供が答えていないとき、この子供が脱落したことを知らせる方法。私は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

このようにシグナルを使用する場合は、シグナルを送信した子プロセスのWHICHを親に戻す必要があります。そのためには、sigaction()システムコールを使用する必要があります。多くの情報がありますthis answer

ただし、プロセス間通信では多くのプログラマがパイプを使用します。あなたのケースでは、これらは親プロセスと子プロセスの間でエンドツーエンドの通信を提供できます。パイプについての情報がありますhere

上記の例では、パイプとselect()システムコールのタイムアウトメカニズムを使用することをお勧めします。

+0

私の場合は、信号を使用する必要があります。私はsigaction()で試してみます。 –

関連する問題