Forum: Ruby IO not closed by GC

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
519a4d4a2a70c0c6ad0447575d71d4cc?d=identicon&s=25 Stephan Maka (Guest)
on 2006-04-17 18:57
(Received via mailing list)
Hello,

I often use constructions like the following:

os = IO.popen('uname -sr').readlines.to_s.strip

I assume that the Garbage Collector throws away the IO instance created
by IO::popen, because it's simply not needed after that line anymore.

What I've experienced is, that it leaves a zombie for each time I use
such an instruction.

---

loop {
  zombies = IO.popen('ps ax|grep defunct|wc -l').readlines.to_s.strip
  puts "Number of zombies: #{zombies}"
}

---

This code produces about 100 defunct processes in about 2 seconds.
Operating system is FreeBSD 6.1-RC.

However, if I close the IO object manually, defunct processes stay
constantly at 2-3.

---

loop {
  io = IO.popen('ps ax|grep defunct|wc -l')
  zombies = io.readlines.to_s.strip
  io.close
  puts "Number of zombies: #{zombies}"
}

---

Is this assumed behaviour or a bug? I guess there's a close(2) or
waitpid(2) missing in the IO code...

Stephan.
9358cc96c46055cd68d4a76a9aefe026?d=identicon&s=25 Daniel Harple (Guest)
on 2006-04-17 20:05
(Received via mailing list)
On Apr 17, 2006, at 6:55 PM, Stephan Maka wrote:

> Is this assumed behaviour or a bug? I guess there's a close(2) or
> waitpid(2) missing in the IO code...

See ``ri IO#close''. Use the block form if you do not want to call
close manually.

> os = IO.popen('uname -sr').readlines.to_s.strip

Calling IO#readlines.to_s is a rather indirect way of calling IO#read.

Try:

     os = `uname -sr`.strip

or

     os = %x{uname -sr}.strip

-- Daniel
This topic is locked and can not be replied to.