Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 将'STDOUT'和'STDIN'组合成一个'IO'对象_Ruby_Unix - Fatal编程技术网

Ruby 将'STDOUT'和'STDIN'组合成一个'IO'对象

Ruby 将'STDOUT'和'STDIN'组合成一个'IO'对象,ruby,unix,Ruby,Unix,是否有一种方法可以创建单个IO对象,其读取流是当前进程的STDOUT,而其写入流是当前进程的STDIN 这类似于IO.popen,它将命令作为子进程运行,并返回连接到子进程标准流的IO对象。但是,我不想运行子进程,我想使用当前的Ruby进程 有没有办法创建单个IO对象 不是。STDIN和STDOUT是两个不同的文件描述符。一个IO代表一个FD 但是,您可以制作类似IO对象的东西。 这可能包含一系列错误,因为复制FDs通常是不好的 require "forwardable" class IOTee

是否有一种方法可以创建单个
IO
对象,其读取流是当前进程的
STDOUT
,而其写入流是当前进程的
STDIN

这类似于
IO.popen
,它将命令作为子进程运行,并返回连接到子进程标准流的
IO
对象。但是,我不想运行子进程,我想使用当前的Ruby进程

有没有办法创建单个IO对象

不是。STDIN和STDOUT是两个不同的文件描述符。一个IO代表一个FD

但是,您可以制作类似IO对象的东西。 这可能包含一系列错误,因为复制FDs通常是不好的

require "forwardable"
class IOTee < IO
  extend Forwardable
  def_delegators :@in, 
    :close_read, 
    :read, 
    :read_nonblock, 
    :readchar, 
    :readlines, 
    :readpartial, 
    :sysread

  def_delegators :@out, 
    :close_write,
    :syswrite, 
    :write, 
    :write_nonblock

  def initialize(input,output)
    @in = input
    @out = output
  end
end

io = IOTee.new(STDIN,STDOUT) # You would swap these
io.puts("hi")
hi
=> nil
要求“可转发”
类IOTee
根据您正在执行的操作,还有
IO#pipe
IO#reopen
,这也可能会有所帮助

我怀疑上述问题并不是你想要解决的问题,而是你在解决问题时遇到的问题

我怀疑你真正想要的是制作一个管道,然后重新打开两端的
STDOUT
STDIN
。将它们组合到单个IO对象中没有多大意义


此外,如果您通过
STDIN
STDOUT
与自己交谈,在等待自己读取或写入数据时很容易陷入死锁。

是的,我基本上按照您的建议重新打开了管道的每一端。我想我只是对
IO.popen
如何将子进程的标准流连接到单个文件描述符感到困惑,但主进程却无法做到这一点。