Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无法读取正在写入的命名管道_Ruby_Named Pipes - Fatal编程技术网

Ruby 无法读取正在写入的命名管道

Ruby 无法读取正在写入的命名管道,ruby,named-pipes,Ruby,Named Pipes,我有一个正在写入命名管道的数据流: named_pipe='/tmp/pipe'#命名管道的位置 File.mkfifo(命名管道)#创建命名管道 File.open(命名为_pipe,'w+')#必要的,以避免在⌃C以后从另一个进程调用 系统('youtube-dl','--newline','https://www.youtube.com/watch?v=aqz-KE bpKQ',out:named_pipe)#输出下载进度,一次一行 问题是,虽然我可以cat/tmp/pipe并获得信息,

我有一个正在写入命名管道的数据流:

named_pipe='/tmp/pipe'#命名管道的位置
File.mkfifo(命名管道)#创建命名管道
File.open(命名为_pipe,'w+')#必要的,以避免在⌃C以后从另一个进程调用
系统('youtube-dl','--newline','https://www.youtube.com/watch?v=aqz-KE bpKQ',out:named_pipe)#输出下载进度,一次一行
问题是,虽然我可以
cat/tmp/pipe
并获得信息,但我无法从另一个Ruby进程读取该文件。我尝试了
File.readlines
File.read
查找,
File.open
然后阅读,以及其他我不再记得的东西。其中一些挂起,另一些出错

在纯Ruby中,如何获得与使用
cat
相同的结果


注意:我不必使用
系统
发送到管道(
Open3
可以接受),但是任何需要外部依赖关系的解决方案都是不可行的。

它看起来像
File.readlines/IO.readlines
File.read/IO.read
需要首先加载整个临时文件,这样您就不会看到任何文件被打印出来

试试
File#each/IO.foreach
,它逐行处理文件,不需要将整个文件加载到内存中

File.foreach(“/tmp/pipe”){| line | p line}
#或
open('/tmp/pipe','r')。每个{line{p line}

read
/
readlines
返回整个文件,以便在写入过程完成之前阻止它们。您必须使用一次读取一行的方法。
open
还有一个块形式:
File.open('/tmp/pipe'){| File |……}