在以下程序中运行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
在已关闭的epoll_ctl
上调用fd
和pcap_close(p)
(至释放pcap_t
使用的内存 - 这发生在多线程程序上。
有关如何执行此操作的任何想法,而不是在close
两次调用fd
两次?
答案 0 :(得分:5)
posix::stream_descriptor
假设描述符的所有权,它将在超出范围时关闭它。要解决双重关闭,请在使用dup()
进行分配之前复制描述符。