alarm()在随机时间后生成SIGALRM

时间:2018-11-15 09:45:35

标签: c++ linux signals libpcap

我正在尝试制作一个程序,该程序将解析pcap文件,直到计时器到期。为此,我使用了alarm函数found here,它确实停止了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 :(得分:1)

man pcap_breakloop说:

  

在从OS读取数据包的循环中检查该标志-信号本身不一定会终止那些循环-在处理OS返回的一组数据包的循环中会检查该标志。 请注意,如果要在支持信号后重新启动系统调用的UNIX系统上捕获信号,并在信号处理程序中调用pcap_breakloop(),则必须指定在捕获这些信号时,系统调用不应由此重启信号。否则,如果信号中断了一个实时捕获中读取数据包的调用,则当您的信号处理程序在调用pcap_breakloop()之后返回时,该调用将重新启动,并且直到更多的数据包到达并完成调用后,循环才会终止。

这可能是您观察到的。警报信号将在适当的时候收到,但是您无法指定不应通过该信号重新启动系统调用。因此,pcap_loop()不会立即返回。

请参见How to know if a Linux system call is restartable or not?