标签:pcap c boost boost-asio
在以下程序上运行strace时:
#include <boost/asio.hpp>
#include <pcap.h>
using namespace boost;
int main(int argc, char* argv[])
{
asio::io_service io;
asio::posix::stream_descriptor stream(io);
char errorBuffer[BUFSIZ];
pcap_t* p = pcap_open_live("any", BUFSIZ, false, 0, errorBuffer);
stream.assign(pcap_get_selectable_fd(p));
io.run();
stream.close();
pcap_close(p);
return 0;
}
我明白了:
close(6) = 0
setsockopt(6, SOL_PACKET, PACKET_RX_RING, {block_size=0, block_nr=0, frame_size=0, frame_nr=0}, 16) = -1 EBADF (Bad file descriptor)
munmap(0xb733c000, 4145152) = 0
close(6) = -1 EBADF (Bad file descriptor)
如您所见,close在同一个fd上调用两次(首先是stream.close(),然后是pcap_close(p)).虽然该程序可能没有意义,但我需要调用stream.close()(以防止io_service在关闭的fd上调用epoll_ctl)和pcap_close(p)(释放pcap_t使用的内存) – 这发生在多线程程序.
关于如何做到这一点的任何想法,而不是两次在同一个fd上调用close?
解决方法:
posix :: stream_descriptor假定描述符的所有权,它将在超出范围时关闭它.要解决双重关闭,请在使用dup()进行分配之前复制描述符.
标签:pcap,c,boost,boost-asio 来源: https://codeday.me/bug/20190902/1787707.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。