C言語システムコール-sigsuspend
sigsuspendシステムコール
概要
sigsuspendは一時的にシグナルマスクを変更して、シグナルの到着を待ちます。
設定されたシグナルを受信するまで、そのプロセスを停止します。
sigsuspendシグナルを受信してリターンするので、戻り値は常に「-1」を返します。
また、通常はEINTRエラーが発生します。
サンプルプログラム
SIGINT([Ctrl] + [c])を待ち合わせます。
SIGINTを受信すると、10秒間待ち合わせて通常処理に戻ります。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
/*!
* @brief カウントダウンして時間待ち合わせ
*/
static void
count_down()
{
int cnt = 0;
fprintf(stdout, "\nsignal recieved.\n");
fflush(stdout);
for(cnt = 10; cnt > 0; cnt--){
fprintf(stdout, "wait: %02d(sec)\r", cnt);
fflush(stdout);
sleep(1);
}
fprintf(stdout, "\n");
fflush(stdout);
}
/*!
* @brief シグナルの到着を待つ
* @return 0:success/-1:failure
*/
static int
signal_suspend(void)
{
int rc = 0;
sigset_t set = {0};
struct sigaction act;
memset(&act, 0, sizeof(act));
act.sa_handler = count_down;
printf("Waiting SIGINT.\n");
rc = sigaction(SIGINT, &act, NULL);
if(rc < 0){
printf("Error: sigaction() %s\n", strerror(errno));
return(-1);
}
/* シグナル集合を空に初期化する。*/
sigemptyset(&set);
/* シグナルの到着を待ち合わせる */
sigsuspend(&set);
printf("Arrived SIGINT.\n");
return(0);
}
int
main(int argc, char *argv[])
{
int rc = 0;
if(argc != 1){
fprintf(stderr, "Usage: %s\n", argv[0]);
exit(EXIT_FAILURE);
}
rc = signal_suspend();
if(rc != 0) exit(EXIT_FAILURE);
exit(EXIT_SUCCESS);
}
関連ページ
- C言語
- C言語システムコール
- C言語システムコール-chdir
- C言語システムコール-chroot
- C言語システムコール-fork
- C言語システムコール-execve
- C言語システムコール-wait
- C言語システムコール-getpid
- C言語システムコール-getpriority / C言語システムコール-setpriority
- C言語システムコール-getpgid / C言語システムコール-setpgid
- C言語システムコール-getuid / C言語システムコール-setuid
- C言語システムコール-getsid / C言語システムコール-setsid
- C言語システムコール-getgroups / C言語システムコール-setgroups
- C言語システムコール-getrusage
- C言語システムコール-getrlimit / C言語システムコール-setrlimit
- C言語システムコール-nanosleep
- C言語システムコール-kill
- C言語システムコール-sigaction
- C言語システムコール-sigsuspend
- C言語システムコール-signal
- C言語システムコール-getitimer
- C言語システムコール