2012-04-22 11 views
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; 
    } 
} 

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

+0

あなたのプログラムがシグナルを受信すると、現在のシステムコールが取り消され、シグナルハンドラが呼び出されます。シグナルハンドラが完了すると、プログラムは中断された後の次のシステムコールに戻ります。 – strkol

答えて

0

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

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

+0

1.彼は共有メモリを使用しているため、OSによってフリーズされることはありません。 2. valgrindでメモリリークを追跡するほうがずっと簡単なので、終了時にすべてのリソースを解放することをお勧めします。 – strkol

+0

いいえ、アプリは終了する必要があります。問題は、shm_openとsemaphoresで作成された共有メモリが/ dev/shmにあることです。 – skornos

+0

@strkol、あなたは外部リソースについて正しいです。しかし、これらのためには、シグナルハンドラでシステムコールを実行することに問題はありません。通常のアドバイスは、 'malloc()'と 'free() 'を避けることです。終了直前に' free(3) 'を呼び出すことは本当に不利な点があります。それはここで長さで議論されており、様々な意見があります。 – DigitalRoss

関連する問題