• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
start0(void * arg)16 static void *start0(void *arg)
17 {
18 	sleep(1);
19 	exit(42);
20 }
21 
start1(void * arg)22 static void *start1(void *arg)
23 {
24 	pause();
25 	/* NOTREACHED */
26 	assert(0);
27 }
28 
main(int argc,char * argv[])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