12

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

4

2 回答 2

10

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

于 2010-07-13T15:51:42.813 回答
5

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

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

于 2010-07-13T16:07:12.700 回答