From: usa@... Date: 2014-03-11T11:43:39+00:00 Subject: [ruby-core:61412] [ruby-trunk - Bug #9617] Windows7 issue with Kernel.spawn close_others => false Issue #9617 has been updated by Usaku NAKAMURA. 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. ---------------------------------------- Bug #9617: Windows7 issue with Kernel.spawn close_others => false https://bugs.ruby-lang.org/issues/9617#change-45722 * Author: Lionel PERRIN * Status: Rejected * Priority: Normal * Assignee: * Category: platform/mingw * Target version: * ruby -v: ruby 2.0.0p451 (2014-02-24) [i386-mingw32] * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- 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 `
' ~~~ Note: the same test with the fileno of a file opened from master.rb lead to the same exception in child.rb -- http://bugs.ruby-lang.org/