确定可读文件描述符是否是管道的读取端

Dan*_*ien 7 c linux file-descriptor splice zero-copy

我想用来splice将数据从零拷贝STDIN_FILENO到文件描述符(可以是常规文件,字符或块设备,FIFO或任何可以打开的东西open).为了使用splice,无论是文件描述符或文件描述符必须是一个管的适当端,所以一般的管在创建时程序员希望从非管非零拷贝数据以用作中介缓冲-管.但是,如果STDIN_FILENO已经是管道的读取端,那么我可以跳过该步骤并尝试直接拼接STDIN_FILENO到另一个文件描述符.因此,我希望能够确定是否STDIN_FILENO是管道的读取端.

是否有Linux系统调用可以确定是否STDIN_FILENO是管道的读取端?

Uli*_*ter 8

要获取有关open fd的信息,可以使用fstat().我猜测结果的st_mode应该是管道的S_IFIFO.或者,/ proc/self/fd /和/ proc/self/fdinfo /还提供有关文件描述符的一些信息.请记住,/ proc是特定于Linux的.

但是,我认为首先尝试使用splice()并且如果失败(使用EINVAL?)可能会更容易回到你的魔法.

  • 我编写了一个测试程序,它创建了一个名为`fstat`的管道,并测试了`S_ISFIFO`:http://pastebin.com/ntauU2b5.结果是管道读端的`st_mode`上的`S_ISFIFO`为TRUE.您的猜测是正确的,它实际上符合POSIX标准:"S_ISFIFO(m)测试管道**或**FIFO特殊文件"(http://www.opengroup.org/onlinepubs/009695399/basedefs/sys /stat.h.html) (5认同)