- 通常、Perl?やGauche?等のスクリプト言語では、exit等の終了時には、キチンと終了処理が行われる。
- たとえば、開きっぱなしのファイルハンドルがあれば、flushしてからcloseされるし、mysql等のdbh等でも同様にdisconnectされる。
- これは、たとえGC?無しのC?であっても、exit時にはファイルハンドル等は自動的に閉じられる。
- しかし、execで別のコマンドを実行する場合は、この終了処理は行われない。
- つまり、ファイルハンドルは開きっぱなしで放置、mysql等のdbhもconnectしっぱなし。
- なので、execで自分自身を再実行するような場合(他のコマンド実行でも同様だが)は、キチンと自分自身で全ての終了処理を行わなくてはならない(それをやらないと、開いたファイルハンドルが増殖してアカウントやosの限界に達したり、mysqlのコネクションが増殖してmysqldの設定の最大数に達したりして困る)。
- コレは結構な罠だが、fork時には、コレを逆に利用できる(というか、このforkの為に、execはこんな仕様になっている)。
- fork前にdbh等を開いていて、forkを行い、子プロセスが終了する時にexit等をした場合、上記の終了処理がキチンと行われてしまうので、「子プロセスがdbhをdisconnectする」→「親プロセスもdbhがdisconnectされてしまう」という事になってしまい、非常に困る。
- コレは、子プロセスがexecで終了すれば、回避できる。
- C?の場合は、何も考えずにabort()で終わってしまってもいいっぽい。
- Gauche?では、sys-exitを使う事で、クリーンアップを全く行わずに終了する事が出来る。
最終更新 : 2004/06/09 17:50:08 JST