alarm () генерирует SIGALRM после случайного времени - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь создать программу, которая будет анализировать файл pcap до истечения таймера.Для этого я использую alarm функцию, найденную здесь , которая действительно останавливает pcap_loop, но определенно не по истечении заданного времени.

Важные части кода:

pcap_t *handle;

void end_loop(int signum)
{
   pcap_breakloop(handle);
}

int main(...){
...
handle = pcap_open_live(argv[2], BUFSIZ, 1, 100, errbuf);
....
signal(SIGALRM, end_loop);
alarm(5);
pcap_loop(handle, num_packets, got_packet, NULL);
pcap_close(handle);
send_syslog_message(hostname, list_of_parsed_packets));
return 0;
}

Я пытался запустить программу много раз, и она всегда останавливается, но, как следует из названия, время, которое требуется, просто случайное.Я что-то не так делаю?

1 Ответ

0 голосов
/ 15 ноября 2018

man pcap_breakloop говорит:

Флаг проверяется в циклах, считывающих пакеты из ОС - сигнал сам по себе не обязательно завершает эти циклы - также как и вциклы обработки набора пакетов, возвращаемых ОС. Обратите внимание, что если вы перехватываете сигналы в системах UNIX, которые поддерживают перезапуск системных вызовов после сигнала, и вызываете pcap_breakloop () в обработчике сигналов, вы должны указать при перехвате этих сигналов, что системные вызовы НЕ должны перезапускаться этимсигнал.В противном случае, если сигнал прервал вызов, читая пакеты в режиме захвата в реальном времени, когда ваш обработчик сигнала вернется после вызова pcap_breakloop (), вызов будет перезапущен, и цикл не прекратится до тех пор, пока не прибудет больше пакетов и вызов не завершится.

Это, вероятно, то, что вы наблюдаете.Сигнал тревоги получен своевременно, но вы не можете указать, что системные вызовы НЕ должны быть перезапущены этим сигналом.Как следствие, pcap_loop() не возвращается немедленно.

См. Как узнать, перезапускается ли системный вызов Linux или нет?

...