/**************************************/
/*                                    */
/*  Prof. Dr. Carsten Vogt            */
/*  Fachhochschule Koeln              */
/*  Fakultaet 07, Nachrichtentechnik  */
/*  http://www.nt.fh-koeln.de/vogt    */
/*                                    */
/*  UNIX-C-Schnittstelle:             */
/*  Signale mit kill(), pause()       */
/*  und sigaction()                   */
/*                                    */
/**************************************/

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>

/* Die Funktion sighand() ist ein "Signalhandler", der
   ausgefuehrt wird, wenn bei einem Prozess ein bestimmtes
   Signal eintrifft. Dazu muss die Funktion zuvor durch
   einen sigaction()-Aufruf an dieses Signal "gebunden" werden,
   also fuer diesen Prozess und dieses Signal registriert
   werden (siehe Hauptprogramm).
   Trifft ein Signal ein, an das der Prozess keinen Signal-
   handler gebunden hat, so wird der Prozess durch das Signal
   terminiert ("abgeschossen"). */
   
void sighand() {

 /* Testausgabe */
 printf("Signal eingetroffen\n\n");

}

/* Hauptprogramm */

main() {

  int sohn_pid;

  /* Bindung des Signalhandlers an das Signal SIGUSR1.
     SIGUSR1 ist ein Signal, was Programmierer frei benutzen
     koennen; die meisten anderen Signale werden vom BS-Kern
     verwendet. */

  struct sigaction sigact;

  sigact.sa_handler = sighand;
  sigemptyset(&sigact.sa_mask);
  sigact.sa_flags = 0;

  sigaction(SIGUSR1,&sigact,NULL);

  printf("\n");

  if ((sohn_pid=fork())==0 ) {

    printf("Sohn wartet auf Signal.\n\n");
    pause(); /* Sohn wartet auf Signal */
    printf("Sohn laeuft weiter.\n\n");
    printf("Sohn wartet nochmals auf Signal.\n\n");
    pause();
    printf("Sohn laeuft zuende.\n\n");
    exit(0);

  }

  printf("Vater tut etwas anderes.\n\n");

  sleep(2);  /* Vater wartet zwei Sekunden */

  printf("Vater schickt Signal an Sohn.\n\n");
  kill(sohn_pid,SIGUSR1); /* Signal an Sohn */

  sleep(2);  /* Vater wartet nochmals zwei Sekunden */

  printf("Vater schickt nochmals Signal an Sohn.\n\n");
  kill(sohn_pid,SIGUSR1);

}

