在按下X按钮时在Windows上强制执行Ruby代码

时间:2014-08-03 08:54:16

标签: ruby windows

在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按钮关闭了吗?

1 个答案:

答案 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,但这只是试图向你展示一些可能性=]