open(“dev / null”,O_APPEND)的返回值可以表示打开了太多文件?

时间:2012-12-20 03:17:46

标签: c++ linux networking boost

我无法理解下面的代码。当reservedFd_ == -2时,它表示接受了两个客户端,为什么?非常感谢你。

// 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
        {
        ...
        }

    }

...
}

1 个答案:

答案 0 :(得分:4)

open(2)返回一个新的文件描述符,如果发生错误则返回-1。 errno会告诉您失败的具体原因。如果打开的文件描述符太多,则应该获得EMFILE或ENFILE。使用strerror(3)获取可读的错误消息。

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

open(2)永远不会返回-2。这将是违反POSIX.1规范的未记录的返回代码。这会导致世界上大量的节目出现问题而不期待它。