描述

2013-08-29 251 views
0
// Wait until data can be read without blocking. 
    size_t read_some(implementation_type& impl, 
     const null_buffers&, asio::error_code& ec) 
    { 
    // Wait for descriptor to become ready. 
    descriptor_ops::poll_read(impl.descriptor_, ec); 

    return 0; 
    } 

內descriptor_ops描述

 int poll_read(int d, asio::error_code& ec) 
{ 
    if (d == -1) 
    { 
    ec = asio::error::bad_descriptor; 
    return -1; 
    } 

    pollfd fds; 
    fds.fd = d; 
    fds.events = POLLIN; 
    fds.revents = 0; 
    errno = 0; 
    int result = error_wrapper(::poll(&fds, 1, -1), ec); 
    if (result >= 0) 
    ec = asio::error_code(); 
    return result; 
} 
  1. pollfd,它的原形定義在哪裏?

  2. ::poll引用哪個文件的poll?

  3. ioctlfcntl爲unix和窗口系統工作?

  4. const null_buffers&,傳遞給null_buffer的引用有什麼用法?

THX

回答

1
  1. /usr/include/poll.h
  2. poll.h的一個!這是一個系統調用。
  3. 不,這段代碼是特定於unix的。 Windows確實有WSAIoctl,但沒有什麼與fcntl完全相同(你拼錯了)。
  4. 我不知道Boost很好。您似乎已經從reactive_descriptor_service類中提取了該代碼。一般來說,read_some方法讀入數據,reactive_descriptor_service看起來只是一個接口的實現,它只是阻塞直到讀取成爲可能,然後大概一些更高的調用者會讀取和緩衝實際數據。因此輪詢調用可以通過通用接口進行優化和實現,而不需要對所有數據進行雙緩衝。所以,內部類稍微重載了read_some的含義,在這個實現中,不使用buffers參數,所以傳遞了一個啞參。