1

シグナルをリッスンする実行中のプロセスの中断に関して質問があります。以下は私のハンドラーです。SIGHUP は設定ファイルのリロードに使用され、SIGCHLD は生成されたプロセスで nohang を使用して waitpid を使用し、その他はプロセスを終了するために使用されます。

void sig_handler( int sig, siginfo_t *siginfo, void *ucontext )
{
    if ( sig == SIGHUP ) {
        reload = 1;
    } else if( sig == SIGCHLD) {
        // TODO
    } else if ( sig == SIGTERM || sig == SIGKILL || sig == SIGINT ) {
        done = 1;
    }
}

do {
    if(reload) {
        // opening files, doing file descriptor stuff
        ... // processing...
        **SIHUP OCCURS! WHAT HAPPENS?** <<<<<<<<<<< Line: 505 <<<<<<<<<<<<<<<<<<
        ... // processing...
    }
} while(!done);

私の現在の信号の理解:

  • 信号発生
  • 505 行目で現在の操作を完了します。つまり、open("t.txt");
  • シグナル ハンドラー コードを実行して完了する
  • 505行目に戻って続行

私が心配していること:

  • 信号発生
  • 現在のコードから抜け出す
  • シグナル ハンドラー コードを実行して完了する
  • コードのブレークアウトから続行

質問:

  1. シグナルが発生した場合にコードが不安定にならないように、構成のリロード中に SIGHUP、SIGTERM、SIGCHLD をブロックするようにコードを拡張する必要がありますか? それともオーバーデザイン?(その後再開しないと仮定して)
  2. SIGHUP のシグナル ハンドラーにいるとしますが、SIGHUP シグナルが発生すると、何が起こりますか? (それらをキューに入れ、ハンドラーを2回実行すると仮定します)

ありがとう!

4

1 に答える 1

0

実際には、シグナルが発生した場合、シグナル ハンドラが呼び出される前に現在の操作が終了するとは限りません。ただし、シグナル ハンドラーが完了すると、シグナルが中断されたときの正確な場所からコードが再開されます。また、シグナル ハンドラーはフラグ変数を設定するだけなので、現在実行中のコードには何の影響もありません。

答え:

  1. なぜわざわざ?コード後で再開され、適切に設計されたシグナルハンドラーはコードを不安定にすることはありません。
  2. ドキュメントは、最初のハンドラーが完了するまで 2 番目のシグナルの処理が延期されることを示しているようです。詳細については、この質問を参照してください。
于 2013-10-04T03:24:26.703 に答える