1/* fork a process that has created a detached thread. */
2
3#include <stdlib.h>
4#include <sys/wait.h>
5#include <pthread.h>
6#include <sys/types.h>
7#include <unistd.h>
8#include <stdio.h>
9#include <signal.h>
10
11static void *threadmain(void *dummy)
12{
13	sleep((unsigned long)dummy);
14	return NULL;
15}
16
17int main(int argc, char **argv)
18{
19        int ctr;
20	pid_t childpid;
21	pthread_t childthread;
22	void *res;
23	int status;
24
25	pthread_create(&childthread, NULL, threadmain, (void *)2);
26	pthread_detach(childthread);
27
28	childpid = fork();
29	switch (childpid) {
30	case 0:
31		pthread_create(&childthread, NULL, threadmain, 0);
32		pthread_join(childthread, &res);
33		exit(0);
34		break;
35	case -1:
36		perror("FAILED: fork failed\n");
37		break;
38	default:
39		break;
40	}
41
42	ctr = 0;
43	while (waitpid(childpid, &status, 0) != childpid) {
44		sleep(1);
45		ctr++;
46		if (ctr >= 10) {
47		  fprintf(stderr, "FAILED - timeout waiting for child\n");
48		  return 0;
49		}
50	}
51
52	fprintf(stderr, "PASS\n");
53
54	return 0;
55}
56