| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | #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 intdo_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"
 |