2013-02-10 2 views
0

Я написал код, который контролирует каталог DIR с inotify(), и когда файл перемещается в DIR, я получаю .txt вывод этого файла (его файл nfcapd с потоками моего сетевого интерфейса). Это происходит каждые 5 минут.run func() на основании того, что время

После этого я использовал стартовый комплект SnX от Snort, с помощью которого вы можете расширить Snort, написав собственный препроцессор. Этот препроцессор, как и все остальные, является просто функцией, которая выполняется каждый раз, когда доступен новый пакет. Моя проблема в том, что я хочу, когда новый файл будет экспортироваться из моего предыдущего кода (так каждые 5 минут), чтобы прочитать этот файл внутри функции препроцессора.

Итак, есть ли способ получить время и выполнить только в том случае, если это желаемое время?

if (time is 15:36){ 
    func(output.txt);} 

Я пишу в c.

Благодаря

+3

Вы можете сделать это, но он пахнет плохим дизайном. Можете ли вы дать более подробную информацию о том, что вы делаете? – cnicutar

+0

Почему вы не можете запускать код на основе 'inotify'? –

+0

- это отдельные исходные файлы. «Monitor_nfcapd» (первый) находится за пределами Snort и должен оставаться таким. Кроме того, я не могу использовать inotify , так как функция препроцессора выполняет что-то вроде 1000 раз/сек (для каждого пакета). Таким образом, я могу только проверить время или флаг или что-то подобное, каждый раз, когда функция препроцессора выполняет – drazenmozart

ответ

1

Вы можете сделать что-то вроде следующего:

#include <time.h> 
... 

time_t t = time(NULL); //obtain current time in seconds 
struct tm broken_time; 
localtime_r(&t, &broken_time); // split time into fields 

if(broken_time.tm_hour == 15 && broken_time.tm_min == 36) { //perform the check 
    func(output.txt); 
} 
1

Поскольку вы используете inotify, я предполагаю, что ваше окружение поддерживает POSIX сигналов.

Вы можете использовать alarm(), чтобы поднять сигнал по истечении предопределенного промежутка времени и выполнить appropriate signal handler все, что вам нужно. Это позволило бы избежать того, что, как я думаю, станет очень уродливым бесконечным циклом в вашем коде.

Итак, в вашем случае функции обработки SIGALRM не нужно было волноваться, в какое время это было, он знал бы, что предопределенное количество времени прошло из-за того, что он был введен. Тем не менее, вам нужно предоставить некоторый контекст, который функция может получить, чтобы знать , что делать, что сложно предложить, не видя ваш код.

Я не совсем уверен, что вы спуститесь по этому пути, но используя alarm(), вероятно, будет самый подходящий подход, учитывая то, что вы описали.

+0

Мне кажется, мне просто нужно что-то вроде gettimeofday(), но спасибо, я попробую оба! – drazenmozart

+0

Не беспокойтесь, звучит как интересный проект :) Если вы закончите делать что-то совершенно другое, не стесняйтесь также давать свой собственный ответ. –

Смежные вопросы