#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>


int delay;

pid_t pid, fpid, ppid, mpid;


// tratador para o sinal
void trata2 (int sinal);

void trata1(int sinal);


int main(int argc, char *argv[]){

	if (argc==1) { 
		printf ("\nDuh! Passe o intervalo entre os ping-pongs, sua puta...\n");
		exit(1);
	} else if (argc>2) {
		printf("\nDã! Entre com somente um valor, seu viado!!!\n");
		exit(1);
	}
       	
	delay = atoi (argv[1]);
	if (((delay % 1)!= 0) ||(delay<0) ) {
		printf ("\n%s\n", delay);
		printf ("\nPoh tchê, coloque um inteiro >= 0\n");
		exit(1);
	}
	

	pid = getpid();
	signal(SIGUSR2, trata2 );
	fpid = fork ();
	
	if (!fpid) {		
		//código do filho
		signal(SIGUSR1, trata1);
		mpid = getpid();		
		ppid = getppid();		
		kill(ppid, SIGUSR2);
                printf("\n%d : Ping", mpid);

		for(;;);
		exit(0);
	} else if (fpid == -1) {
		printf("\nHoly Shit... falha ao criar filho,\n");
		exit(1);
	}
	
	
	//tirar esse sleep e utilizar um meio mais inteligente de garantir ordem de execução. Tentar com semáforos do IPC (semáforo começa bloqueado e filho incrementa para o pai poder executar.)
	for (;;);
	exit(0);
}

void trata1 (int sinal){
	signal(SIGUSR1, trata1);
	sleep(delay);
	kill(ppid, SIGUSR2);
	printf("\n%d : Ping", mpid);
}


void trata2(int sinal){
	signal (SIGUSR2, trata2);
	printf("\n%d : Pong", pid);
	kill(fpid, SIGUSR1);
};



