在Process.wait之后,$?退出了?是假的

时间:2012-08-09 15:59:00

标签: ruby process

如果我运行以下内容:

Process.kill "KILL", pid
Process.wait pid
raise "application did not exit" if not $?.exited?
raise "application failed" if not $?.success?

我收到错误“应用程序没有退出”。为什么Process.wait没有等待?更准确地说,为什么Process.wait$?设置为未退出状态?

2 个答案:

答案 0 :(得分:0)

进程在收到kill信号后立即退出,因此Process.wait会立即将相应的Process :: Status对象分配给$?并允许执行继续。流程::状态#退出?只有当进程正常退出时才返回true,所以你看到的是预期的行为 - SIGKILL通常不会导致正常终止。

答案 1 :(得分:0)

来自Process::Status文档:

  

Posix系统使用16位记录有关进程的信息        整数。低位记录过程状态(停止,        退出,发信号)并且高位可能包含其他内容        信息。

状态exited意味着该过程自行退出(称为exit()的过程)。但是,由于你强行杀死了这个进程,它的状态将改为signaled,这意味着由于未被捕获的信号(在这种情况下为KILL)而退出该进程。