#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>

#define MAX_CNT 100

int fd[2];
int target_pid;
int status;
int cnt;


void SigHndlr(int s)
{

        /* в обработчике сигнала происходит и чтение, и запись */
	signal(SIGUSR1, SigHndlr);


     if (cnt < MAX_CNT)
	{
		read(fd[0], &cnt, sizeof(int));
		 printf("%d \n", cnt);
		  cnt++;
		write(fd[1], &cnt, sizeof(int));
                /* посылаем сигнал второму: пора читать из канала */
		kill(target_pid, SIGUSR1);
	}
     else
	 if (target_pid == getppid())
		{
                   /* условие окончания игры проверяется потомком */
                   printf("Child is going to be terminated\n");
		   close(fd[1]); close(fd[0]);

                   /* завершается потомок */
		  exit(0);
		}
         else
          kill(target_pid, SIGUSR1);
}











// ------------------------- MAIN ---------------------------
int main(int argc, char **argv)
{


 int cnt;


	pipe(fd); /* организован канал */
	signal (SIGUSR1, SigHndlr); /* установлен обработчик сигнала для обоих процессов */

	cnt = 0;

     if (target_pid = fork())
	{
                /* Предку остается только ждать завершения потомка */
		wait(&status);

                printf("Parent is going to be terminated\n");
	       close(fd[1]); close(fd[0]);

	    return 0;
	}
	else
	{

		target_pid = getppid();

  		write(fd[1], &cnt, sizeof(int));
		kill(target_pid, SIGUSR1);

	      	for(;;); /* бесконечный цикл */
	}
}

