1 /* $OpenBSD: main-thread-exited.c,v 1.2 2014/05/20 01:25:24 guenther Exp $ */
2 /* PUBLIC DOMAIN Mar 2012 <guenther@openbsd.org> */
3 
4 
5 #include <sys/types.h>
6 #include <sys/wait.h>
7 #include <err.h>
8 #include <errno.h>
9 #include <pthread.h>
10 #include <signal.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <unistd.h>
15 
16 void *
tmain(void * arg)17 tmain(void *arg)
18 {
19 	sleep(1);
20 	printf("sending SIGKILL\n");
21 	kill(getpid(), SIGKILL);
22 	sleep(1);
23 	printf("still running!\n");
24 	exit(1);
25 }
26 
27 int
main(int argc,char ** argv)28 main(int argc, char **argv)
29 {
30 	pid_t pid;
31 	pthread_t t;
32 	int r;
33 
34 	pid = fork();
35 	if (pid == -1)
36 		err(1, "fork");
37 	if (pid > 0) {
38 		int status;
39 
40 		if (waitpid(pid, &status, 0) != pid)
41 			err(1, "waitpid");
42 		exit(! WIFSIGNALED(status) || WTERMSIG(status) != SIGKILL);
43 	}
44 
45 	/* in child */
46 	if ((r = pthread_create(&t, NULL, tmain, NULL)))
47 		errc(1, r, "pthread_create");
48 	pthread_exit(NULL);
49 	abort();
50 }
51