bru*_*ery 3 c++ boost pcap 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;
}
Run Code Online (Sandbox Code Playgroud)
我明白了:
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)
Run Code Online (Sandbox Code Playgroud)
如你所见,close在同一个fd(第一个stream.close(),然后是pcap_close(p))上调用两次.虽然程序可能没有意义,但我需要同时调用stream.close()(以防止io_service调用epoll_ctl关闭fd)和pcap_close(p)(释放由此使用的内存pcap_t) - 这发生在多线程程序上.
关于如何做到这一点的任何想法,而不是两次调用close相同的fd?
| 归档时间: |
|
| 查看次数: |
958 次 |
| 最近记录: |