#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <errno.h>
#include <assert.h>
#include <unistd.h>
#include <sched.h>
pid_t parent_pid;
void sigquit_handler (int sig) {
pid_t self = getpid();
if (parent_pid != self) _exit(0);
}
int main ()
{
int i;
signal(SIGQUIT, sigquit_handler);
parent_pid = getpid();
puts("launching children"); for (i = 0; i < 5; ++i) {
pid_t p = fork();
switch (p) {
case 0:
printf("child running: %d\n", (int)getpid
()); sleep(100);
case -1:
default:
break;
}
}
puts("sleeping 1 second"); sleep(1);
puts("killing children"); kill(-parent_pid, SIGQUIT);
for (i = 0; i < 5; ++i) {
int status;
for (;;) {
pid_t child = wait(&status);
if (child > 0 && WIFEXITED(status) && WEXITSTATUS(status) == 0) {
printf("child %d succesully quit\n", (int)child
); } else if (child < 0 && errno == EINTR) {
continue;
} else {
}
break;
}
}
puts("sleeping 5 seconds"); sleep(5);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGFzc2VydC5oPgogCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHNjaGVkLmg+CiAKcGlkX3QgcGFyZW50X3BpZDsKIAp2b2lkIHNpZ3F1aXRfaGFuZGxlciAoaW50IHNpZykgewogICAgYXNzZXJ0KHNpZyA9PSBTSUdRVUlUKTsKICAgIHBpZF90IHNlbGYgPSBnZXRwaWQoKTsKICAgIGlmIChwYXJlbnRfcGlkICE9IHNlbGYpIF9leGl0KDApOwp9CiAKaW50IG1haW4gKCkKewogICAgaW50IGk7CiAKICAgIHNpZ25hbChTSUdRVUlULCBzaWdxdWl0X2hhbmRsZXIpOwogICAgcGFyZW50X3BpZCA9IGdldHBpZCgpOwogCiAgICBwdXRzKCJsYXVuY2hpbmcgY2hpbGRyZW4iKTsKICAgIGZmbHVzaChzdGRvdXQpOwogICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgewogICAgICAgIHBpZF90IHAgPSBmb3JrKCk7CiAgICAgICAgc3dpdGNoIChwKSB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICBwcmludGYoImNoaWxkIHJ1bm5pbmc6ICVkXG4iLCAoaW50KWdldHBpZCgpKTsKICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CiAgICAgICAgICAgIHNsZWVwKDEwMCk7CiAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgcGVycm9yKCJmb3JrIik7CiAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogCiAgICBwdXRzKCJzbGVlcGluZyAxIHNlY29uZCIpOwogICAgc2xlZXAoMSk7CiAKICAgIHB1dHMoImtpbGxpbmcgY2hpbGRyZW4iKTsKICAgIGtpbGwoLXBhcmVudF9waWQsIFNJR1FVSVQpOwogICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgewogICAgICAgIGludCBzdGF0dXM7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBwaWRfdCBjaGlsZCA9IHdhaXQoJnN0YXR1cyk7CiAgICAgICAgICAgIGlmIChjaGlsZCA+IDAgJiYgV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBwcmludGYoImNoaWxkICVkIHN1Y2Nlc3VsbHkgcXVpdFxuIiwgKGludCljaGlsZCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGQgPCAwICYmIGVycm5vID09IEVJTlRSKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBlcnJvcigid2FpdCIpOwogICAgICAgICAgICAgICAgYWJvcnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAKICAgIHB1dHMoInNsZWVwaW5nIDUgc2Vjb25kcyIpOwogICAgc2xlZXAoNSk7CiAKICAgIHB1dHMoImRvbmUiKTsKICAgIHJldHVybiAwOwp9