概要
C 言語における sigtimedwait()
関数の使用方法をメモ。
サンプルコード
#define TIME_OUT_MS (3000) // タイムアウト時間.
#define SIGNAL_HOGE (SIGRTMIN+3) // 送受信するシグナル.
// ------------略----------------
sigset_t sigset;
siginfo_t siginfo = (siginfo_t){0};
struct timespec timeout = (struct timespec){0};
int timeout_ms = TIME_OUT_MS; // タイムアウト時間(ミリ秒).
sigemptyset(&sigset);
sigaddset(&sigset, SIGNAL_HOGE);
// tv_nsec には 1,000,000,000 以上の値が入ってはならない.
// この例では timeout_ms がミリ秒なので、↓のように処理しておく.
if(timeout_ms >= 1000){
timeout.tv_sec = timeout_ms / 1000;
timeout.tv_nsec = (timeout_ms % 1000) * 1000 * 1000;
}
else{
timeout.tv_sec = 0;
timeout.tv_nsec = timeout_ms * 1000 * 1000;
}
// シグナル待機.
// シグナル受信 or タイムアウト時間経過まで、処理はここでブロックされる.
if(sigtimedwait(&(sigset), &siginfo, &timeout) < 0){
if(errno == EAGAIN){
printf("sigtimedwait timeouted in %s, line %d, file %s\n", __func__, __LINE__, __FILE__);
// タイムアウト.
// タイムアウトの場合の処理を書く.
}
else if(errno != EINTR){
fprintf(stderr, "sigtimedwait for SIGNAL_HOGE failed with errno: %d, in func %s, line %d, file %s\n", errno, __func__, __LINE__, __FILE__);
exit(EXIT_FAILURE);
// タイムアウトと割込み以外のエラーはここではじく.
// Ctrl-C の時の動作がわからんかったので EINTR 以外としたが、EINTR を除外しなくてもいいかも? わからん.
}
}
else{
printf("SIGNAL_HOGE received in %s, line %d\n", __func__, __LINE__);
// シグナル受信.
// シグナルを受信した場合の処理を書く.
}