Forum: Ruby-core [ruby-trunk - Bug #7358][Open] Wrong fd redirection on fork

Posted by felipec (Felipe Contreras) (Guest)
on 2012-11-15 13:34
(Received via mailing list)
Issue #7358 has been reported by felipec (Felipe Contreras).

----------------------------------------
Bug #7358: Wrong fd redirection on fork
https://bugs.ruby-lang.org/issues/7358

Author: felipec (Felipe Contreras)
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: 1.9.3p327


It seems fd redirecton only works with spawn, not with fork+exec (at 
least for fd 3).

% ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]

#!/usr/bin/env ruby

tmp = File.new('/tmp/foo', File::CREAT | File::WRONLY)
cmd = ['echo', 'yes']

pid = Process.spawn(*cmd, 3 => tmp)
Process.wait(pid)

pid = fork do
  Process.exec(*cmd, :close_others => true, 3 => tmp)
end
Process.wait(pid)
Posted by drbrain (Eric Hodel) (Guest)
on 2012-11-17 02:40
(Received via mailing list)
Issue #7358 has been updated by drbrain (Eric Hodel).

Status changed from Open to Rejected

=begin
If you want data to show up in ((%/tmp/foo%)), redirect stdout in the 
child process.  Setting file descriptor 3 does nothing since ((%echo%)) 
makes no use of it.

  #!/usr/bin/env ruby

  tmp = File.new('/tmp/foo', File::CREAT | File::WRONLY)
  cmd = ['echo', 'yes']

  pid = Process.spawn(*cmd, out: tmp)
  Process.wait(pid)

  pid = fork do
    Process.exec(*cmd, close_others: true, out: tmp)
  end
  Process.wait(pid)
=end

----------------------------------------
Bug #7358: Wrong fd redirection on fork
https://bugs.ruby-lang.org/issues/7358#change-33005

Author: felipec (Felipe Contreras)
Status: Rejected
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: 1.9.3p327


It seems fd redirecton only works with spawn, not with fork+exec (at 
least for fd 3).

% ruby -v
ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-linux]

#!/usr/bin/env ruby

tmp = File.new('/tmp/foo', File::CREAT | File::WRONLY)
cmd = ['echo', 'yes']

pid = Process.spawn(*cmd, 3 => tmp)
Process.wait(pid)

pid = fork do
  Process.exec(*cmd, :close_others => true, 3 => tmp)
end
Process.wait(pid)
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.