#include <sys/signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void
abort(void)	/* POSIX-stílusú abort() függvény.
		   Nem szabad ignorálni, 
		   nem szabad kezelését átvenni,
		   nem szabad blokkolni. */
{
	sigset_t		mask;
	struct sigaction	action;

	/* A hívó nem ignorálhatja a SIGABRT-ot, legyen default  */
	sigaction(SIGABRT, NULL, &action);  /* Vajon mi a pillanatnyi kezelője? */
	if (action.sa_handler == SIG_IGN) { /* és ha ignorált, */
		action.sa_handler = SIG_DFL;/* vissza a default kezelőt! */
		sigaction(SIGABRT, &action, NULL);
	}

	if (action.sa_handler == SIG_DFL)
		fflush(NULL);		/* Nyitott adatfolyamokat ki!*/

		/* Nem szabad blokkolni,  nézzük, ez teljesül-e!*/
	sigfillset(&mask); /* Minden szignál a készletbe ... */
	sigdelset(&mask, SIGABRT);	/* csak a SIGABRT ki belőle. */
	sigprocmask(SIG_SETMASK, &mask, NULL); /* A blokkoltak azok legyenek, 
						  amik a mask-ban vannak ... */

	kill(getpid(), SIGABRT);	/* Magunknak a SIGABRT */

		/* Hm, ha itt vagyunk, csak kezelte valami a szignált. */
	fflush(NULL);			/* Nyitott adatfolyamokat ki!*/

	action.sa_handler = SIG_DFL;	/* Legyen végre az alapértelmezés */
	sigaction(SIGABRT, &action, NULL);	/* visszaállítva. */

	kill(getpid(), SIGABRT);	/* és megegyszer küldjük magunknak ... */

	exit(1);	/* Ide a vezérlés nem juthat el! */
}
/* A sigfillset( ), sigemptyset( ), sigdelset( ), sigaddset( ) hívásokkal 
   egy sigset_t típusú szignálkészletet állíthatunk össze. 
   A készletbe bevehetünk minden szignált, egyenként tehetünk bele, 
   vehetünk ki szignálokat. Telejesen kiüríthetjük a készletet.
   
   A sigprocmask( ) hívással előírhatjuk, mely szignálok legyenek ezentúl 
   blokkoltak. Második argumentuma az input készlet, harmadik pedig az 
   Ha első argumentuma a SIG_SETMASK makró, akkor amik az input készletben 
   vannak, azok lesznek blokkoltak. SIG_BLOCK makróval az input és a 
   pillanatnyi unióját kívánjuk blokkolni. SIG_UNBLOCK makróval az input
   készlet szignáljait kivesszük a blokkolandók közül. 
*/
