3

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两次的情况下执行此操作的任何想法?

4

1 回答 1

5

Aposix::stream_descriptor假定描述符的所有权,当超出范围时它将关闭它。要解决双重关闭,请在分配之前复制描述符dup()

于 2012-06-29T21:28:00.693 回答