
私のUnix実行可能ファイルの作業は長い計算を実行することで、以下に説明するように中断/再開機能を追加しました。
プログラムは、これまでに見つかったすべての関連データを定期的にチェックポイントファイルに記録し、このファイルは「回復」操作の開始点として使用できます。
プログラムを中断するにはCtrl+を使用しますC。
このアプローチの唯一の問題は、プログラムがファイルに書き込んでいる間に中断が発生した場合、役に立たない半分だけ書かれたファイルが残るということです。
これまでに見つけることができる唯一の修正は次のとおりです。
- プログラムの作成
- 再起動時にそれらの1つを読み取るために2つのファイルを作成します。
「中断可能な」Unix実行可能ファイルを生成するよりクリーンでより良い方法はありますか?
答え1
これは、プログラム自体の競合に興味があるのか、システム全体の衝突に興味があるのかによって異なります。
最初のケースでは、新しいデータを新しいファイルに書き込んだ後、書き込みが完了した後にのみ実際の名前に名前を変更できます。これにより、ファイルに古いまたは新しいチェックポイントデータが含まれますが、部分的な情報のみが含まれません。部分書き込みは、いずれにせよまれですが、チェックポイントコード自体が失敗する可能性が低いと仮定し、関連がある場合シグナルプログラムが終了する前に新しいチェックポイントがそのまま保存されていることを確認するためにトラップされます。 (除外してもSIGINT
掴むのが良いようです。)SIGHUP
SIGTERM
システム全体がクラッシュする可能性を考えると、1つのチェックポイントファイルしか信頼できません。システムがファイル書き込みシステムコールから戻ると、データが実際にディスクにある可能性はほとんどありません。代わりに、オペレーティングシステムとディスク自体がデータをキャッシュし、後で実際に書き込むことができます。したがって、以前のチェックポイントを 1 つまたは 2 つ保持すると、このようなことが発生しないようにする安全装置として機能することができます。
答え2
シグナルハンドラを使用して、押したSIGINT
ときにプロセスに送信される信号をキャプチャできます。Ctrl-C
これにより、プロセスは直ちに終了せず、シグナルハンドラが呼び出されます。その後、結果をシグナルハンドラのファイルに書き込むことができます。これは一般的な考えであり、実際にはいくつかの詳細に注意を払う必要があるかもしれません。