Нужна помощь в программировании на C, сравнивая время вместе - PullRequest
1 голос
/ 27 января 2010

Мне нужен совет и помощь с плагином, который я пишу для Nagios.

Я пишу плагин на C, но не имею опыта работы с языком, за исключением небольших сумм, пока пытаюсь заставить этот плагин работать.

В основном я пытаюсь сделать следующее:

читать текстовый файл, который генерируется на удаленном ПК приложением, которое я написал, эта программа записывает в файл не более 5 символов, первые 4 символа - это время в 24-часовом формате. например 22:30> 10:30 вечера

Затем нужно взять эти 4 символа, преобразовать их во время и сравнить с текущим системным временем (если разница составляет 5 минут, генерируется ответ nagios для пометки предупреждения).

Я пробовал много разных способов сделать это, моя первая попытка состояла в том, чтобы преобразовать символы в целое число, затем преобразовать время в целое число и сравнить разницу ... не удалось этого сделать.

Моя вторая попытка - сгенерировать две Структуры Времени, одну с текущим временем, а другую с моим "самодельным" временем и сравнить их, но это тоже не работает.

Вот мой код, независимо от того, что я пробую, дата из файла всегда совпадает с текущим системным временем, я знаю, что это связано с необходимостью установить время сверху.

t_of_file = time(NULL);
time_from_file = localtime(&t_of_file);

но если я не сделаю этого, я получу ошибку сегментации.

вот код.

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define COPYMODE 0644

int main(int argc, char *argv[])
{


    struct tm *time_from_file;
    struct tm *the_system_time;

    time_t t_of_file;
    time_t t_of_sys;

    t_of_sys = time(NULL);
    the_system_time = localtime(&t_of_sys);

    t_of_file = time(NULL);
    time_from_file = localtime(&t_of_file);



    time_from_file->tm_year = the_system_time->tm_year;
    time_from_file->tm_mon  = the_system_time->tm_mon;
    time_from_file->tm_mday = the_system_time->tm_mday;
    time_from_file->tm_hour = 10; //should be read in from file
    time_from_file->tm_min  = 30; //should be read in from file
    time_from_file->tm_sec  = the_system_time->tm_sec;
    time_from_file->tm_isdst = the_system_time->tm_isdst;

    t_of_file = mktime(time_from_file);
    printf("%s\n",ctime(&t_of_file));

    t_of_sys = mktime(the_system_time);
    printf("%s\n",ctime(&t_of_sys));

    double difference = difftime(t_of_file, t_of_sys );

    printf("%lf\n",(double)t_of_file);
    printf("%lf\n",(double)t_of_sys);

    if (difference >= 0.0) { //this should be 5 mins, not quite sure what to put here yet
        // second is later than first
        printf("later\n");
    }
    else if (difference < 0.0) {
        // second is earlier than first
        printf("earlier\n");
    }
    printf("%lf\n", difference);


    return 0;//STATE_OK;
}

любая помощь, которую вы можете предложить, будет признательна за это.

Следуя ответам, которые я получил, ответ PACE был точным для того, что я хотел сделать, и теперь у меня есть более простой код, который отлично работает для того, что я пытаюсь сделать, и легче чтобы понять. ниже приведен код в его измененном виде (он прекрасно компилируется в Linux).

#include <stdio.h>
#include <time.h>

int main ()
{
  time_t filetime;
  time_t presenttime;

  struct tm * timeinfo;

  time ( &filetime );
  time ( &presenttime);

  timeinfo = localtime ( &filetime );
  timeinfo->tm_hour = 14; //this should be entered from file
  timeinfo->tm_min = 15; //this should be entered from file
  filetime = mktime ( timeinfo );

  printf("my time %s\n",ctime(&filetime));
  printf("pc time %s\n",ctime(&presenttime));


    double difference = difftime(filetime, presenttime );

    printf("%lf\n",(double)filetime);
    printf("%lf\n",(double)presenttime);

    if (difference > 300.0) {
        // second is later than first
        printf("later\n");
    }
    else if (difference < 0.0) {
        // second is earlier than first
        printf("earlier\n");
    }
    printf("%lf\n", difference);


  return 0;

поболеть за помощь, ребята.

Ответы [ 4 ]

2 голосов
/ 27 января 2010

Есть пример создания времени здесь . Затем вы можете сравнить время с помощью метода difftime .

0 голосов
/ 27 января 2010

Я изменил ваш код следующим образом, и теперь он делает то, что вы ожидали:


struct tm time_from_file;
struct tm the_system_time;</p>

<pre><code>time_t t_of_file;
time_t t_of_sys;

t_of_sys = time(NULL);
memcpy(&the_system_time,localtime(&t_of_sys),sizeof(struct tm));

t_of_file = time(NULL);
memcpy(&time_from_file,localtime(&t_of_sys),sizeof(struct tm));

time_from_file.tm_hour = 10; //should be read in from file
time_from_file.tm_min  = 30; //should be read in from file

t_of_file = mktime(&time_from_file);
printf("%s\n",ctime(&t_of_file));
printf("%s\n",ctime(&t_of_sys));

double difference = difftime(t_of_file, t_of_sys );

printf("%lf\n",(double)t_of_file);
printf("%lf\n",(double)t_of_sys);

printf("%lf\n", difference);

Что не так с вашим кодом:
Вы использовали и модифицировали указатель, возвращаемый localtime, который в обоих случаях одинаков.
Следовательно, ваши указатели time_from_file и the_system_time фактически указывали на одно и то же местоположение. Любая модификация одного изменяет также и другое, и, наконец, у вас есть нулевая разница. (Спасибо, gdb, что помог мне разобраться! !!)

0 голосов
/ 27 января 2010

Сравнивать ваш формат легко в C. Используйте это, чтобы прочитать компоненты времени из файла:

int hr, min; 
fscanf (file, "%d:%d", &hr, &min);

Вот полное решение:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

struct HrMin_ {
  int hr;
  int min;
};
typedef struct HrMin_ HrMin;

static const double TIME_DIFFERENCE = (double) (5 * 1000);

static HrMin read_time (FILE* file);

int
main (int argc, char **argv)
{
  time_t sys_time_t = 0;
  struct tm *sys_time = NULL;
  struct tm *file_time = NULL;
  double d = 0.0f;

  if (argc != 2)
    {
      printf ("Usage: time_cmp <time_file>\n");
      return 1;
    }

  time (&sys_time_t);

  sys_time = localtime (&sys_time_t);
  file_time = malloc (sizeof (struct tm));

  file_time->tm_sec = sys_time->tm_sec;
  file_time->tm_min = sys_time->tm_min;
  file_time->tm_hour = sys_time->tm_hour;
  file_time->tm_mday = sys_time->tm_mday;
  file_time->tm_mon = sys_time->tm_mon;
  file_time->tm_year = sys_time->tm_year;
  file_time->tm_wday = sys_time->tm_wday;
  file_time->tm_yday = sys_time->tm_yday;
  file_time->tm_isdst = sys_time->tm_isdst;  

  FILE *file = fopen (argv[1], "r");
  if (file == NULL)
    {
      printf ("Failed to open file: %s\n", argv[1]);
      return 1;
    }
  HrMin hr_min = read_time (file);
  fclose (file);

  file_time->tm_hour = hr_min.hr;
  file_time->tm_min = hr_min.min;

  d = difftime (sys_time_t, mktime (file_time));
  free (file_time);

  if (d < 0) d *= -1;
  printf ("Diff: %f\n", d);
  if (d >= TIME_DIFFERENCE)
    printf ("WARN!\n");

  return 0;
}

static HrMin 
read_time (FILE *file)
{
  HrMin hr_min;
  hr_min.hr = 0;
  hr_min.min = 0;
  fscanf (file, "%d:%d", &hr_min.hr, &hr_min.min);
  return hr_min;
}
0 голосов
/ 27 января 2010

Если бы это был я, я бы соблазнился просто сохранить результат time () в файл. Это сэкономило бы много работы по разбору строк с другой стороны.

...