2012-06-29 18 views
3

当下面的程序运行strace的boost :: ASIO与libpcap的:避免调用close两次

#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

回答

5

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

相关问题