En este capítulo se revisará como se puede usar el reloj con llamadas al sistema UNIX.
Existen muchas funciones para el tiempo que las que serán consideradas aquí -- usar las páginas de man y los listados de la biblioteca estándar de funciones para más detalles.
El uso más común de las funciones de tiempo son:
- conocer el tiempo,
- tomar el tiempo a programas y funciones y
- poner valores a semillas.
Algunas prototipos de las funciones básicas para el tiempo son las siguientes:
- time_t time(time_t *t) -- devuelve el tiempo transcurrido, medido en segundos desde ``la época'' 0 horas, 0 minutos, 0 segundos, tiempo universal coordinado (GMT) del 1^o de enero de 1970. Esta medida se llama el ``tiempo de calendario''. Si
t no es nulo, el valor devuelto también se guarda en la zona de memoria a la que apunta t. En caso de error, se devuelve ((time_t)-1) y se asigna a la variable errno un valor apropiado.
- ftime(struct timeb *pt) -- devuelve la hora y la fecha actuales en
pt, que esta declarada en <sys/timeb.h> como sigue:
struct timeb
{
time_t time; /* Segundos desde epoca, igual que `time'. */
unsigned short int millitm; /* millisegundos adicionales. */
short int timezone; /* Tiempo local medido en minutos oeste de GMT.*/
short int dstflag; /* No cero si se usa horario de verano */
};
En caso de éxito, se devuelve el tiempo transcurrido en segundos desde la época. En caso de error, se devuelve ((time_t)-1) y se asigna a la variable errno un valor apropiado.
- char *ctime(time_t *timep) -- toma un argumento de tipo
time_t (long integer) que representa el tiempo de calendadrio y lo convierte a una cadena de 26 caracteres de la forma producida por la función asctime(). En primer lugar descompone los segundos a una estructura tm llamando a localtime(), y entonces llama a asctime() para convertir la estructura tm a una cadena.
- char *asctime(const struct tm *timeptr) -- convierte un valor de tiempo contenido en una estructura
tm a una cadena de 26 caracteres de la forma:
ddd mmm dd hh:mm:ss aaaa
La función asctime() regresa un apuntador a la cadena.
Como se menciono previamente, básicamente existen tres posibles usos de las funciones de tiempo.
Este es un ejemplo sencillo que ilustra las llamadas a la función tiempo en distintos momentos:
/* timer.c */
#include <stdio.h>
#include <sys/types.h>
#include <time.h>
main()
{
int i,j;
time_t t1,t2;
(void) time(&t1);
for (i=1; i<=300; ++i)
{
printf("%d %d %d\n",i, i*i, i*i*i );
for(j=0; j<1000000; j++); /* Un pequeño retardo */
}
(void) time(&t2);
printf("\n Tiempo para hacer 300 cuadrados y cubos = %d segundos\n",
(int) t2-t1);
}
Se ha visto un ejemplo similar previamente, en esta ocasión se usa la función lrand48() para generar una secuencia de números:
/* random.c */
#include <stdio.h>
#include <sys/types.h>
#include <time.h>
main()
{
int i;
time_t t1;
(void) time(&t1);
srand48((long) t1);
/* usar time en segundos para poner la semilla */
printf("5 numeros aleatorios (semilla = %d):\n",(int) t1);
for (i=0;i<5;++i)
printf("%d ", lrand48());
printf("\n\n");
}
La función lrand48() devuelve enteros largos no negativos distribuidos uniformememnte entre 0 y .
Una función similar es la función drand48 que regresa números de doble precisión en el rango .
srand48() pone el valor de la semilla para estos generadores de números aleatorios. Es importante tener diferentes semillas cuando se llame a las funciones de otra forma el mismo conjunto números pseudo-aleatorios sera generados. La función time() siempre da una semilla única (siempre y cuando haya transcurrido por lo menos 1 segundo).
- Escribir un programa en C que mida el tiempo de un fragmento de código en milisegundos.
- Escribir un programa en C para producir una serie de números aleatorios de punto flotante en los rangos a) 0.0 - 1.0, b) 0.0 - n, donde n es cualquier valor flotante. La semilla deberá estar puesta para que se garantice una secuencia única.
|