[TOP][UP][<-PREV][NEXT->]

Rubyの終了処理

Ruby はスクリプトの終端に達した場合や捕捉していない例外が発生した場 合に終了します(関数 exitabort 、メインスレッドに対する Thread.kill などは SystemExit 例外を発生させます)。終了時には以下 の処理が順に実行されます。

  1. すべてのスレッドを Thread.kill する
  2. Ruby の疑似シグナル SIGEXIT のハンドラが登録されていればそれを実 行する(trap を参照)。
  3. END ブロック(END { ... } または関数 at_exit で指定したブロック)が登録されていれば、 そのブロックを登録とは逆順に実行する。このブロックの実行中に発生 した大域脱出はそのブロックの処理を中断するが。スクリプトはまだ終 了しない。
  4. ObjectSpace.define_finalizer により、ファイナ ライザが登録されていればそれらを実行する(実行順序は不定)

    ファイナライザ実行中に発生した大域脱出はそのファイナライザの処理 を中断するが、スクリプトはまだ終了しない。

  5. exit(3) により終了する*1*2*3 *4 *5

ただし、関数 exit! による終了は、_exit(2) を実行するだけで、上記の処理はいずれも行われません。


*1status はどんな値になる?
*2あらい 2002-02-23: 終了する方法次第です。ここでは終了時の内部処理について触れてるのであしからず
*3ならば値に触れているページへのリンクがあると良いと思います
*4あらい 2002-02-23: ありますよ。exit とか abort とか書いてるで しょー(^^)。例外については書いてないかもしれないですね。ちょっと ソースを見てました。SystemExit による例外以外は終了ステータス 1 で終了します。SystemExit を明示的に raise したときは 0 です。こ れ、意図されてるのかな?ソースからじゃなんとも判断つかないや
*5あらい 2002-02-23: 上記「終了処理」の対象ではありませんが、 オプション解析時には終了ステータス 2 で終 了(exit(3))することがあります(不正なオプション 指定)。スクリプトの parse error は、エラーの個数(だけど普通は 1。 1 以外を返すことはないかな?)で終了(exit(3))。 コマンドを実行できなかった子プロセスは 127 で終了 (_exit(2)) します(シェルと同じだ)。etc...


[TOP][UP][<-PREV][NEXT->]