2011-07-12 15 views
4

)、私が持っている:シグナルが捕捉されないのはなぜですか? (私のメインの先頭に

signal(SIGTERM, SIGTERM_handler); 

SIGTERM_handlerは次のとおりです。

void SIGTERM_handler(int signum) { 

    NSLog(@"Caught signal: [%d]. Cleaning up ...",signum); 
    //cleanup(); 
    NSLog(@"Done cleaning up. Exiting ..."); 
    exit(EXIT_FAILURE); 
} 

これらの線が印刷されることはありません。ハンドラでブレークポイントを設定すると、決してヒットしません。私はどこでもsigaction()と呼んでいません。 GDBは、私が心配しているシグナル(handle SIGTERM SIGINT pass stop printまたはhandle SIGTERM SIGINT pass nostop printのいずれか)を通過するように設定されています。デフォルトのシグナルハンドラでさえ機能していません - SIGINT(ハンドラを指定していない)をプログラムに送ることも何もしません。

この原因は何ですか?

+0

ログファイルバッファがフラッシュされない可能性はありますか? –

+0

シグナルがgdbで実行されているときに、シグナルをプロセスにどのように送信しますか?私は他のシグナルの1つを試してみることをお勧めします(kill -1またはkill -2) – KevinDTimm

+0

私は 'kill -2'、' kill -15'などでシグナルを送信しています。 GDBは本当に停止し、私のプログラムがシグナルを受け取ったと言うので、それが働いているのを知っています。それでもハンドラは起動しません。 –

答えて

2

Shawn、あなたはzctx_new()を実行するたびに、独自の目的のために信号を迂回するCZMQを使用しています。可能であれば、CZMQにグローバルなzctx_interrupted変数、およびすべてのブロッキングZMQコール、ヌルリターン、およびEINTRエラーコードが提供するメカニズムを使用して、CZMQがそのことを行い、割り込みをトラップできるようにすることです。

5

私はObjective Cのを知らないが、私はシグナルハンドラの経験を持っている、そうで「非同期シグナル安全」として文書化されていない任意の関数を呼び出すPOSIXおよびC.

のためかのように私がお答えしますシグナルハンドラは危険であり、避けるべきです。シグナルハンドラが呼び出されたとき、スタックやその他の状態について何も仮定することはできません。シグナルハンドラが呼び出されたときに、スタックは "ゴミ箱"(フレームの作成または破壊の途中で)さえあるかもしれません。シグナルハンドラが呼び出されると、ライブラリの状態が矛盾する可能性があります。

イベントループなどでチェックされる揮発性フラグ(int)を宣言して、変更されているかどうかを確認します。シグナルハンドラは、そのフラグをセットしてリターンするだけです。 (あなたのプラットフォームがSVR4形式のシグナルを出さない限り、シグナルハンドラ内にシグナルハンドラを再インストールする必要があります。)

ログメッセージやその他の活動は、コードフラグをチェックし、フラグによって暗示されるイベントを処理する。

あなたが見ている症状はシグナルハンドラのライブラリ呼び出しによるものではないかもしれませんが(私のお金は正直なところgdbインタラクションになります)、シグナルハンドラからすべてのライブラリ呼び出しを取り出すことをお勧めします。

0

czmqのzsocket_newと関係があることが判明しました。 zctx__socket_newに切り替えました。私はまだ何が起こっているのか正確に調べるために掘り下げていない。

0

これはデバッガで実行していますか?私は、GDBの立ち上げの内部と外部のiOSプラットフォーム上で、信号が異なる方法で処理されるという問題にヒットしました。私は同じ問題がOSXで発生すると思います。それは長い時間でしたし、具体的なことはできません

関連する問題