问题 如何确定文件描述符是否可搜索?


是否有任何可移植的方式(在POSIX系统上)来确定文件描述符是否可搜索?我的想法是使用 lseek(fd, 0, SEEK_CUR); 并检查返回值是否为-1,但我不确定这是否会给出假阴性或误报。运用 fstat 并且假设哪些类型的文件是可搜索/不可搜索的并不是一个好主意。还有其他想法吗?


8538
2017-07-13 15:36


起源



答案:


lseek 方法似乎合理。它肯定不会导致错误的否定 - 如果确实如此,那么实施就会出现严重错误。另外,根据 POSIX规范,如果描述符是管道,FIFO或套接字,它应该失败,所以理论上你也不应该有误报。唯一剩下的问题是不同系统如何符合规范。然而,似乎任何其他方法,无论它们是什么,肯定会比这更不便携。


10
2017-07-13 15:51





您可以使用fstat(),然后在stat结构的mode字段上使用S_ISREG宏来检查它是否是常规文件;一个普通文件, 根据定义,是可以搜索的,而“非常规”(特殊)文件可能不是(我不知道是否有可搜索的特殊文件)。

但是,检查lseek()和errno == ESPIPE的返回值也应该有效。原则上, lseek()对无法寻找的设备的影响是实现定义的,所以要小心鼻守护进程。


2
2017-07-13 16:07



块设备(例如硬盘驱动器)可以是可寻找的。甚至可能是角色设备,但我不确定。 - Thomas
一些不能真正寻找的设备不会使搜索失败(在Linux上,有人试图使搜索失败,但发现依赖于行为的用户空间应用......) - Spudd86
真正;一些字符设备驱动程序只是忽略seek()并静默返回。 - Michael Foukarakis


答案:


lseek 方法似乎合理。它肯定不会导致错误的否定 - 如果确实如此,那么实施就会出现严重错误。另外,根据 POSIX规范,如果描述符是管道,FIFO或套接字,它应该失败,所以理论上你也不应该有误报。唯一剩下的问题是不同系统如何符合规范。然而,似乎任何其他方法,无论它们是什么,肯定会比这更不便携。


10
2017-07-13 15:51





您可以使用fstat(),然后在stat结构的mode字段上使用S_ISREG宏来检查它是否是常规文件;一个普通文件, 根据定义,是可以搜索的,而“非常规”(特殊)文件可能不是(我不知道是否有可搜索的特殊文件)。

但是,检查lseek()和errno == ESPIPE的返回值也应该有效。原则上, lseek()对无法寻找的设备的影响是实现定义的,所以要小心鼻守护进程。


2
2017-07-13 16:07



块设备(例如硬盘驱动器)可以是可寻找的。甚至可能是角色设备,但我不确定。 - Thomas
一些不能真正寻找的设备不会使搜索失败(在Linux上,有人试图使搜索失败,但发现依赖于行为的用户空间应用......) - Spudd86
真正;一些字符设备驱动程序只是忽略seek()并静默返回。 - Michael Foukarakis