【问题标题】:Is there a null file descriptor value in POSIX?POSIX 中是否存在空文件描述符值?
【发布时间】:2018-03-22 14:29:10
【问题描述】:

tl;dr 是否有一个 posix 描述符值可以放入 close() 并且不会发生任何事情?


是否有我可以使用的特定值,例如用于指针的NULL 用于文件描述符?我希望代码是统一的,所以我认为我可以将源描述符设置为空描述符。

class socket
{
    int fd;
public:
    //deleted copy operations
    socket(socket&& other):
                   fd{other.fd}
    {
        other.fd = /*null descriptor*/
    }

    ~socket()
    {
        if (close(fd) == -1)
        {
            throw std::runtime_error{strerror(errno)};
        }
        // ^^ null file descriptor will do nothing on close()
        // like delete nullptr;
    }

我可以存储一个布尔标志,但我想避免它。

它将使用的操作系统是 Ubuntu 16.04,带有 gcc 5.4。我不能使用 POSIX 和标准库本身之外的任何库,直到 gcc 5.4 中存在的版本。

我尝试阅读 open()close() 的手册页。他们没有提到要使用的任何特殊价值。

我尝试将其设置为 -1,但不确定是否可以在任何地方安全使用。

【问题讨论】:

  • 你想让“NULL 文件描述符”做什么?喜欢/dev/null
  • @user202729,让我将其添加到问题中。现在清楚了吗?
  • NULL/0 是标准输入的 fd。看看这个:stackoverflow.com/a/18507245/4181011
  • @SimonKraemer,我没有使用 NULL 作为文件描述符。我试过-1,好像没问题。不知道以后会不会爆炸。
  • this 负数是要走的路。尽管我没有将其发布为答案,但不熟悉它。

标签: c++ posix file-descriptor


【解决方案1】:

可以在close 调用中使用文件描述符的负1 值,除了关闭返回-1 本身之外,对应用程序没有不利影响。

由于保证负数永远不会是有效的文件描述符,所以它是安全的。

【讨论】:

  • 使用这种方法,我将失去区分错误关闭和预期关闭的能力,对吧?
  • @Incomputable 正确,但是您通常检查close 调用的返回值吗?你可能是一个单独的开发者。
  • 嗯,析构函数/移动语义通常会为我处理这个问题 :) 我只是认为在分级过程中会发生一些神奇的事情并导致整个程序崩溃。感谢您的回答。
  • 实际上,根据the docs,您会产生将errno 设置为EBADF 的副作用,尽管我猜您无法判断文件描述符是否不存在或它格式不正确(即否定)。
  • @Incomputable 您可以在调用close 之前检查文件描述符是否为负数,因此您甚至不设置任何错误状态,因为您只是不调用close
猜你喜欢
  • 2011-04-24
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 2012-01-30
  • 2014-04-10
  • 2012-03-27
  • 2011-02-14
相关资源
最近更新 更多