2017-02-15 27 views
2

私は、高優先度着信メッセージを処理するためのキャッチハンドラ機能をセットアップするためにシグナル(SIGUSR2)を使用するプログラムを持っています。Cシグナルの使用とIPCメッセージキューを使用したプロセス

プログラムは、メインループのmsgrcv()を使用して、IPCメッセージキューから受信メッセージを受信します。 IPCメッセージキューへのメッセージの送信者が、優先度が高いものが入っていることをプログラムに通知したい場合、SIGUSR2をプロセスに送信して、処理中のメッセージを処理しないようにします。私は最初のエントリ時に行うシグナルキャッチハンドラ関数で

信号(SIGUSR2、SIG_IGN);

プリエンプションの新しい信号を無視します。

、コードは、それがバックキュー、ハウスキーピング、等に現在処理中のメッセージを格納し、次にちょうどシグナルハンドラ関数から戻る前にそれがないプリエンプション要求処理:

信号(SIGUSR2、sighandler_funcを);

質問:上記のシグナルコールが の後にちょうど1ナノ秒後に別のフラッシュ処理信号が受信された場合、プロセスは シグナルハンドラ機能に再度ディスパッチしますか?すなわち、メインループのコードで、プリエンプション信号の受信を開始/停止するためにsighold(SIGUSR2)とsigrelse(SIGUSR2)を実行するコードが優先された場合、または信号呼び出しの上の シグナルハンドラ?

+0

[マジック8ボール](https://en.wikipedia.org/wiki/Magic_8-Ball)には「返信が嫌な、再試行する」と表示されています。 [最小限の、完全で検証可能な例](http://stackoverflow.com/help/mcve) - 好ましくは実際のコードを投稿してください。 –

+0

優先度の高いメッセージに2番目のキューを使用するだけで、はるかに簡単で本質的な方法があるようです。 –

+0

は同意しましたが、私は変更できる範囲でクライアントが制限しています。 – user3053087

答えて

2

あなたはそのためにはsigactionを使用する必要があります。

struct sigaction act; 
memset(&act, 0, sizeof(act); 
act.sa_handler = sighandler_func; 
sigaction(SIGUSR2, &act, NULL); 

この方法は、シグナルハンドラが自動的に(あなたのケースSIGUSR2で)イベントを発生させた、ブロックされた信号と呼ばれています。ハンドラの実行中にSIGUSR2が到着した場合、ハンドラはシグナルハンドラが返るまでブロックされます。次に、(シグナルがブロックされていないとき)、シグナルハンドラが直ちに呼び出されます。それは、その後だけ一度ハンドラの復帰後に呼び出されますので、

しかし、あなたはケースを処理する必要がありますが、その複数のSIGUSR2は、適切にシグナルハンドラの1つの実行中に到着しました。

+0

はい、次のバージョンでは、シグナル処理呼び出しはすべてsigactionを使用するPOSIX準拠の呼び出しを使用して行われます。 – user3053087

関連する問題