paulo1205
(usa Ubuntu)
Enviado em 19/07/2017 - 02:16h
É uma solução simples, se você não se importar em estragar a hora do seu computador, e em gastar energia com um loop em espera ocupada.
O que você está fazendo com o código acima é resetar os segundos do relógio de tempo real (RTC) da máquina, e então esperar esse mesmo relógio contar até 1. Ou seja, a cada segundo que você espera, você atrasa o RTC num tanto que pode variar no intervalo de [0,60) segundos em relação a um relógio normal. Pode funcionar (com precisão limitada, nunca melhor do que 1 segundo) para medir intervalos, mas ao custo de atrapalhar a capacidade de saber a hora corrente.
Você falou de
time() e
sleep(). O código que você mostrou é uma possível implementação de
sleep(), mas que inviabiliza uma implementação confiável de
time(). Até mesmo construir um relógio com ela fica pouco trivial. Veja.
while(1){
int h=time(NULL)%86400;
printf("Hora atual: %02d:%02d:%02d\n", h/3600, (h/60)%60, h%60);
sleep(1);
}
Com a implementação de
sleep() que você mostrou, o programa acima vai exibir na primeira iteração um valor de hora qualquer, mas da segunda em diante vai repetir sempre a mesma hora com segundos marcando “01” (segundos voltam a zero, e depois incrementados para 1), inclusive voltando a hora para trás, em relação à mostrada na primeira iteração.
Quando eu falei sobre usar dispositivos de marcação de tempo, esperava que você usasse o PIT (chip 8253/8254) junto com PIC (chip 8259), APIC timer, instruções de TSC ou HPET.
Referências interessantes sobre essas coisas, inclusive com exemplos de código, existem em
wiki.osdev.org. Por exemplo:
*
http://wiki.osdev.org/I/O_Ports;
*
http://wiki.osdev.org/PIT;
*
http://wiki.osdev.org/APIC_timer;
*
http://wiki.osdev.org/CMOS;
*
http://wiki.osdev.org/Timer_Interrupt_Sources.