#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int N = 5;
int _pipe[2];
pid_t children[5];
int main(){
pid_t parent_pid;
pid_t pid;
int i = 0;
int return_val; //we're not going to use this, but need it to call sigwait()
sigset_t set;
sigfillset(&set);
sigprocmask(SIG_BLOCK, &set, NULL);
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]);
//sleep(2);
// 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
sigwait(&set, &return_val);
i = i+1;
}
}
// What children do
else{
// Wait for main process SIGUSR1 delivery
sigwait(&set, &return_val);
fprintf(stderr
, "SIGUSR1 arrived child %u from its father\n",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);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CgppbnQgTiA9IDU7CmludCBfcGlwZVsyXTsKcGlkX3QgY2hpbGRyZW5bNV07CgppbnQgbWFpbigpewogICAgcGlkX3QgcGFyZW50X3BpZDsKICAgIHBpZF90IHBpZDsKICAgIGludCBpID0gMDsKICAgIGludCByZXR1cm5fdmFsOyAvL3dlJ3JlIG5vdCBnb2luZyB0byB1c2UgdGhpcywgYnV0IG5lZWQgaXQgdG8gY2FsbCBzaWd3YWl0KCkKCiAgICBzaWdzZXRfdCBzZXQ7CiAgICBzaWdmaWxsc2V0KCZzZXQpOwogICAgc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc2V0LCBOVUxMKTsKCiAgICBwYXJlbnRfcGlkID0gZ2V0cGlkKCk7CiAgICBmcHJpbnRmKHN0ZGVyciwiSSBhbSBtYWluIHByb2Nlc3MsIGhlcmUgY29tZXMgbXkgcGlkICV1XG4iLGdldHBpZCgpKTsKCiAgICBpZiAoMD5waXBlKF9waXBlKSkgZnByaW50ZihzdGRlcnIsIkVycm9yIHdoZW4gY3JlYXRpbmcgcGlwZSIpOwoKICAgIC8vU3RhcnQgY3JlYXRpbmcgY2hpbGQgcHJvY2Vzc2VzCiAgICB3aGlsZSAoaSA8IE4pewogICAgICAgICAgICBwaWQgPSBmb3JrKCk7CiAgICAgICAgICAgIGlmIChwaWQgPT0gMCl7CiAgICAgICAgICAgICAgICBjbG9zZShfcGlwZVsxXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbHNlewogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlZCBjaGlsZCB3aXRoIHBpZCAldVxuIixwaWQpOwogICAgICAgICAgICBjaGlsZHJlbltpXSA9IHBpZDsKICAgICAgICAgICAgd3JpdGUoX3BpcGVbMV0sJnBpZCxzaXplb2YocGlkX3QpKTsKICAgICAgICB9CiAgICAgICAgaSA9IGkrMTsKICAgIH0KCiAgICBpID0gMDsKCiAgICAvLyBXaGF0IG1haW4gcHJvY2VzcyBkb2VzCiAgICBpZiAocGlkPjApewogICAgICAgIGNsb3NlKF9waXBlWzBdKTsKICAgICAgICBjbG9zZShfcGlwZVsxXSk7CgogICAgICAgIC8vc2xlZXAoMik7CgogICAgICAgIC8vIE1haW4gcHJvY2VzcyBzZW5kcyBzaWduYWwgdG8gZWFjaCBjaGlsZAogICAgICAgIHdoaWxlKGkgPCBOKXsgICAgICAgICAgIAogICAgICAgICAgICBraWxsKGNoaWxkcmVuW2ldLFNJR1VTUjEpOwogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiU2VudCBTSUdVU1IxIHRvIGNoaWxkICV1XG4iLGNoaWxkcmVuW2ldKTsKICAgICAgICAgICAgLy8gLi4gTm93IGp1c3Qgd2FpdCBmb3IgU0lHVVNSMiBhcnJpdmFsCiAgICAgICAgICAgIHNpZ3dhaXQoJnNldCwgJnJldHVybl92YWwpOwoKICAgICAgICAgICAgaSA9IGkrMTsKICAgICAgICB9CiAgICB9CiAgICAvLyBXaGF0IGNoaWxkcmVuIGRvCiAgICBlbHNlewogICAgICAgIC8vIFdhaXQgZm9yIG1haW4gcHJvY2VzcyBTSUdVU1IxIGRlbGl2ZXJ5CiAgICAgICAgc2lnd2FpdCgmc2V0LCAmcmV0dXJuX3ZhbCk7CgogICAgICAgIGZwcmludGYoc3RkZXJyLCAiU0lHVVNSMSBhcnJpdmVkIGNoaWxkICV1IGZyb20gaXRzIGZhdGhlclxuIixnZXRwaWQoKSk7CgogICAgICAgIC8vIE9uY2UgU0lHVVNSMSBoYXMgYXJyaXZlZCwgcGlwZSBpcyByZWFkIE4gdGltZXMKICAgICAgICB3aGlsZSgoaSA8IE4pICYmIChyZWFkKF9waXBlWzBdLCZwaWQsc2l6ZW9mKHBpZF90KSk+MCkpewogICAgICAgICAgICBjaGlsZHJlbltpXSA9IHBpZDsKICAgICAgICAgICAgaSA9IGkrMTsKICAgICAgICB9CiAgICAgICAgY2xvc2UoX3BpcGVbMF0pOwoKICAgICAgICAvLyBBZnRlciByZWFkaW5nIHBpcGUsIGEgcmVwbHkgaXMgc2VudCB0byBwYXJlbnQgcHJvY2VzcwogICAgICAgIGtpbGwocGFyZW50X3BpZCxTSUdVU1IyKTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0=