3

のようなアトミック型でない限り、グローバル変数はシグナルハンドラで更新されませんsig_atomic_t。次の 2 つの条件を考えると、シグナル ハンドラでグローバル変数を安全に編集できますか?

  1. シグナルハンドラを 1 つだけ定義する場合
  2. sa_maskofを使用struct sigactionしてハンドラーのすべてのシグナルをブロックする場合
  3. アプリケーションはシングルスレッドです

詳細の追加: 子プロセスの情報を保持する小さなグローバル リンク リストを取得しました。SIGCHLD (親プロセス) をキャッチしたら、シグナル ハンドラーでそのノードをリンク リストから削除します。上記の条件で、ある種の pthread_mutex_trylock() を使用して、シグナル ハンドラーでこのアクションを実行できますか?

4

2 に答える 2

0

シグナル ハンドラーには、静的データ構造へのアクセスに問題があります。これから、破損したデータなどを取得できます。シグナル ハンドラ内で printf() を呼び出そうとすると、何度も奇妙な出力が得られます。

アトミック型を使用しない限り、グローバル変数についても同様です。

シグナルハンドラーはグローバル変数を認識しません

于 2013-08-14T12:56:07.983 に答える
0

タイプsig_atomic_tは間違いなく更新されます。シグナルハンドラーのコンテキスト外で更新される他の型に依存することはできません。そうかもしれませんし、更新されないという保証は絶対にありません。ただし、これは、キャッシュと複数のプロセッサ、非同期実行などの処理に帰着します。変数が変更されないとコンパイラが判断した場合、コンパイラはその変数をレジスタにロードし、再ロードしないことがあります。それは許可されていないsig_atomic_tため、「失敗することはありません」。

これは、「異なるスレッドでグローバル変数を更新する」に似ています。更新は、ロックの下で、または特別なアトミック タイプを使用して行う必要があります。ロックが保持されているときにシグナル ハンドラが呼び出される可能性があるため、シグナル ハンドラでロックを使用することはできません。

于 2013-08-14T13:01:35.127 に答える