linux管道数据从文件描述符转换为fifo

时间:2015-11-19 11:53:32

标签: linux shell pipe system-calls file-descriptor

假设我知道文件描述符fd在我的进程中可以读取。我想将此fd中的数据导入fifo,以便在我的流程之外阅读,以避免在{{poll上调用selectfd 1}}并手动读取/转发数据。可以这样做吗?

1 个答案:

答案 0 :(得分:2)

你的意思是要求操作系统从现在开始持续进行幕后操作?像I / O重定向一样?

不,你做不到。

但是,您可以生成一个不执行任何操作的线程,只读取文件fd并写入管道fd。为了避免在read(2)write(2)系统调用中复制内存的开销,您可以使用sendfile(out_fd, in_fd, NULL, 4096)告诉内核将页面从in_fd复制到{{1} }。请参阅the man page

您可能有更好的结果with splice(2),因为它设计用于文件和管道。 out_fd曾经要求sendfile(2)成为套接字。 (设计用于在TCP套接字上进行零拷贝发送静态数据,例如从Web服务器发送。)

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