無限ループで動作するオブジェクトがあります。オブジェクトをインスタンス化し、メソッドmain()
を呼び出しますrun()
。スレッドを使用したくないので、オブジェクトの実行を停止するためのソリューションが必要です。以下に私が思いついたものを示します。
struct Foo
{
void run()
{
running = 1;
while (running)
do_something_useful();
std::cout << "Execution stopped." << std::endl;
}
bool running;
void catch_signal(int signal)
{
std::cout << "Caught signal " << signal << std::endl;
if( signal == SIGTERM )
running = false;
}
};
ご覧のとおり、非同期でシグナルを送信する必要があります。したがって、シグナルハンドラとを使用しsigaction
ます。以下でmain
私は使用することを想像することができます。
int main(int argc, char** argv)
{
Foo foo;
struct sigaction sigIntHandler;
boost::function< void (int) > f;
f = std::bind1st(
std::mem_fun(&Foo::catch_signal), &foo);
f(5); // this call works
sigIntHandler.sa_handler = f; // compiler complains, "cannot assign ..."
sigemptyset(&sigIntHandler.sa_mask);
sigIntHandler.sa_flags = 0;
sigaction(SIGTERM, &sigIntHandler, NULL);
s.run();
}
私が今期待すること:プログラムは私が送信するまで実行SIGTERM
され、それがキャッチされ、オブジェクトが反復を停止してメインに戻ります。
私は今2つの質問があります:
(a)「Compilercomplains」とマークされた行が表示されるコードでは、メッセージは次のようになります。
boost::function<void(int)> cannot be converted to __sighandler_t {aka void (*)(int)}
これを機能させるには何を変更する必要がありますか?いくつかの例でシグナルハンドラが取得する関数のf
ように、と思います。void f(int)
(b)「あの男は何をしているの?」と思っている人のために:この種のことをもっとうまく解決する方法について何かアドバイスはありますか?