在Windows上编写ruby脚本时(ruby -v输出ruby 1.9.3p545)我遇到了一个有趣且相当具体的问题。如果用户终止执行,我试图关闭打开的文件。例如,
begin
f = File.open("monkeys.txt", "w+")
#stuff with the file
rescue Exception => e #I know this is a bad idea
puts e.backtrace
ensure
f.close
end
现在,如果我在cmd中运行它时通过Ctrl + C终止执行,这是有效的。但是,当我点击" X"在cmd提示符窗口中,ensure块中的代码不会运行。我尝试过像......
at_exit do
f.close if !f.closed?
end
...但是当按下X按钮时,仍然没有执行我想要的代码。 那么,我该怎么办才能强迫"确保" Ruby中的代码如果通过X按钮关闭了吗?
答案 0 :(得分:0)
嗯,我真的没有为windows编程,所以我可能会迷失在细节上,但让我试着为Linux解决这个问题:
@ppid = Process.ppid
pid = fork do
loop do
sleep(1)
begin
Process.getsid(@ppid)
rescue Errno::ESRCH
File.new("process_down.txt", "a+")
exit(1)
end
end
end
Process.detach(pid)
puts "Process detached"
这样做是因为它创建了一个分叉进程,将它与主进程分离并继续侦听主进程何时被终止(如果@ppid不再存在,它将在Process.getsid上抛出Errno :: ESRCH ),所以它将创建一个.txt文件并退出。我不知道如何处理窗口中的分叉和pid,但这只是试图向你展示一些可能性=]