Linux sigsuspend()関数の使い方は?
sigsuspend() 関数は、指定されたシグナルハンドラが呼び出されるまで、現在のプロセスを一時停止するために使用されます。その関数プロトタイプは次のとおりです。
int sigsuspend(const sigset_t *mask);
sigsuspend() 関数を使用する手順は次のとおりです:
- sigset_t typeの変数を生成し、sigemptyset()関数を使ってからっぽのセットとして初期化する。
- sigaddset関数を使用して、ブロックが必要なシグナルをsigset_t変数に追加する
- sigprocmask()関数を使用してsigset_tの変数を待機中のシグナルマスクに設定します。この手順は、sigsuspend()関数呼び出し中に指定したシグナルによってプロセスが中断されないようにするために必要です。
- sigsuspend() 関数をコールし、sigset_t 型の変数を引数として渡します。
- sigsuspend() 関数は、シグナルハンドラを呼び出すと -1 を返し、errno に EINTR が設定されます。このとき、errno を確認することで、シグナルハンドラ呼び出しによる復帰かどうかを確認できます。
- シグナルハンドラ内で、グローバル変数や他の手法を使用して、メインプログラムに続行を通知できます。
以下はsigsuspend()関数の使用方法を示す例です。
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
void sig_handler(int signum) {
printf("Received signal %d\n", signum);
}
int main() {
struct sigaction sa;
sigset_t mask;
// 设置信号处理程序
sa.sa_handler = sig_handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGINT, &sa, NULL);
// 设置需要阻塞的信号
sigemptyset(&mask);
sigaddset(&mask, SIGINT);
// 阻塞指定的信号
sigprocmask(SIG_BLOCK, &mask, NULL);
printf("Waiting for signal...\n");
// 挂起进程直到指定的信号处理程序被调用
sigsuspend(&mask);
printf("Resumed execution\n");
return 0;
}
SIGINT シグナルをブロックし、シグナルを受け取るとシグナルハンドラを呼び出します。 sigsuspend()関数が返るとプログラムは実行を続けます。