2

操作の実行中にデータが破損することが心配ですStorable::store。特定のチェックポイントで計算をバックアップするために約 100 MB を NFS に書き込んでいますが、そのプロセスは必ずしも高速ではありません。

破損を防ぐために、SIG{INT}シグナル ハンドラーがあります。が呼び出される直前にStorable::store、安全に終了できないことを示すグローバル変数が設定されます。完了するとすぐにStorable::store、そのグローバル変数は値に戻され、中断しても問題ないことを示します。

このグローバル変数は、シグナル ハンドラが呼び出すdieかどうか、または「まだ停止できません」というステートメントを出力するだけかどうかを示すために使用されます。

しかし、私は本当に何かを助けていますか?perlipcを読んでみると、IO の中断は安全に行われる場合もあれば、安全に行われない場合もあることがわかります...つまり、Storeable::store操作の途中でシグナル ハンドラが呼び出された場合、シグナル ハンドラのサブルーチンへのこのような短い迂回が必要になる場合があります。まだ物事を台無しにするのに十分です。

Storableそのような状況でどのように機能するか知っている人はいますか? または、私の信号処理設定は実際に適切ですか?

4

2 に答える 2

4

Since 5.8.1, Perl uses "safe signals" (by default). When you setup a signal handler through %SIG, Perl actually installs a simple signal handler that does nothing but increment a counter. In between Perl ops, Perl checks if the counter is non-zero, and calls your signal handler if it is. That way, your signal handlers don't execute in the middle of a system call or library call.

There are only two things you need to worry about:

  • Modifying global vars (e.g. $!) in your signal handler.
  • System calls returning EINTR or EAGAIN because a signal came in during the call.
于 2013-02-20T02:54:33.590 に答える
2

SIGINT破損する可能性があることが本当に心配な場合は、シグナルハンドラーにstore追加してみてください。SA_RESTARTLinuxでは、これにより、システムコールがシグナルに応じて自動的に再試行されます。これSIGINTにより、I / O操作から抜け出すことができないため、シグナルハンドラーが無期限に延期される可能性があります。Storable::storeただし、中断が発生した場合でも安全に操作できるようにする必要があります。

于 2013-02-20T02:12:41.197 に答える