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

标签 c linux file-descriptor splice zero-copy

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

有没有Linux系统调用可以判断STDIN_FILENO是否是管道的读端?

最佳答案

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

但是,我认为首先尝试使用 splice() 可能更容易,如果它失败(使用 EINVAL?),则返回您的魔法。

关于c - 确定可读文件描述符是否是管道的读取端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3639454/

相关文章:

windows - 黑莓调试输出

java - 有什么方法可以从文件系统获取文件 CRC?

c - Fork() 新进程并写入子进程和父进程的文件

c - 从函数中替换 char[] 中的字符

C - 链表串联遇到 malloc 错误

c - 为什么 Visual Studio 2015 找不到 libxml2 的文件依赖项 iconv.h?

自定义 make 命令

linux - 比较两个文件和删除部分匹配的有效方法

php - 如何在特定时间运行一个php文件?

c - 如何在客户端连接时将其两个两个连接