#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/times.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
/*Este programa tiene diferentes opciones de ejecucion (switch),
1._Tiempo de ejecucion de la funcion alarm()
ejecuta la opcion alarm por la cantidad de seg q usuario ingresò
2._Tiempo de ejecucion en un programa cualquiera + nombre_del programa
ejecuta cualquier programa o comando y contabiliza su tiempo hasta q deje de ejecutarse dicho programa Nota: el unico argumento q recibe dicha funcion es el nombre del comando sin argumentos, para er una version con argumentos ver Contabilidad-0_2.c
3._Salir
Sale del programa
*/
char prog[20];//esta cadena la necesito en Anyprogram()
int AlarmAccounting()
{
struct tms tms_Init, tms_End;//estructura definida en times.h
/*
struct tms
{
clock_t tms_utime; User CPU time.
clock_t tms_stime; System CPU time.
clock_t tms_cutime; User CPU time of dead children.
clock_t tms_cstime; System CPU time of dead children.
};
*/
clock_t init_Time;
clock_t end_Time;
long enSeg= sysconf(_SC_CLK_TCK);//asigno los intervalos en segundos del reloj
//pa luego hacer la conversion
//iniicio el conteo
init_Time= times(&tms_Init);
Alarm();
wait(NULL);//busca pa q sirve wait!, supongo q es para parar hasta q el proceso termine y saltar al programa Contabilidad
//termino el conteo
end_Time= times(&tms_End);
printf ("Tiempo en ejecucion + tardanza en digitar el dato: %0.3f\n", (float)(end_Time - init_Time)/enSeg);//%f float en notacion decimal
printf ("User CPU time: %0.15f\n", (float)(tms_End.tms_utime - tms_Init.tms_utime)/enSeg);
printf ("Tiempo de sistema: %0.15f\n", (float)(tms_End.tms_stime - tms_Init.tms_stime)/enSeg);
printf ("Tiempo de usuario mientras mueren los hijos : %0.15f\n", (float)(tms_End.tms_cutime - tms_Init.tms_cutime)/enSeg);
printf ("Tiempo de sistema mientras mueren los hijos : %0.15f\n", (float)(tms_End.tms_cstime - tms_Init.tms_cstime)/enSeg);
return 0;
}
void trapper(int sig)//ayuda pa Program
{
signal(sig, trapper);
printf("\nMENSAJE!: funcion alarm()\n\n");
}
int Alarm(void)//este programa solo muestra gran cambio en Tiempo Real
{
/*********************************************************************
Nota: este metodo demora lo q el usuario se demora en digitar el tiempo
de espera para alarm() mas lo q demora dicha funcion.
***********************************************************************/
int i, o;
signal(14, trapper);
//printf("El PID del proceso es : %d\n", getpid() );
printf("digite el tiempo de espera para la funcion alarm(): ");
scanf("%d",&o);
//for(i=0;i<=3;i++)
//{
alarm(o);
pause();
//}
return 0;
}
int AnyProgram( /*char prog[]*/)
{
/*Nota:
si en la linea de arriba pongo char prog[]; <--Ojo tiene punto y coma
en la linea de abajo debo poner &prog para q lo muestre en pantalla
*/
printf("Digite el programa a ejecutar: ");
scanf("%s",&prog);
printf("El programa a ejecutar es: %s\n",prog); //imprime el programa a ejecutar
struct tms tms_Init, tms_End;
clock_t init_Time, end_Time;
long enSeg;
/* obtiene el número de int. De reloj por segundo */
enSeg= sysconf(_SC_CLK_TCK);
init_Time= times(&tms_Init);
// aqui va el codigo del programa a ejecutar
char path[20]="/usr/bin";
if (fork()==0)
{//execvp(argv[1], &argv[1]);
// Hace lo mismo q la ultima opcion q està en comentarios en este ciclo (La ultima)
execvp(prog, NULL);
perror("error ejecutando el programa");
return 1;
}
wait(NULL);
end_Time= times(&tms_End);
printf ("\nTiempo en ejecucion: %0.3f\n", (float)(end_Time - init_Time)/enSeg);//%f float en notacion decimal
printf ("User CPU time: %0.15f\n", (float)(tms_End.tms_utime - tms_Init.tms_utime)/enSeg);
printf ("Tiempo de sistema: %0.15f\n", (float)(tms_End.tms_stime - tms_Init.tms_stime)/enSeg);
printf ("Tiempo de usuario mientras mueren los hijos : %0.15f\n", (float)(tms_End.tms_cutime - tms_Init.tms_cutime)/enSeg);
printf ("Tiempo de sistema mientras mueren los hijos : %0.15f\n", (float)(tms_End.tms_cstime - tms_Init.tms_cstime)/enSeg);
return 0;
}
int main()
{
int opcion=0;
printf("\n");
printf("-----Contabilidad version 0.2------\n");
printf("1._Tiempo de ejecucion de la funcion alarm()\n");
printf("2._Tiempo de ejecucion en un programa cualquiera \n");
printf("3._Salir\n");
printf("\n");
do { printf("digite su opcion [1-3]...: ");
scanf("%d",&opcion);
}while((opcion<0)||(opcion>3));
switch(opcion)
{
case 1:AlarmAccounting();
break;
case 2:
/* scanf("%s",&prog);
printf("%s",&prog);//esto no debe cambiarse de posicion
*/
AnyProgram( /*prog*/);
break;
case 3:
return 0;
}
return 0;
}