Project

General

Profile

Actions

Bug #21456

closed

IO.close does not work in a rescue IO::TimeoutError block.

Added by dE (dE Techno) about 1 month ago. Updated 20 days ago.

Status:
Rejected
Assignee:
-
Target version:
-
ruby -v:
ruby 3.2.8 (2025-03-26 revision 13f495dc2c) [x86_64-linux]
[ruby-core:122613]

Description

Invoking the close method on an IO object based on popen will forcefully close the process (not sure what signal it sends, it's undocumented), however when you handle a IO::TimeoutError exception (which you can get when you set .timeout), the close method fails to end the process. It's going to block until the process naturally terminates.

Sample code (linux based) --

execArg = 'echo testwrite; sleep 10'
tofuProcess = IO.popen(execArg, 'r')
puts 'executed tofu process.'
tofuProcess.timeout=5
begin
	tofuOut = tofuProcess.read
rescue IO::TimeoutError
	puts 'rescue occured'
	tofuProcess.close
	puts 'process closed'
end
Actions #1

Updated by dE (dE Techno) about 1 month ago

  • Subject changed from IO.close does not work in a IO::TimeoutError block. to IO.close does not work in a rescue IO::TimeoutError block.
Actions #2

Updated by nobu (Nobuyoshi Nakada) about 1 month ago

  • Description updated (diff)

Updated by nobu (Nobuyoshi Nakada) 20 days ago

  • Status changed from Open to Rejected

dE (dE Techno) wrote:

not sure what signal it sends, it's undocumented

No signal is sent.

Send a signal by yourself if you want to stop the process.
Since your example invokes a grand child process, add pgroup option and send "-signal" to the process group.

execArg = 'echo testwrite; sleep 10'
tofuProcess = IO.popen(execArg, 'r', pgroup: true) ###
puts 'executed tofu process.'
tofuProcess.timeout=5
begin
  tofuOut = tofuProcess.read
rescue IO::TimeoutError
  puts 'rescue occured'
  Process.kill "-TERM", tofuProcess.pid ###
  tofuProcess.close
  puts 'process closed'
end
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0