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

R..*_*R.. 11 c posix file-descriptor

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

cas*_*nca 10

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

  • 您和我对[无法查找的设备上 lseek() 的行为是实现定义的。](https://pubs.opengroup.org/onlinepubs/9699919799/functions/lseek.html) 的理解明显不同。 (2认同)

jan*_*neb 5

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

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

  • 块设备(例如硬盘驱动器)是可查找的。甚至可能是字符设备,但我不确定。 (3认同)
  • 一些并非真正可搜索的设备不会使搜索失败(至少在 Linux 上,有人试图使搜索失败,但发现依赖于该行为的用户空间应用程序......) (2认同)