#include #include #include #include #include #include #include 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"