(root)/
glibc-2.38/
sysdeps/
pthread/
tst-fork2.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  tf (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  int
      44  main (void)
      45  {
      46    initial_pid = getpid ();
      47  
      48    pid_t child = fork ();
      49    if (child == 0)
      50      {
      51        if (getppid () != initial_pid)
      52  	{
      53  	  printf ("first getppid returned %ld, expected %ld\n",
      54  		  (long int) getppid (), (long int) initial_pid);
      55  	  exit (1);
      56  	}
      57  
      58        pthread_t th;
      59        if (pthread_create (&th, NULL, tf, NULL) != 0)
      60  	{
      61  	  puts ("pthread_create failed");
      62  	  exit (1);
      63  	}
      64  
      65        void *result;
      66        if (pthread_join (th, &result) != 0)
      67  	{
      68  	  puts ("pthread_join failed");
      69  	  exit  (1);
      70  	}
      71  
      72        exit (result == NULL ? 0 : 1);
      73      }
      74    else if (child == -1)
      75      {
      76        puts ("initial fork failed");
      77        return 1;
      78      }
      79  
      80    int status;
      81    if (TEMP_FAILURE_RETRY (waitpid (child, &status, 0)) != child)
      82      {
      83        printf ("waitpid failed: %m\n");
      84        return 1;
      85      }
      86  
      87    return status;
      88  }