#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#define MAX_COUNT 50
#define True       1
#define False      0

typedef void (*SignalHandler)(int);

int NewSig = False ;

void mySigHandler(int signo)
{
  NewSig = True ;
}

int main()
{
  int pid               ;
  int count = MAX_COUNT ;
  
  if (sigset(SIGUSR1, mySigHandler) == SIG_ERR)
  {
    perror("Signal handler not installed!");
    exit(1);
  }
  
  switch (pid = fork())
  {
    case -1: // error
      perror("Fork failed! ");
      exit(1);
       
    case  0: // Child
      while (count --)
      {
        fprintf(stdout, "Child executing loop #%2d, ", count);
        fflush(stdout);
        kill(getppid(), SIGUSR1); // signal parent's turn ...
        do { sleep(1); } while (!NewSig);
        NewSig = False ;
      }
      break ;
    
    default:
      while (count--)
      {
        do { sleep(1); } while (!NewSig);
        NewSig = False ;
        fprintf(stdout, "Parent executing loop #%2d\n", count);
        fflush(stdout);
        kill(pid, SIGUSR1); // signal child's turn ...
      }
  }

  return 0 ;
}

