我正在尝试制作一个程序,该程序将解析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;
}
我已经尝试过多次运行该程序,但该程序始终会停止,但是正如标题所述,它所花费的时间只是随机的。我在做错什么吗?
答案 0 :(得分:1)
在从OS读取数据包的循环中检查该标志-信号本身不一定会终止那些循环-在处理OS返回的一组数据包的循环中会检查该标志。 请注意,如果要在支持信号后重新启动系统调用的UNIX系统上捕获信号,并在信号处理程序中调用pcap_breakloop(),则必须指定在捕获这些信号时,系统调用不应由此重启信号。否则,如果信号中断了一个实时捕获中读取数据包的调用,则当您的信号处理程序在调用pcap_breakloop()之后返回时,该调用将重新启动,并且直到更多的数据包到达并完成调用后,循环才会终止。
这可能是您观察到的。警报信号将在适当的时候收到,但是您无法指定不应通过该信号重新启动系统调用。因此,pcap_loop()
不会立即返回。
请参见How to know if a Linux system call is restartable or not?