#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


long real_sec = 0, virtual_sec = 0, prof_sec = 0;

void real_handler(int);
void virtual_handler(int);
void prof_handler(int);

int main(){
	struct itimerval real, virtual, prof;
	long i;
	int pids[filhos];

	//seta o valor para qual o timer será setado quando chegar a 0
        real.it_interval.tv_sec = 1;
        real.it_interval.tv_usec = 0;
	virtual.it_interval.tv_sec = 1;
	virtual.it_interval.tv_usec = 0;
	prof.it_interval.tv_sec = 1;
	prof.it_interval.tv_usec = 0;
		
        //determina o valor de início do timer
        real.it_value.tv_sec = 1;
        real.it_value.tv_usec = 0;
	virtual.it_value.tv_sec = 1;
	virtual.it_value.tv_usec = 0;
	prof.it_value.tv_sec = 1;
	prof.it_value.tv_usec = 0;

        //seta tratador para o sinal do real
        signal(SIGALRM, real_handler);

	//seta o tratador para o sinal do virtual
	signal(SIGVTALRM,virtual_handler);

	//seta o tratador para o sinal do prof
	signal(SIGPROF,prof_handler);

        //para gerar sinal de acordo com a estrutura time
        setitimer(ITIMER_REAL, &real, NULL);
	setitimer(ITIMER_VIRTUAL, &virtual, NULL);
	setitimer(ITIMER_PROF, &prof, NULL);

        for( i = 0; i< 999999999; i++);
        for( i = 0; i< 999999999; i++);
        for( i = 0; i< 999999999; i++);
        for( i = 0; i< 999999999; i++);
	

        //recebe o que falta para gerar o próximo sinal para o real
        getitimer(ITIMER_REAL, &real);
	//recebe o que falta para gerar o próximo sinal para o virtual
	getitimer(ITIMER_VIRTUAL, &virtual);
	//recebe o que falta para gerar o próximo sinal para o prof
	getitimer(ITIMER_PROF, &prof);

	printf("Tempo real de execução: %ds:%dus\n", real_sec, 1000000 - real.it_value.tv_usec );

	printf("Tempo em espaço de usuário: %ds:%dus\n", virtual_sec, 1000000 - virtual.it_value.tv_usec);

	printf("Tempo em espaço de kernel: %ds:%dus\n", prof_sec - virtual_sec, (1000000 - prof.it_value.tv_usec) - (1000000 - virtual.it_value.tv_usec));
	printf("Tempo de uso da CPU : %ds:%dus\n", prof_sec, 1000000 - prof.it_value.tv_usec);

	
}

void real_handler(int sig){
        signal(SIGALRM, real_handler);
        real_sec++;
}

void virtual_handler(int sig){
	signal(SIGVTALRM,virtual_handler);
	virtual_sec++;
}

void prof_handler(int sig){
	signal(SIGPROF,prof_handler);
	prof_sec++;
}



