如何检查存储在变量中的给定文件描述符是否仍然有效?
- 2024-10-29 08:35:00
- admin 原创
- 43
问题描述:
我有一个文件描述符存储在变量中var
。如何在稍后阶段检查该描述符是否有效?
fdvar1= open(.....);
fdvar2 = fdvar1; // Please ignore the bad design
....
// lots of loops , conditionals and threads. It can call close(fdvar2) also.
....
if(CheckValid(fdvar1)) // How can I do this check ?
write(fdvar1, ....);
现在我想检查fdvar1
(仍保留打开的描述符) 是否仍然有效。有相关 API 吗?
解决方案 1:
fcntl(fd, F_GETFD)
`fd是检查打开文件描述符是否有效的最经济的规范方法。如果您需要进行大量批量检查,则使用
poll零超时并将
events成员设置为 0,并在其返回后检查
POLLNVALin
revents`会更有效。
话虽如此,操作“检查给定的资源句柄是否仍然有效”几乎总是从根本上错误的。在释放资源句柄后(例如 fd 为close
d),其值可能会重新分配给您分配的下一个此类资源。如果有任何剩余的引用可能被使用,它们将错误地对新资源而不是旧资源进行操作。因此,真正的答案可能是:如果您还不知道程序的逻辑,那么您就有需要修复的重大基本逻辑错误。
解决方案 2:
您可以使用该fcntl()
功能:
int fd_is_valid(int fd)
{
return fcntl(fd, F_GETFD) != -1 || errno != EBADF;
}
解决方案 3:
我认为没有任何函数可以告诉您描述符是否仍然有效。描述符通常只是一个小整数,例如 6,如果您关闭文件并稍后打开新文件,您的 libc 可以选择重用该数字。
相反,您应该考虑使用dup()
来复制文件描述符。通过复制文件描述符而不是在多个地方使用相同的描述符,您可能更容易知道文件描述符是否仍然有效。您只需记住在完成后关闭原始描述符和复制的描述符即可。
解决方案 4:
来自该论坛文章:
int is_valid_fd(int fd)
{
return fcntl(fd, F_GETFL) != -1 || errno != EBADF;
}
fcntl(GETFL) 可能是对文件描述符执行的最便宜且最不可能失败的操作。具体来说,规范表明它不能被信号中断,也不会受到任何地方持有的任何锁的影响。
解决方案 5:
在我看来,如果您想知道它是否仍指向同一资源,一种(非完美)方法是fstat()
在打开后立即查看描述符,然后稍后再执行一次并比较结果。首先查看.st_mode
&S_IFMT
并从那里开始 - 它是文件系统对象吗?看看.st_dev / .st_ino.
它是套接字吗?试试getsockname()
, getpeername()
。虽然不能 100% 确定,但它可以告诉您是否绝对不一样。
解决方案 6:
我为自己解决了这个问题。我不知道它是否可以用于通用目的,但对于串行连接它工作正常(例如/dev/ttyUSB0)!
struct stat s;
fstat(m_fileDescriptor, &s);
// struct stat::nlink_t st_nlink; ... number of hard links
if( s.st_nlink < 1 ){
// treat device disconnected case
}
有关详细信息,请参阅手册页http://linux.die.net/man/2/fstat
干杯,Flo
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件