/*
* This file is NOT part of CSL. It is a test file used while testing
* development of support for any hypothetical future concurrency schemes.
*/
#include <sys/types.h>
#include <unistd.h>
#ifdef WIN32
#define SIGKILL 9
#else
#include <sys/wait.h>
#endif
#include <signal.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
volatile int a = 0;
void worry(int n)
{
int i, j;
for (j=0; j<100; j++)
for (i=0; i<10000000*n; i++) a++;
}
int main(int argc, char *argv[])
{
pid_t pid1, pid2, pidx, pidy;
int status;
pid1 = fork();
if (pid1 < 0)
{ printf("Fork 1 failed\n");
}
else if (pid1 == 0)
{ /* TASK 1 */
printf("Task 1 starting\n");
worry(argc+5);
printf("Task 1 has had %d seconds\n", argc+5);
exit(0);
}
else
{ printf("Task 1 has pid %d\n", pid1);
pid2 = fork();
if (pid2 < 0)
{ printf("Fork 2 failed\n");
kill(pid1, SIGKILL);
waitpid(pid1, &status, 0);
printf("Task 1 killed\n");
}
else if (pid2 == 0)
{ /* TASK 2 */
printf("Task 2 starting\n");
worry(7);
printf("Task 2 has had 7 seconds\n");
exit(0);
}
else
{ printf("Task 2 has pid %d\n", pid2);
pidx = wait(&status);
printf("First signal was from task %d\n", pidx);
if (!WIFEXITED(status))
{ printf("Task did not exit cleanly\n");
kill(pid1, SIGKILL);
kill(pid2, SIGKILL);
waitpid(pid1, &status, 0);
waitpid(pid2, &status, 0);
printf("Both tasks now dead\n");
}
pidy = pidx == pid1 ? pid2 : pid1;
kill(pidy, SIGKILL);
waitpid(pidy, &status, 0);
printf("Other task (%d) now dead\n", pidy);
}
}
printf("All done\n");
return 0;
}