Project

General

Profile

Actions

Bug #9617

closed

Windows7 issue with Kernel.spawn close_others => false

Added by lionel_perrin (Lionel PERRIN) over 7 years ago. Updated over 7 years ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.0.0p451 (2014-02-24) [i386-mingw32]
[ruby-core:61401]

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 7 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 7 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 7 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 7 years ago

Documentation patch is welcome.

Actions

Also available in: Atom PDF