#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>


static volatile sig_atomic_t sflag;
static sigset_t signal_neu, signal_alt, signal_leer;

static void sigfunc(int sig_nr)
{
  fprintf(stderr, "SIGPIPE erhalten. Programmabbruch...\n");
  exit(0);
}

void signal_pipe(void)
{
  if(signal(SIGPIPE, sigfunc) == SIG_ERR)
   {
      fprintf(stderr, "Konnte Signal SIGPIPE nicht erzeugen..........\n");
      exit(0);
    }
/*Wir entfernen alle Signale aus der Signalmenge*/
  sigemptyset(&signal_leer);
  sigemptyset(&signal_neu);
  sigaddset(&signal_neu, SIGPIPE);
/*Jetzt setzen wir signal_neu und sichern die*/
/* noch aktuelle Signalmaske in signal_alt*/
  if(sigprocmask(SIG_UNBLOCK, &signal_neu, &signal_alt) < 0)
    exit(0);
}


int main()
{
  int r_fifo, w_fifo; /*handle for FIFO*/

  char puffer[]="This text is for the fifo\n";
  char buf[100];
  pid_t pid;

  signal_pipe();

  unlink("/tmp/fifo0001.1");
/*We create a FIFO*/

  if((mkfifo("/tmp/fifo0001.1", O_RDWR)) == -1)
   {
     fprintf(stderr, "Can't creat a fifo.........\n");
     exit(0);
   }

  pid=fork();
  if(pid == -1)
     { perror("fork"); exit(0);}
  else if(pid > 0) /*Elternprozess ließt aus der FIFO*/
    {
      if (( r_fifo=open("/tmp/fifo0001.1", O_RDONLY)) < 0)
        { perror("r_fifo open"); exit(0); }
      while(wait(NULL)!=pid); /*Wir warten auf das Ende vom Kindprozess*/
      read(r_fifo, &buf, sizeof(buf)); /*Lesen aus der FIFO*/
      printf("%s\n",buf);
      close(r_fifo);
    }
  else /*Kindprozess schreibt in die FIFO*/
    {
      if((w_fifo=open("/tmp/fifo0001.1", O_WRONLY)) < 0)
          { perror("w_fifo open"); exit(0); }
      write(w_fifo, puffer, strlen(puffer)); /*Schreiben in die FIFO*/
      close(w_fifo); /*EOF*/
      exit(0);
    }
  return 0;
}