2015-01-13 3 views
1

Я никогда не программировался на C, и поэтому очень сложно написать небольшую часть программного обеспечения, которая возвращает разницу между двумя датами в секундах.Разница в датах в C (в секундах)

Как и в качестве справочной информации, я реализовал своего рода сердечный ритм в приложении Python с обновлением txt-файла каждые 15 секунд. Теперь я хотел бы создать приложение C, которое проверяет этот txt постоянно, и в случае, если разница превышает 30 секунд, он перезагружает мой компьютер.

Вот как далеко я зашел так далеко:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <sys/stat.h> 
#include <sys/types.h> 


//Returns the number seconds since the last time the files has been updated 
int lastUpdate() { 
    struct stat attr; 
    stat("watcher.txt", &attr); 

    //Gets the last update in the following format: Mon Aug 13 08:23:14 2012 
    //ctime(&attr.st_mtime); 

    time_t lastChange = &attr.st_mtime 
    time_t now = time(0) 

    //No idea how to implement it :-(
    //int seconds = timediff(now, lastChange) 

    return seconds; 
} 

//Constantly checks if application is sending heart beats in a 30 seconds time frame 
main() 
{ 
    while(1 == 1) 
    { 
     if(lastUpdate() > 30) 
     { 
      sprintf(cmd, "sudo reboot -i -p"); 
      system(cmd); 
     } 
    } 
} 

ли кто-нибудь будет так приятно и дать несколько советов о том, как получить эту работу? Большое спасибо!

Редакцией: Окончательный код работает без проблем:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <sys/stat.h> 
#include <sys/types.h> 


//Returns the number seconds since the last time the files has been updated 
int lastUpdate() { 
    struct stat attr; 
    stat("/home/pi/watcher.txt", &attr); 
    time_t lastChange = attr.st_mtime; 
    time_t now = time(0); 
    int seconds = now - lastChange; 
    return seconds; 
} 

//Constantly checks if application is sending heart beats in a 30 seconds time frame 
main() 
{ 
    sleep(120); 

    while(1 == 1) 
    { 
     sleep(1); 

     if(lastUpdate() > 30) 
     { 
      system("sudo reboot -i -p"); 
     } 
    } 
} 
+2

Вы можете добавить 'сон (1)' в цикле, чтобы избежать коробления процессора. – stark

+1

Помните, что настройки времени (например, DST) могут привести к непредвиденной перезагрузке компьютера. – moooeeeep

+0

Добавляя к точке moooeeeep - вместо того, чтобы смотреть на дату и время, вы должны использовать монотонный таймер. Большинство языков (и I imaginge Python является одним из них) имеют функцию, которая возвращает миллисекунды с момента загрузки. Вы можете использовать это, чтобы определить, сколько времени прошло между двумя событиями, и на это не влияет время установки вашего компьютера. Он перекачивает все так часто, потому что он находится в 32-битном int, но вычесть, чтобы найти прошедшее время, по-прежнему безопасно. – Katie

ответ

4

Вы в удачу! time_t - это число, а отметки времени - это время с начала 1970 года в секундах. Итак:

int seconds = now - lastChange; 

О, и

time_t lastChange = &attr.st_mtime 

должен быть

time_t lastChange = attr.st_mtime 
+0

Большое спасибо Wintermute !!! –

0

Вам просто нужно вычесть time_t «S, но у вас есть проблемы в этой линии

time_t lastChange = &attr.st_mtime 

т.к. stat.st_mtime имеет тип time_t не time_t *, так что вы должны изменить его на

time_t lastChange = attr.st_mtime 

, а затем

return new - lastChange; 

, а также проверить stat("watcher.txt", &attr) != -1

1

time_t является обычно количество секунд, прошедших с января 1, 1970 0:00:00 UTC (GMT). Так что просто вычитание будет работать.

time_t lastChange = &attr.st_mtime 
time_t now = time(0) 
time_t seconds = now - lastChange; 
printf("%ll\n", (long long) seconds); 

Stricly говоря, time_t может быть какой-то другой скаляр.
Портативное решение заключается в использовании double difftime(time_t time1, time_t time0);

#include <time.h> 
double seconds = difftime(now, lastChange); 
printf("%f\n", seconds); 
Смежные вопросы