1 /* 2 * Copyright 2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <errno.h> 8 #include <stdio.h> 9 #include <string.h> 10 #include <sys/wait.h> 11 #include <unistd.h> 12 13 14 /*! 15 waitpid() should wait only once. 16 */ 17 18 19 int 20 child2() 21 { 22 printf("child 2 1. parent id = %ld\n", getppid()); 23 sleep(2); 24 printf("child 2 2. parent id = %ld\n", getppid()); 25 return 2; 26 } 27 28 29 //! exits before child 2 30 int 31 child1() 32 { 33 printf("child 1 process group: %ld\n", getpgrp()); 34 35 pid_t child = fork(); 36 if (child == 0) 37 return child2(); 38 39 sleep(1); 40 return 1; 41 } 42 43 44 int 45 main() 46 { 47 printf("main process group: %ld\n", getpgrp()); 48 pid_t child = fork(); 49 if (child == 0) 50 return child1(); 51 52 pid_t pid; 53 do { 54 int childStatus = -1; 55 pid = waitpid(0, &childStatus, 0); 56 printf("waitpid() returned %ld (%s), child status %d\n", pid, strerror(errno), childStatus); 57 } while (pid >= 0); 58 59 return 0; 60 } 61 62