2010-09-03 44 views
5

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

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

回答

5

要获取有关打开fd的信息,可以使用fstat()。我猜测结果的st_mode应该是S_IFIFO的管道。另外,/ proc/self/fd /和/ proc/self/fdinfo /还提供了一些有关文件描述符的信息。请记住,/ proc是linux特有的。但是,我认为先尝试使用splice()并且如果失败(使用EINVAL?)会回到你的魔法可能会更容易。

+4

我编写了创建一个管道,叫'fstat',并测试'S_ISFIFO'测试程序的案件:HTTP://引擎收录。 com/ntauU2b5。结果是'st_mode'上管道读端的'S_ISFIFO'为TRUE。你的猜测是正确的,它实际上是按照POSIX标准:“S_ISFIFO(m)测试管道**或** FIFO特殊文件”(http://www.opengroup.org/onlinepubs/009695399/basedefs/sys /stat.h.html) – 2010-09-04 00:25:44

1

作为替代,如果“fd与管道,套接字或FIFO关联”,则lseek()将失败,并且ESPIPE。因此,禁止lseek(fd, 0, SEEK_CUR)会告诉你文件描述符是否是其中的任何一个。

在我的情况,这涵盖了所有的我很感兴趣,

相关问题