linux 将文件描述符中的数据通过管道传输到 fifo
linux pipe data from file descriptor into a fifo
假设我知道文件描述符 fd
在我的进程中打开以供读取。我想将此 fd
中的数据通过管道传输到 fifo
中,该 fifo
可用于在我的进程之外读取,以避免在 [=] 上调用 poll
或 select
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 设施。
假设我知道文件描述符 fd
在我的进程中打开以供读取。我想将此 fd
中的数据通过管道传输到 fifo
中,该 fifo
可用于在我的进程之外读取,以避免在 [=] 上调用 poll
或 select
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 设施。