/* 
   Fájlnév: processz-terminalodasok.c
   Processzek terminálódása normálisan az exit(), _exit() rendszerhívásokkal
   történhet, ill. a kifejezett exit() hívás hiányában akkor, amikor a vezérlés
   eléri a main() végét. 
   Az abort() rendszerhívás is terminál, de az SIGABRT szignál generálással 
   és kézbesítéssel. 
   Más szignálok, akár saját maga a processz generálja azokat, akár más
   processz, alapértelmezéses kezelőjükkel szintén terminálnak. 
   Ez a példaprogram a különböző terminálódásokat mutatja be, A pr_exit() 
   függvény (lásd a lib jegyzékben) terminálódási státusokat elemzi.
   A példában látunk normális exit()-es befejezést, abort()-os befejezést, 
   túlcsordulás esemény szignálozása miatti terminálódást. 
   Készítő: dr. Vadász Dénes
   Dátum: 2005. október
*/

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

int
main(void)
{
	pid_t	pid;
	int	status;

	if ( (pid = fork()) < 0)  perror("fork hiba");
	else if (pid == 0)	/* Az 1. gyermek */
		exit(7);	/* befejeződik   */
	if (wait(&status) != pid) perror("wait hiba");
	pr_exit(status);	
	/* Megvárjuk az 1. gyermek befejeződését
	   és kiíratjuk befejeződési állapotát */

	if ( (pid = fork()) < 0)  perror("fork hiba");
	else if (pid == 0)	/* A 2. gyermek 	    */
		abort();	/* SIGABRT szignált generál */
	if (wait(&status) != pid) perror("wait hiba");
	pr_exit(status);
	/* Megvárjuk a 2. gyermek befejeződését
	   és kiíratjuk a befejezést okozó szignál sorszámát (6) */

	if ( (pid = fork()) < 0)  perror("fork hiba");
	else if (pid == 0)	/* A 3. gyermek          */
		status /= 0;	/* túlcsordulás esemény: SIGFPE */
	if (wait(&status) != pid) perror("wait hiba");
	pr_exit(status);
	/* Megvárjuk a 3. gyermek befejeződését
	   és kiíratjuk a befejezést okozó szignál sorszámát (8) */

	exit(0);
}
/* Az eredmény ilyesmi:

Normális befejeződés, visszaadott érték = 7
Abnormális befejezés, a szignál sorszám = 6
Abnormális befejezés, a szignál sorszám = 8

*/

