C++ POSIX中是否有空文件描述符值?
tl;dr是否有一个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} {
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
。