1

以下のコードが理解できません。reservedFd_ == -2 の場合、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
        {
        ...
        }

    }

...
}
4

1 に答える 1

4

open(2)新しいファイル記述子を返します。エラーが発生した場合は-1を返します。errno失敗の具体的な原因を教えてくれます。開いているファイル記述子が多すぎる場合は、EMFILEまたはENFILEを取得する必要があります。strerror(3)読み取り可能なエラーメッセージを取得するために使用します。

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

open(2)-2を返すことはありません。これは、POSIX.1仕様に違反する文書化されていない戻りコードになります。それはそれを予期していない世界中の膨大な数のプログラムで問題を引き起こすでしょう。

于 2012-12-20T03:22:56.767 に答える