【发布时间】:2010-07-13 15:36:49
【问题描述】:
是否有任何可移植的方式(在 POSIX 系统上)来确定文件描述符是否可搜索?我的想法是使用lseek(fd, 0, SEEK_CUR); 并检查返回值是否为-1,但我不确定这是否会产生误报或误报。使用fstat 并假设哪些类型的文件是可搜索/不可搜索的,这听起来不是一个好主意。还有其他想法吗?
【问题讨论】:
标签: c posix file-descriptor
是否有任何可移植的方式(在 POSIX 系统上)来确定文件描述符是否可搜索?我的想法是使用lseek(fd, 0, SEEK_CUR); 并检查返回值是否为-1,但我不确定这是否会产生误报或误报。使用fstat 并假设哪些类型的文件是可搜索/不可搜索的,这听起来不是一个好主意。还有其他想法吗?
【问题讨论】:
标签: c posix file-descriptor
lseek 方法似乎是合理的。它当然不会导致误报——如果确实如此,那么实施就会出现严重错误。此外,根据POSIX spec,如果描述符是管道、FIFO 或套接字,它应该会失败,所以理论上你也不应该有误报。剩下的唯一问题是不同系统在多大程度上符合规范。但是,似乎任何其他方法,无论它们是什么,都肯定比这更不便携。
您可以使用 fstat(),然后使用 stat 结构的 mode 字段上的 S_ISREG 宏来检查它是否是常规文件;常规文件per definiton 是可搜索的,而“非常规”(特殊)文件可能不是(我不知道是否有特殊文件也可搜索)。
但是,检查 lseek() 和 errno == ESPIPE 的返回值也应该可以工作。原则上是the effect of lseek() on devices which are incapable of seeking is implementation-defined,所以要小心鼻部守护进程。
【讨论】: