/*
   Fájlnév: processz-terminalodas-2.c
   Példa arra, hogy mi történik terminálódó processz gyermekeivel. 
   A processz - ami nem viszonyvezető processz - fork() hívással készít 
   gyermek processzt (1. gyermek), majd ez az 1. gyermek egy további 
   gyermeket (2. gyermek).  
   Az 1. gyermek hamarabb terminálódik, mint a második. A 2. gyermeknek a 
   szülője erre az init processz lesz. 
   Készítette: dr. Vadász Dénes
   Dátum: 2005. október
*/

#include	<sys/types.h>
#include	<sys/wait.h>
#include	<stdio.h>
#include	<stdlib.h>
#include	<unistd.h>

int
main(void)
{
	pid_t	pid;
				  /* Az eredeti szülő indul */
	if ( (pid = fork()) < 0) perror("1.fork hiba");
	else if (pid == 0) {	  /* Az 1. gyermek */
	
		if ( (pid = fork()) < 0) perror("2.fork hiba");
		else if (pid > 0) /* A 2.gyermek szülője = az 1. gyermek */
			exit(0);  /* az 1. gyermek befejeződik. */

		sleep(2);         /*Itt a 2. gyermek fut. Kicsit vár
				    hogy a valódi szülője biztosan kilépjen */
		printf("A 2. gyermek, szülőm pid-je = %d\n", getppid());
		exit(0);
	}			  /* Itt az eredeti szülő fut. */

	if (waitpid(pid, NULL, 0) != pid) perror("waitpid hiba");
	/* Az eredeti szülő az 1. gyermek terminálódására vár */

	exit(0);
}
/*
  A futtatás eredménye ez lesz:
A 2. gyermek, szülőm pid-je = 1

*/
