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;
}
プログラムを一時停止したい場合は、移植性のためにfor()ループではなくsleep()またはnanosleep()関数を使用するのが理想的です。 –