是否有任何可移植方式(在POSIX系统上)来确定文件描述符是否可搜索?我的想法是使用lseek(fd, 0, SEEK_CUR);
并检查返回值是否为-1,但我不确定这是否会给出假阴性或误报。使用fstat
并假设哪些类型的文件是可搜索/不可搜索的并不是一个好主意。还有其他想法吗?
答案 0 :(得分:10)
lseek
方法似乎合情合理。它肯定不会导致错误的否定 - 如果确实如此,那么实施就会出现严重错误。此外,根据POSIX spec,如果描述符是管道,FIFO或套接字,它应该会失败,因此理论上你也不应该有误报。唯一剩下的问题是不同系统如何符合规范。然而,似乎任何其他方法,无论它们是什么,肯定不会比这更便携。
答案 1 :(得分:2)
您可以使用fstat(),然后使用stat结构的mode字段中的S_ISREG宏来检查它是否是常规文件;常规文件per definiton是可搜索的,而“非常规”(特殊)文件可能不是(我不知道是否有可搜索的特殊文件)。
但是,检查lseek()和errno == ESPIPE的返回值也应该有效。原则上,the effect of lseek() on devices which are incapable of seeking is implementation-defined,所以要小心鼻守护进程。