Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ POSIX中是否有空文件描述符值?_C++_Posix_File Descriptor - Fatal编程技术网

C++ POSIX中是否有空文件描述符值?

C++ POSIX中是否有空文件描述符值?,c++,posix,file-descriptor,C++,Posix,File Descriptor,tl;dr是否有一个posix描述符值可以放入close()中,而不会发生任何事情 是否有一个我可以使用的特定值,比如NULL作为指针,作为文件描述符?我希望代码是统一的,所以我认为可以将原始描述符设置为空描述符 class socket { int fd; public: //deleted copy operations socket(socket&& other): fd{other.fd} {

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,但我不确定在任何地方使用它是否安全。

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


由于负1保证永远不会是有效的文件描述符,因此它将是安全的。

文件描述符的减1值可用于
close
调用中,除了close返回
-1
本身之外,对应用程序没有任何不利影响


因为负1保证永远不是有效的文件描述符,所以它是安全的。

您希望“空文件描述符”做什么?像
/dev/null
?@user202729一样,让我把它添加到问题中。现在清楚了吗?
NULL
/
0
是标准输入、afair的fd。看看这个:@SimonKraemer,我没有使用
NULL
作为文件描述符。我试过-1,似乎还可以。我不确定它以后是否会爆炸。按照一个负数是最好的办法。我不熟悉它,虽然我没有把它作为一个答案发布。你希望“空文件描述符”做什么?像
/dev/null
?@user202729一样,让我把它添加到问题中。现在清楚了吗?
NULL
/
0
是标准输入、afair的fd。看看这个:@SimonKraemer,我没有使用
NULL
作为文件描述符。我试过-1,似乎还可以。我不确定它以后是否会爆炸。按照一个负数是最好的办法。我不熟悉它,虽然我不是把它作为一个答案发布。使用这种方法,我将失去区分错误关闭和预期关闭的能力,对吗?@不可计算正确,但您通常检查
关闭
调用的返回值吗?你可能是一个单独的开发人员,可以做到这一点。好吧,析构函数/移动语义通常为我处理:)我只是认为在分级过程中会发生一些神奇的事情,并导致整个程序崩溃。感谢您的回答。实际上,根据您的说法,将
errno
设置为
EBADF
,会产生副作用,尽管我猜您可能无法判断文件描述符是否不存在或格式不正确(即负).@Incomputable在调用
close
之前,您可以检查文件描述符是否为负数,这样您甚至不会设置任何错误状态,因为您只是不调用
close
。使用这种方法,我将无法区分错误关闭和预期关闭,对吗?@Incomputable correct,但您是否通常检查
close
调用的返回值?你可能是一个单独的开发人员,可以做到这一点。好吧,析构函数/移动语义通常为我处理:)我只是认为在分级过程中会发生一些神奇的事情,并导致整个程序崩溃。感谢您的回答。实际上,根据您的说法,将
errno
设置为
EBADF
,会产生副作用,尽管我猜您可能无法判断文件描述符是否不存在或格式不正确(即负).@Incomputable在调用
close
之前,您可以检查文件描述符是否为负值,这样您甚至不会设置任何错误状态,因为您只是不调用
close