C ++で割り込み信号を処理してデストラクタを呼び出す方法に関連していますか? ですが、私の質問はプログラムの構造化に関するものです。
HDF5 ファイルにデータを書き出すシミュレーション プログラムを作成しています。ただし、プログラムが中断された場合は、蓄積されたデータを引き続き読み取れるように、HDF5 を適切に閉じてください。HDF5 ファイルへのハンドルを含む HDF5 ライター クラスを作成しました。そのクラスのデストラクタが呼び出されると、HDF5 ファイルが閉じられるはずです。したがって、Ctrl-C によるプログラムの中断が発生した場合は、SIGINT をキャッチしてデストラクタを呼び出したいと考えています。
私の読書によると、SIGINTまたはSIGSTPが発行された場合、デストラクタは呼び出されますか? のハンドラー関数はsigaction
非常に単純で、フラグを変更するだけです。これにより、次のようなプログラムが作成されます (2 番目のリンクからコピー)...
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <cstring>
#include <atomic>
std::atomic<bool> quit(false); // signal flag
void got_signal(int)
{
quit.store(true);
}
class Foo
{
public:
~Foo() { std::cout << "destructor\n"; }
};
int main(void)
{
struct sigaction sa;
memset( &sa, 0, sizeof(sa) );
sa.sa_handler = got_signal;
sigfillset(&sa.sa_mask);
sigaction(SIGINT,&sa,NULL);
Foo foo; // needs destruction before exit
while (true)
{
// do real work here...
sleep(1);
if( quit.load() ) break; // exit normally after SIGINT
}
return 0;
}
プログラム構造で、プログラムがフラグを頻繁にwhile
チェックできるように、ループ内の部分を十分に短くする必要があることがわかります。quit
しかし、私の問題は、私のプログラムが次のように構成されていることです。
int main()
{
// set up variables
HDF5Writer writer(...);
run_simulation(&writer, [params]);
}
run_simulation
指定された停止基準が満たされるまでシミュレーションを実行します。これには数分または数時間かかる場合があります。プログラムが何らかのフラグを監視するようにセットアップして、SIGINT を適切なタイミングで受信した後にシャットダウンするようにするにはどうすればよいですか?