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

按下X按钮时在Ruby on Windows中强制执行代码,ruby,windows,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中运行此命

在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终止执行,则此操作有效。但是,当我在cmd提示符窗口中点击“X”时,确保块中的代码不会运行。我尝试了一些像

at_exit do
f.close if !f.closed?
end
…但当按下X按钮时,仍然无法执行我希望它执行的代码。
那么,如果Ruby是通过X按钮关闭的,我该怎么做才能在Ruby中强制执行“确保”代码呢?

好吧,我并不是真的为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文件并退出。我不知道如何在windows中处理forking和PID,但这只是尝试向您展示一些可能性=]

我认为关闭
CMD
窗口将(强制)杀死通过CMD运行的任何进程。这意味着ruby无法进行拯救,因为进程无法关闭。但当然,当操作系统终止进程时,它会关闭所有打开的文件并释放所有内存。这很有意义。这是否意味着我对此无能为力?编辑:更确切地说,我正在编写一个脚本,将RNG输出附加到文本文件中。我正在尝试这样做,即使用户退出了应用程序,最新的输出仍然会写入文件。作为普通的cmd shell程序编号。如果您使用的是实际运行的windows应用程序,它使用windows API,创建自己的窗口,并响应通过单击X生成的窗口关闭事件。Google for
ruby windows gui
对此,我无能为力。如果你继续刷新缓冲区,那么即使你无法关闭窗口,数据最终进入文件的可能性也会更高。