0

私は C でプログラムを書いており、POSIX 共有メモリを使用するいくつかの子プロセスを作成しています。現在、プログラムが SIGINT などのシグナルによって中断された場合の処理​​を試みています。シグナル関数をインストールする必要があることはわかっていますが、コードの一貫性がないため、シグナルハンドラーでリソースを直接解放するのは良くないため、ブールフラグを切り替えるだけで済みます。一方、私の主なコードは、フラグが切り替わるまでループします。

したがって、次のようになります。

 bool signal_interrupt = false;     

 void sig_handler(int sig_num)
 {
   signal_interrupt = true;
 }

 int main(void)
 {
   while (!signal_interrupt)
   {
     /* code, arguments processing, functions calling...*/
     signal_interrupt = true;
   }
 } 

私の問題は、プログラムの一部の機能でリソースを解放する方法がわからないことです。関数のコードは、メイン関数に示されているのと同じループにある必要がありますか? プログラムは信号割り込みにどのように反応しますか? 現在の関数からメインに戻り、シグナル関数が見つかった場合、そのハンドラーが呼び出されますか? アドバイスをありがとう、私は本当にこれを理解したいです。

4

1 に答える 1

0

そうです、共有メモリなどの外部リソースを解放する必要があります。

ただし、システムコールはプロセスの観点からはアトミックであるため、シグナルハンドラから実行しても問題はありません。外部リソースデストラクタを呼び出して終了するだけです。(free(3)を呼び出すことを心配しないでください。)

于 2012-04-22T19:12:53.980 に答える