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

void sig_alrm(int signo)
{
	printf("RING!!!\n");
	return;
}

void f1(int nsecs)
{
	alarm(nsecs);
	pause(); 
}


int main(){
    pid_t pid, childpid;
    int status;
    
    pid = fork(); 
    switch(pid)
    {
        case -1:
			perror("fork error\n");
        	printf("errno value= %d\n", errno); 
			exit(EXIT_FAILURE); 
            
        case 0: 
            printf("Soy el Hijo, mi PID es %d y el PPID de mi padre es %d \n", getpid(), getppid()); 
            exit(EXIT_SUCCESS);
            
        default: 
            printf("Soy el Padre, mi PID es %d, el PID de mi hijo es %d, y el PPID de mi padre es %d\n", getpid(), pid, getppid());
			
            while ( (childpid=wait(&status)) > 0 ) 
			{
				if (WIFEXITED(status)) 
				{
					printf("Proceso padre %d, hijo con PID %ld finalizado, status = %d\n", getpid(), (long int)childpid, WEXITSTATUS(status));
				} 
				else if (WIFSIGNALED(status)) 
				{
					printf("Proceso padre %d, hijo con PID %ld finalizado al recibir la señal %d\n", getpid(), (long int)childpid, WTERMSIG(status));
				} 
			}

			if (childpid==(pid_t)-1 && errno==ECHILD)
			{
				printf("Proceso padre %d, no hay mas hijos que esperar. Valor de errno = %d, definido como: %s\n", getpid(), errno, strerror(errno));
			}	
			else
			{
				printf("Error en la invocacion de wait o waitpid. Valor de errno = %d, definido como: %s\n", errno, strerror(errno));
				exit(EXIT_FAILURE);
			}
            exit(EXIT_SUCCESS); 
    }
}