(root)/
glibc-2.38/
sysdeps/
pthread/
tst-fork3.c
       1  /* Copyright (C) 2002-2023 Free Software Foundation, Inc.
       2     This file is part of the GNU C Library.
       3  
       4     The GNU C Library is free software; you can redistribute it and/or
       5     modify it under the terms of the GNU Lesser General Public
       6     License as published by the Free Software Foundation; either
       7     version 2.1 of the License, or (at your option) any later version.
       8  
       9     The GNU C Library is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      12     Lesser General Public License for more details.
      13  
      14     You should have received a copy of the GNU Lesser General Public
      15     License along with the GNU C Library; if not, see
      16     <https://www.gnu.org/licenses/>.  */
      17  
      18  #include <errno.h>
      19  #include <pthread.h>
      20  #include <stdio.h>
      21  #include <stdlib.h>
      22  #include <unistd.h>
      23  #include <sys/wait.h>
      24  
      25  
      26  static pid_t initial_pid;
      27  
      28  
      29  static void *
      30  tf2 (void *arg)
      31  {
      32    if (getppid () != initial_pid)
      33      {
      34        printf ("getppid in thread returned %ld, expected %ld\n",
      35  	      (long int) getppid (), (long int) initial_pid);
      36        return (void *) -1;
      37      }
      38  
      39    return NULL;
      40  }
      41  
      42  
      43  static void *
      44  tf1 (void *arg)
      45  {
      46    pid_t child = fork ();
      47    if (child == 0)
      48      {
      49        if (getppid () != initial_pid)
      50  	{
      51  	  printf ("first getppid returned %ld, expected %ld\n",
      52  		  (long int) getppid (), (long int) initial_pid);
      53  	  exit (1);
      54  	}
      55  
      56        pthread_t th2;
      57        if (pthread_create (&th2, NULL, tf2, NULL) != 0)
      58  	{
      59  	  puts ("child: pthread_create failed");
      60  	  exit (1);
      61  	}
      62  
      63        void *result;
      64        if (pthread_join (th2, &result) != 0)
      65  	{
      66  	  puts ("pthread_join failed");
      67  	  exit  (1);
      68  	}
      69  
      70        exit (result == NULL ? 0 : 1);
      71      }
      72    else if (child == -1)
      73      {
      74        puts ("initial fork failed");
      75        exit (1);
      76      }
      77  
      78    int status;
      79    if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child)
      80      {
      81        printf ("waitpid failed: %m\n");
      82        exit (1);
      83      }
      84  
      85    exit (status);
      86  }
      87  
      88  
      89  static int
      90  do_test (void)
      91  {
      92    initial_pid = getpid ();
      93  
      94    pthread_t th1;
      95    if (pthread_create (&th1, NULL, tf1, NULL) != 0)
      96      {
      97        puts ("parent: pthread_create failed");
      98        exit (1);
      99      }
     100  
     101    /* This call should never return.  */
     102    pthread_join (th1, NULL);
     103  
     104    return 1;
     105  }
     106  
     107  #include <support/test-driver.c>