2010-09-03 45 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)會告訴你文件描述符是否是其中的任何一個。

在我的情況,這涵蓋了所有的我很感興趣,

相關問題