7

私は少し読んでいましたsigaction()(ソースはコースノートからのものです)が、このテキストを理解しているかどうかわかりません:

シグナル マスクは、シグナル ハンドラの期間中だけ計算され、インストールされます。

デフォルトでは、シグナルが発生すると、シグナル「sig」もブロックされます。

sigaction を使用して特定のシグナルに対してアクションがインストールされると、別のアクションが明示的に要求されるまでインストールされたままになります。

これは、シグナル ハンドラから戻った後にデフォルトのシグナル マスクが復元されるということですか? また、ハンドラーを使用した後にハンドラーを再インストールする必要がありsignal()ますか?

また、次のコードがあります。

#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void termination_handler(int signum) {
    exit(7);
}

int main (void) {
  struct sigaction new_action,old_action;
  new_action.sa_handler = termination_handler;
  sigemptyset(&new_action.sa_mask);
  sigaddset(&new_action.sa_mask, SIGTERM);
  new_action.sa_flags = 0;
  sigaction(SIGINT, NULL, &old_action);
  if (old_action.sa_handler != SIG_IGN) {
         sigaction(SIGINT,&new_action,NULL);
  }
  sleep(10);
  return 0;
}

それで - どのように正確SIGTERMに処理されますか? インストールされたハンドラは ですtermination handler()が、SIGTERMを使用せずにシグナル マスクに追加されていることがわかりsigprocmask()ます。これは何を意味するのでしょうか?ありがとう!

Ps 最後の質問: のifステートメントはなぜmain()ですか?

4

1 に答える 1