C言語,sleep()関数で指定した秒数の間だけ処理を停止する

スポンサーリンク

鍛錬 794

C言語,sleep()関数で指定した秒数の間だけ処理を停止する

指定した秒数の間だけ処理を一時停止するには、sleep()関数を使用します。
 
以下は、sleep()関数についてです。

#include <unistd.h>

unsigned int sleep(unsigned int seconds);
 

引数

以下は、上記の引数についてです。

引数 意味
unsigned int seconds 処理を停止する秒数

戻り値

以下は、戻り値についてです。

戻り値
unsigned int 指定した時間を過ぎた場合 0
unsigned int シグナルハンドラに割り込まれた場合 残りの停止時間
スポンサーリンク

プログラム

以下は、処理を一時停止するプログラム、test_sleep.c です。

今回は、10秒間停止しています。

シグナルハンドラに割り込まれた場合の挙動を確認するために、今回はsigaction()関数を使用してシグナル SIGINT を受信した際の動作を設定しています。

関連記事:C言語,sigaction()関数でシグナル受信時の動作を設定

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

// prototype
void CheckSignal(int num);

// main
int main(void)
{
	unsigned int ui_ret;
	int ret;
	struct sigaction act;
	
	// SIGINTを捕捉した際の動作を設定
	memset(&act, '\0', sizeof(act));
	act.sa_handler = CheckSignal;
	act.sa_flags = 0;
	ret = sigaction(SIGINT, &act, NULL);
	if (ret == -1) {
		perror("sigaction");
		exit(EXIT_FAILURE);
	}
	
	// 処理を一時停止
	printf("sleep開始\n");
	system("date");
	ui_ret = sleep(10);
	if (ui_ret != 0) {
		printf("残り%u秒を残してsleep()が終了した\n", ui_ret);
	}
	printf("sleep終了\n");
	system("date");
	
	return 0;
}

// ======================================================
// @brief  捕捉したシグナル番号を表示するシグナルハンドラ
// @param  signum [in],シグナル番号
// @return 無し
// @note   無し
// ======================================================
void CheckSignal(int signum)
{
	write(1, "\n", 1);
	switch (signum) {
		case SIGINT:
			write(1, "SIGINT\n", 7);
			break;
		default:
			break;
	}
}
スポンサーリンク

実行結果

以下は、プログラム test_sleep.c を実行しています。

シグナルハンドラの割込みが無かった場合

以下は、シグナルハンドラの割込みが発生せずに、指定した時間だけ処理を中断した場合の実行結果です。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_sleep.c -o test_sleep
***@ubuntu:~/***/test/c$ ./test_sleep
sleep開始
Sat Mar 21 07:01:11 JST 2020
sleep終了
Sat Mar 21 07:01:21 JST 2020

 
上記に示した通り、7時1分11秒から7時1分21秒まで、10秒間処理を停止することができました。

シグナルハンドラの割込みが発生した場合

以下は、シグナルハンドラの割込みが発生した場合の実行結果です。

開始から3秒後にキーボードにて Ctrl + c を押下し、シグナル(SIGINT)を発生させています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_sleep.c -o test_sleep
***@ubuntu:~/***/test/c$ ./test_sleep
sleep開始
Sat Mar 21 07:01:36 JST 2020
^C
SIGINT
残り7秒を残してsleep()が終了した
sleep終了
Sat Mar 21 07:01:39 JST 2020

 
上記に示した通り、シグナルハンドラの割込みが発生したため、残りの停止時間(今回は7秒)をsleep()関数の戻り値として取得することができました。

タイトルとURLをコピーしました