#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
#include <sys/types.h>
#define MAGIC 42
#define P 2048
int *f(void) {
static unsigned offset = 0;
volatile int data[P];
offset = (offset + 1) % P;
data[offset] = MAGIC;
return &data[offset];
}
int check() {
int value;
int *m = f();
value = *m;
return value == MAGIC;
}
void loop() {
do {} while (check());
}
static void catch_function(int signal) {
int foo[100], i;
if (signal == SIGCHLD) {
printf("Caught the SIGCHLD signal. Exiting.\n"); }
for (i = 0; i < 100; i++)
foo[i] = i * i;
}
int main(void) {
if (signal(SIGUSR1, catch_function) == SIG_ERR || signal(SIGCHLD, catch_function) == SIG_ERR) {
fputs("An error occurred while setting a signal handler.\n", stderr
); return EXIT_FAILURE;
}
pid_t chpid = fork();
if (chpid == -1) {
fputs("An error occurred while forking child process.\n", stderr
); return EXIT_FAILURE;
}
if (chpid == 0) {
pid_t parent = getppid();
do {} while(kill(parent, SIGUSR1) == 0);
} else {
loop();
}
return 0;
}
I2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8aW50dHlwZXMuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojZGVmaW5lIE1BR0lDIDQyCiNkZWZpbmUgUCAyMDQ4CgppbnQgKmYodm9pZCkgewogICAgc3RhdGljIHVuc2lnbmVkIG9mZnNldCA9IDA7CiAgICB2b2xhdGlsZSBpbnQgZGF0YVtQXTsKICAgIG9mZnNldCA9IChvZmZzZXQgKyAxKSAlIFA7CiAgICBkYXRhW29mZnNldF0gPSBNQUdJQzsKICAgIHJldHVybiAmZGF0YVtvZmZzZXRdOwp9CgppbnQgY2hlY2soKSB7CiAgICBpbnQgdmFsdWU7CiAgICBpbnQgKm0gPSBmKCk7CiAgICB2YWx1ZSA9ICptOwogICAgcmV0dXJuIHZhbHVlID09IE1BR0lDOwp9Cgp2b2lkIGxvb3AoKSB7CiAgICBkbyB7fSB3aGlsZSAoY2hlY2soKSk7CiAgICBwdXRzKCJPb3BzLiIpOwp9CgpzdGF0aWMgdm9pZCBjYXRjaF9mdW5jdGlvbihpbnQgc2lnbmFsKSB7CiAgICBpbnQgZm9vWzEwMF0sIGk7CiAgICBpZiAoc2lnbmFsID09IFNJR0NITEQpIHsKICAgICAgICBwcmludGYoIkNhdWdodCB0aGUgU0lHQ0hMRCBzaWduYWwuIEV4aXRpbmcuXG4iKTsKICAgICAgICBleGl0KEVYSVRfU1VDQ0VTUyk7CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCiAgICAgICAgZm9vW2ldID0gaSAqIGk7Cn0KCgppbnQgbWFpbih2b2lkKSB7CiAgICBpZiAoc2lnbmFsKFNJR1VTUjEsIGNhdGNoX2Z1bmN0aW9uKSA9PSBTSUdfRVJSIHx8IHNpZ25hbChTSUdDSExELCBjYXRjaF9mdW5jdGlvbikgPT0gU0lHX0VSUikgewogICAgICAgIGZwdXRzKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBzZXR0aW5nIGEgc2lnbmFsIGhhbmRsZXIuXG4iLCBzdGRlcnIpOwogICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CiAgICB9CgogICAgcGlkX3QgY2hwaWQgPSBmb3JrKCk7CiAgICBpZiAoY2hwaWQgPT0gLTEpIHsKICAgICAgICBmcHV0cygiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgZm9ya2luZyBjaGlsZCBwcm9jZXNzLlxuIiwgc3RkZXJyKTsKICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOwogICAgfQoKICAgIGlmIChjaHBpZCA9PSAwKSB7CiAgICAgICAgcGlkX3QgcGFyZW50ID0gZ2V0cHBpZCgpOwogICAgICAgIGRvIHt9IHdoaWxlKGtpbGwocGFyZW50LCBTSUdVU1IxKSA9PSAwKTsKICAgICAgICBwZXJyb3IoIktpbGwiKTsKICAgIH0gZWxzZSB7CiAgICAgICAgbG9vcCgpOwogICAgfQogICAgcHV0cygiRXhpdGluZy4iKTsKICAgIHJldHVybiAwOwp9Cg==