| /* fork a process that has created a detached thread. */ |
| |
| #include <stdlib.h> |
| #include <sys/wait.h> |
| #include <pthread.h> |
| #include <sys/types.h> |
| #include <unistd.h> |
| #include <stdio.h> |
| #include <signal.h> |
| |
| static void *threadmain(void *dummy) |
| { |
| sleep((unsigned long)dummy); |
| return NULL; |
| } |
| |
| int main(int argc, char **argv) |
| { |
| int ctr; |
| pid_t childpid; |
| pthread_t childthread; |
| void *res; |
| int status; |
| |
| pthread_create(&childthread, NULL, threadmain, (void *)2); |
| pthread_detach(childthread); |
| |
| childpid = fork(); |
| switch (childpid) { |
| case 0: |
| pthread_create(&childthread, NULL, threadmain, 0); |
| pthread_join(childthread, &res); |
| exit(0); |
| break; |
| case -1: |
| perror("FAILED: fork failed\n"); |
| break; |
| default: |
| break; |
| } |
| |
| ctr = 0; |
| while (waitpid(childpid, &status, 0) != childpid) { |
| sleep(1); |
| ctr++; |
| if (ctr >= 10) { |
| fprintf(stderr, "FAILED - timeout waiting for child\n"); |
| return 0; |
| } |
| } |
| |
| fprintf(stderr, "PASS\n"); |
| |
| return 0; |
| } |