linux 将文件描述符中的数据通过管道传输到 fifo

linux pipe data from file descriptor into a fifo

假设我知道文件描述符 fd 在我的进程中打开以供读取。我想将此 fd 中的数据通过管道传输到 fifo 中,该 fifo 可用于在我的进程之外读取,以避免在 [=] 上调用 pollselect 11=] 和手动 reading/forwarding 数据。这能做到吗?

你的意思是要求 OS 从现在开始在幕后持续进行?像 I/O 重定向?

不,你不能那样做。

不过,您可以生成一个线程,它只读取文件 fd 并写入管道 fd。为了避免在 read(2)write(2) 系统调用中复制内存的开销,您可以使用 sendfile(out_fd, in_fd, NULL, 4096) 告诉内核将页面从 in_fd 复制到 out_fd.参见 the man page

您可能会得到更好的结果 with splice(2),因为它专为与文件和管道一起使用而设计。 sendfile(2) 曾经要求 out_fd 是一个套接字。 (设计用于在 TCP 套接字上零拷贝发送静态数据,例如从 Web 服务器。)


Linux 确实有 asynchronous I/O,因此您可以在后台排队读取或写入。这在这里不是一个好的选择,因为你不能将一个副本从一个 fd 排队到另一个。 (没有异步 splice(2)sendfile(2))。即使有,它也会有一个特定的请求大小,而不是一劳永逸地永远复制。据我所知,线程已成为执行异步 I/O 的首选方式,而不是 POSIX AIO 设施。