#include #include #include #include #include #include #include pid_t pid0, pid1, pid2; char * stack1, * stack2; #define STACKSIZE 1024*8*4 struct sigcall{ int sig; pid_t pid; } siglist[1024]; int nsig = 0; printfsiglist() { int i; for (i = 0; i< nsig; i++) printf("%d:: %d: %d %d\n", getpid(), i, siglist[nsig].pid, siglist[nsig].sig); }; void sighand(int sig) { siglist[nsig].pid = getpid(); siglist[nsig].sig = sig; nsig++; } int clone2() { pid2 = getpid(); printf("clone2 has pid %d\n", pid2); sleep(100); printfsiglist(); }; int clone1() { char * stack; pid1 = getpid(); printf("clone1 has pid %d\n", pid1); sleep(10); printfsiglist(); return; exit(0); }; main() { char * stack; int x, rc; pid0 = getpid(); printf("clone0 has pid %d\n", pid0); signal(SIGCHLD, sighand); signal(SIGALRM, sighand); stack1 = malloc(STACKSIZE); stack2 = malloc(STACKSIZE); stack1 += STACKSIZE; stack2 += STACKSIZE; pid1 = __clone(clone1, stack1, CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, NULL); pid2 = __clone(clone2, stack2, CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND, NULL); sleep(1); printf("master: clone0 has pid %d\n", pid0); printf("master: clone1 has pid %d\n", pid1); printf("master: clone2 has pid %d\n", pid2); exit(2); };