1 /* Test handle_group_exit() handling of a thread leader still alive with its 2 * thread child calling exit_group() and proper passing of the process exit 3 * code to the process parent of this whole thread group. 4 * 5 * gcc -o test/leaderkill test/leaderkill.c -Wall -ggdb2 -pthread;./test/leaderkill & pid=$!;sleep 1;strace -o x -q ./strace -f -p $pid 6 * It must print: write(1, "OK\n", ... 7 */ 8 9 #include <pthread.h> 10 #include <assert.h> 11 #include <unistd.h> 12 #include <stdlib.h> 13 #include <stdio.h> 14 #include <sys/wait.h> 15 16 static void *start0(void *arg) 17 { 18 sleep(1); 19 exit(42); 20 } 21 22 static void *start1(void *arg) 23 { 24 pause(); 25 /* NOTREACHED */ 26 assert(0); 27 } 28 29 int main(int argc, char *argv[]) 30 { 31 pthread_t thread0; 32 pthread_t thread1; 33 pid_t child, got_pid; 34 int status; 35 int i; 36 37 sleep(2); 38 39 child = fork(); 40 41 switch (child) { 42 case -1: 43 abort(); 44 case 0: 45 i = pthread_create(&thread0, NULL, start0, NULL); 46 assert(i == 0); 47 i = pthread_create(&thread1, NULL, start1, NULL); 48 assert(i == 0); 49 pause(); 50 /* NOTREACHED */ 51 assert(0); 52 break; 53 default: 54 got_pid = waitpid(child, &status, 0); 55 assert(got_pid == child); 56 assert(WIFEXITED(status)); 57 assert(WEXITSTATUS(status) == 42); 58 puts("OK"); 59 exit(0); 60 } 61 62 /* NOTREACHED */ 63 abort(); 64 } 65