2012-12-20 55 views
1

我無法理解下面的代碼。當reservedFd_ == -2時,表示有兩個客戶端被接受,爲什麼?非常感謝你。open(「dev/null」,O_APPEND)的返回值是否表示打開的文件過多?

// In one function. 
... 
... 
reservedFd_ = ::open("/dev/null", O_APPEND); 
if (-1 == reservedFd_) 
{ 
    LOG_DEBUG("Failed to open reserved file!, errno: %d", errno); 
} 

... 
... 
... 
---------------------------------------------------------------------- 
// then in other function we accept a new client socket 
void TCPServer::HandleAccept(const boost::system::error_code& _err) 
{ 
    if (!_err) 
    { 
      // too many clients accepted? why? 
     if (-2 == reservedFd_) 
     { 
      boost::system::error_code ignored_ec; 
      session_->GetSocket().close(ignored_ec); 
     } 
     else 
     { 
     ... 
     } 

    } 

... 
} 

回答

4

open(2)返回一個新的文件描述符,如果發生錯誤,則返回-1。 errno會告訴你失敗的具體原因。如果有太多的文件描述符打開,那麼你應該得到EMFILE或ENFILE。使用strerror(3)來獲取可讀的錯誤消息。

LOG_DEBUG("Failed to open reserved file: %s", strerror(errno)); 

open(2)應該永遠不會返回-2。這將是違反POSIX.1規範的無證件返回碼。這會導致世界上大量沒有預料到的程序出現問題。

+0

謝謝你的回答。也許我沒有清楚地描述它。 :: open(「/ dev/null」,O_APPEND)和(-2 == reservedFd_)不在同一個函數中。是否可能在打開/ dev/null成功後,系統在其他位置修改了reservedFd_的值?由於進程接受了太多的客戶端套接字? – kuangi

相關問題