私は少し読んでいました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()
ですか?