Issue #6228 has been updated by mame (Yusuke Endoh).

Assignee changed from authorNari (Narihiro Nakamura) to nobu (Nobuyoshi Nakada)

+1 for nagachika-san.


jonforums (Jon Forums) wrote:
> Why is the following
> 
>   ensure
>     fds.each {|fd| IO.for_fd(fd).close rescue next}
> 
> wrong usage of IO.for_fd?

  f = open("...")     # this first IO has a fd X which is opened now.
  IO.for_fd(f.fileno) # this second IO also has the fd X.
  GC.start            # the second IO is GC'ed; the fd X is auto-closed.
  f.close             # this attempts to close the fd X, but it is already closed => Errno::EBADF


> Specifically, is there another style of explicit recycling of fds that doesn't require starting a GC cycle?

Call IO#close explicitly.

-- 
Yusuke Endoh <mame / tsg.ne.jp>
----------------------------------------
Bug #6228: [mingw] Errno::EBADF in ruby/test_io.rb on ruby_1_9_3
https://bugs.ruby-lang.org/issues/6228#change-26072

Author: jonforums (Jon Forums)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi Nakada)
Category: test
Target version: 1.9.3
ruby -v: ruby 1.9.3p172 (2012-03-30 revision 35179) [i386-mingw32]


On Win7 32bit built with MinGW 4.6.2 using the RubyInstaller build recipes, I get the following test error:


sh-3.1$ ruby --version
ruby 1.9.3p172 (2012-03-30 revision 35179) [i386-mingw32]

sh-3.1$ make test-all TESTS='openssl fiddle psych zlib io json mkmf pathname stringio erb 
fileutils ruby/test_io.rb ruby/test_io_m17n.rb ruby/test_file.rb'

  7) Error:
test_lines(TestIO):
Errno::EBADF: Bad file descriptor
    c:/Users/Jon/Documents/RubyDev/ruby-git/test/ruby/test_io.rb:33:in `close'
    c:/Users/Jon/Documents/RubyDev/ruby-git/test/ruby/test_io.rb:33:in `rescue in block in pipe'
    c:/Users/Jon/Documents/RubyDev/ruby-git/test/ruby/test_io.rb:30:in `block in pipe'


-- 
http://bugs.ruby-lang.org/