#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

void usr1_handler( int sig_num )
{

  printf( "Rodzic (%d) otrzymal sygnal SIGUSR1\n", getpid() );

}

int main()
{
  pid_t ret;
  int   status;
  int   role = -1;

  ret = fork();
  if (ret > 0) {		
    printf( "Rodzic: to jest proces macierzysty (pid %d)\n", 
             getpid() );
    signal( SIGUSR1, usr1_handler );
    role = 0;
    pause();
    printf( "Rodzic: czekam na zakonczenie potomka\n" );
    ret = wait( &status );
  } 
  else if (ret == 0) {	
    printf( "Potomek: to jest proces potomny (pid %d)\n", 
             getpid() );
    role = 1;
    sleep( 1 );
    printf( "Potomek: Wysylam SIGUSR1 do pid %d\n", getppid() );
    kill( getppid(), SIGUSR1 );
    sleep( 2 );

  } 
  else {			
    printf( "Rodzic: Blad podczas proby wykonania fork() (%d)\n", errno );

  }

  printf( "%s: Koncze ...\n", 
           ((role == 0) ? "Rodzic" : "Potomek") );

  return 0;
}


