如何确定文件描述符是否可寻址?

14

在 POSIX 系统上,有没有一种可移植的方法来确定文件描述符是否可寻址?我的想法是使用 lseek(fd, 0, SEEK_CUR); 并检查返回值是否为 -1,但我不确定这是否可能产生错误的负面或正面结果。使用 fstat 并对可寻址/不可寻址类型的文件进行假设似乎不是一个好主意。还有其他的想法吗?

2个回答

10

lseek 方法看起来很合理。它肯定不会导致错误的负面影响 - 如果是,那么实现肯定有严重问题。此外,根据POSIX规范,如果描述符是管道、FIFO或套接字,该方法应该失败,因此理论上你也不应该得到错误的结果。唯一剩下的问题是不同系统对规范的遵守情况。然而,与其他可能存在的方法相比,使用该方法肯定更具可移植性。



5
你可以使用fstat()函数,然后在stat结构体的mode字段上使用S_ISREG宏来检查它是否是常规文件;常规文件根据定义是可寻址的,而“非常规”(特殊)文件可能不是(我不知道是否有特殊文件也是可寻址的)。
但是,检查lseek()函数的返回值和errno == ESPIPE也可以起到作用。原则上,lseek()对于无法寻址的设备的影响是实现定义的,所以要小心避免出现错误。

3
块设备,例如硬盘,可以进行寻址。字符设备可能也可以,但我不确定。 - Thomas
2
一些不真正可寻址的设备将不会失败于寻址操作(至少在Linux上,有人试图使寻址操作失败,但发现用户空间应用程序依赖于这种行为...) - Spudd86
True;一些字符设备驱动程序会忽略seek()并静默返回。 - Michael Foukarakis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接