Ho scritto un'utilità per parlare con TomTom GPS watches over Bluetooth e sto provando a farlo funzionare bene come un demone di sfondo run-and-forget.Chiamata sleep in tempo reale() in tempo reale?
Il programma comunica periodicamente con il dispositivo GPS e quindi sleep
s per un po 'finché non è necessario nuovamente.
Ho notato che sleep()
interagisce stranamente con il sistema di sospensione: quando entro sistema di sospensione (laptop con Linux 3.16.0 kernel) e quindi riattivare il computer di backup, sleep
non sembra notare il tempo di sospensione. Per esempio, prendete il seguente sleep.c
:
#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char**argv)
{
time_t t=time(NULL);
printf("sleep at: %s", ctime(&t));
sleep(atoi(argv[1]));
t=time(NULL);
printf("wake at: %s", ctime(&t));
}
[email protected]:~$
compilare, eseguire, e il sonno a metà;
$ gcc sleep.c -o sleep
$ ./sleep 30
sleep at: Fri Aug 21 21:05:36 2015
<suspend computer for 17 seconds>
wake at: Fri Aug 21 21:06:23 2015
Esiste un modo corretto di sospendere l'esecuzione del programma in un modo che è orologio in tempo -consapevoli piuttosto che sistema uptime -consapevoli?
(ho anche provato usleep
, nanosleep
e alarm
e ha scoperto che si comportano in modo simile.)
UPDATE:setitimer
, come suggerito da @HuStmpHrrr, sembrava abbastanza promettente ... ma sembra avere la stesso problema.
Questa versione mette in pausa per più di 30s richiesti quando sospendo nel mezzo di esso ...
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <sys/time.h>
void sighandler() {}
int main(int argc, char**argv)
{
time_t t=time(NULL);
printf("sleep at: %s", ctime(&t));
signal(SIGALRM, sighandler);
struct itimerval timer = {.it_interval={0,0},
.it_value={atoi(argv[1]),0}};
setitimer(ITIMER_REAL, &timer, NULL);
pause();
t=time(NULL);
printf("wake at: %s", ctime(&t));
}
che dire 'alarm'? 'alarm() ordina che un segnale SIGALRM venga consegnato al processo chiamante in secondi secondi. leggi promettenti. – HuStmpHrrr
'setitimer' fornisce più controllo. puoi passare in "ITIMER_REAL" per ottenere ciò che desideri. – HuStmpHrrr
'setitimer' sembra molto promettente ma sembra avere lo stesso problema in quanto non conta" tempi di inattività ". Polling 'time' sembra una soluzione abbastanza inelegante ma probabilmente quella giusta :( –