Re: Perl5 の signal 処理と DBI と Q4M

今更ですが。

Q4M を使用していると、$dbh->execute がキュー待ちの間ブロックしてくれます。これは便利なのですが、SIGINT をうけとったら終了してほしい。

通常の処理としては SIGINT をうけとったら終了します。

ですが、$SIG{INT} = sub { warn "\シグナル/" }; などと書いている場合、終了しません。

http://d.hatena.ne.jp/tokuhirom/20091202/1259743712

queue_wait() を呼んでいる間って他のことは何もしてないんだから、シグナルハンドラセットする必要ないよね、というのが基本的な考え方です。他のところでシグナルハンドラをセットしているならシグナルハンドラをデフォルト ('DEFAULT') に戻してください。(20:44追記: そうすれば、SIGINT を受け取ると即終了するようになります*1 )

local $SIG{INT} = 'DEFAULT';
$dbh->selectall_arrayref("SELECT queue_wait('q4m_table')")
    or die $dbh->errstr;
...

Q4M に限らず、DBI一般の話として、処理に時間のかかる SQL を投げる場合は上のようにすべきなんじゃないかなーと思った。
#そうしないと、SQL が完了するまで終了しないと思う

*1:各シグナルのデフォルトハンドラの動作は man sigaction すると書いてあると思います。あるいは <signal.h> の表を参照