Bug #9617
closedWindows7 issue with Kernel.spawn close_others => false
Description
I faced an issue while trying to inherit a file or pipe handle from a master process to its child on windows 7.
I tried this implementation:
- master.rb:
rd, wr = IO.pipe
puts "Pipe opened: #{rd.fileno} <= #{wr.fileno}"
cmd = "ruby child.rb #{rd.fileno}"
pid = Kernel.spawn cmd, :close_others => false
wr.write "Hello World\n"
Process.wait pid
- child.rb:
puts "Child:Start #{ARGV}"
rd = IO.new(ARGV[0].to_i, mode: "r")
puts rd.read
On windows I get the following output while it works fine on linux.
Pipe opened: 3 <= 4
Child:Start ["3"]
child.rb:2:in `initialize': Bad file descriptor (Errno::EBADF)
from child.rb:2:in `new'
from child.rb:2:in `<main>'
Note: the same test with the fileno of a file opened from master.rb lead to the same exception in child.rb
Updated by usa (Usaku NAKAMURA) over 10 years ago
- Status changed from Open to Rejected
It is not supported on mswin/mingw to pass file descriptors (except 0,1,2) to other processes.
So, it is expected behavior.
Updated by lionel_perrin (Lionel PERRIN) over 10 years ago
Thanks for the answer.
Two last questions:
- Is there a technical reason why it is not supported ?
I've looked at the ruby source code. From my understanding, the CreateProcess call is made with inheritHandles set to true, which should make possible to transfer handles. Nevertheless, CreatePipe call is made in a way that forbid this handle to be inherited. Wouldn't it be possible to change this ?
- Wouldn't it be worth updating the documentation ? It is not specified that the Kernel.spawn command is limited on windows.
Updated by usa (Usaku NAKAMURA) over 10 years ago
Lionel PERRIN wrote:
- Is there a technical reason why it is not supported ?
I've looked at the ruby source code. From my understanding, the CreateProcess call is made with inheritHandles set to true, which should make possible to transfer handles. Nevertheless, CreatePipe call is made in a way that forbid this handle to be inherited. Wouldn't it be possible to change this ?
We do not have a way how specify which handle corresponds to which file descriptor to a child process.
First of all, we do not know whether a child process treats file descriptors or not.
- Wouldn't it be worth updating the documentation ? It is not specified that the Kernel.spawn command is limited on windows.
I think so, too.
Updated by akr (Akira Tanaka) over 10 years ago
Documentation patch is welcome.