|  | #include <errno.h> | 
|  | #include <pthread.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  | #include <unistd.h> | 
|  | #include <sys/wait.h> | 
|  |  | 
|  |  | 
|  | static pid_t pid; | 
|  |  | 
|  | static void * | 
|  | pid_thread (void *arg) | 
|  | { | 
|  | if (pid != getpid ()) | 
|  | { | 
|  | printf ("pid wrong in thread: should be %d, is %d\n", | 
|  | (int) pid, (int) getpid ()); | 
|  | return (void *) 1L; | 
|  | } | 
|  |  | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | pid = getpid (); | 
|  |  | 
|  | pthread_t thr; | 
|  | int ret = pthread_create (&thr, NULL, pid_thread, NULL); | 
|  | if (ret) | 
|  | { | 
|  | printf ("pthread_create failed: %d\n", ret); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | void *thr_ret; | 
|  | ret = pthread_join (thr, &thr_ret); | 
|  | if (ret) | 
|  | { | 
|  | printf ("pthread_create failed: %d\n", ret); | 
|  | return 1; | 
|  | } | 
|  | else if (thr_ret) | 
|  | { | 
|  | printf ("thread getpid failed\n"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | pid_t child = fork (); | 
|  | if (child == -1) | 
|  | { | 
|  | printf ("fork failed: %m\n"); | 
|  | return 1; | 
|  | } | 
|  | else if (child == 0) | 
|  | { | 
|  | if (pid == getpid ()) | 
|  | { | 
|  | puts ("pid did not change after fork"); | 
|  | exit (1); | 
|  | } | 
|  |  | 
|  | pid = getpid (); | 
|  | ret = pthread_create (&thr, NULL, pid_thread, NULL); | 
|  | if (ret) | 
|  | { | 
|  | printf ("pthread_create failed: %d\n", ret); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | ret = pthread_join (thr, &thr_ret); | 
|  | if (ret) | 
|  | { | 
|  | printf ("pthread_create failed: %d\n", ret); | 
|  | return 1; | 
|  | } | 
|  | else if (thr_ret) | 
|  | { | 
|  | printf ("thread getpid failed\n"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | int status; | 
|  | if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child) | 
|  | { | 
|  | puts ("waitpid failed"); | 
|  | kill (child, SIGKILL); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (!WIFEXITED (status)) | 
|  | { | 
|  | if (WIFSIGNALED (status)) | 
|  | printf ("died from signal %s\n", strsignal (WTERMSIG (status))); | 
|  | else | 
|  | puts ("did not terminate correctly"); | 
|  | return 1; | 
|  | } | 
|  | if (WEXITSTATUS (status) != 0) | 
|  | { | 
|  | printf ("exit code %d\n", WEXITSTATUS (status)); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #include "../test-skeleton.c" |