1/* This testcase is part of GDB, the GNU debugger. 2 3 Copyright 2016-2020 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18#include <stdio.h> 19#include <stdlib.h> 20#include <unistd.h> 21#include <assert.h> 22#include <sys/wait.h> 23 24int fds[2] = { -1, -1 }; 25 26static void 27grandparent_done (void) 28{ 29} 30 31/* The exp file overrides this in order to test both fork and 32 vfork. */ 33#ifndef FORK 34#define FORK fork 35#endif 36 37int 38main (void) 39{ 40 int pid; 41 int nbytes; 42 const char string[] = "Hello, world!\n"; 43 char readbuffer[80]; 44 45 /* Don't run forever. */ 46 alarm (300); 47 48 /* Create a pipe. The write side will be inherited all the way to 49 the grandchild. The grandparent will read this, expecting to see 50 EOF (meaning the grandchild closed the pipe). */ 51 pipe (fds); 52 53 pid = FORK (); 54 if (pid < 0) 55 { 56 perror ("fork"); 57 exit (1); 58 } 59 else if (pid == 0) 60 { 61 /* Close input side of pipe. */ 62 close (fds[0]); 63 64 pid = FORK (); 65 if (pid == 0) 66 { 67 printf ("I'm the grandchild!\n"); 68 69 /* Don't explicitly close the pipe. If GDB fails to kill 70 this process, then the grandparent will hang in the pipe 71 read below. */ 72#if 0 73 close (fds[1]); 74#endif 75 while (1) 76 sleep (1); 77 } 78 else 79 { 80 close (fds[1]); 81 printf ("I'm the proud parent of child #%d!\n", pid); 82 wait (NULL); 83 } 84 } 85 else if (pid > 0) 86 { 87 close (fds[1]); 88 printf ("I'm the proud parent of child #%d!\n", pid); 89 nbytes = read (fds[0], readbuffer, sizeof (readbuffer)); 90 assert (nbytes == 0); 91 printf ("read returned nbytes=%d\n", nbytes); 92 wait (NULL); 93 94 grandparent_done (); 95 } 96 97 return 0; 98} 99