【C言語入門】sleep関数で一定時間停止(Sleep/usleepの違いも解説)

C言語には、処理を止めるためにsleep関数があります。

この記事では、指定した時間だけ処理を止める手段としてsleep関数とその類似関数についてみてきましょう。

今回は

指定時間処理を待機させたい!
という目的を達成するために、以下の流れでsleep系処理について学んでみましょう。

  • [基本]sleep関数とは
  • [基本]sleep関数を使って処理を止める方法
  • [基本]Sleep関数の使い方
  • [基本]usleep関数を使ってマイクロ秒単位で処理を止める方法
  • [応用]while文を使って簡易待機処理を自作する方法

それではよろしくお願いいたします。

目次

sleep関数とは

C言語で処理を止めるには、<unistd.h>ライブラリーのsleep関数を使います。

sleep関数とは、処理を指定した時間だけ止める関数です。sleep関数は次のように使います。

#include <unistd.h>
unsigned int sleep(unsigned int 止めたい秒数);

また難しい話となるため、初心者の方は気にしなくても良いですが、単に止めるだけでなく停止中は、 CPUの使用権を他のプログラムへ回してくれています。

大量の処理をループしている時などに、sleep関数を定期的に合間に入れることで、負荷の軽減も測れます。

処理を指定した時間止める関数の使い方

sleep関数で1秒単位で止める方法

sleep関数を使えば、指定した秒数だけ処理を止めることができます。sleep関数を使うには、unistd.hというライブラリーを使用します。

それでは、実際のコードを見ていきましょう。

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int second = 5;

    printf("%d秒間止まります。\n", second);

    sleep(second);

    printf("%d秒間止まりました。\n", second);

    return 0;
}

実行結果:

5秒間止まります。
5秒間止まりました。

このように、sleep関数を使って、指定した時間だけ処理を止めることができました。

Sleep関数を使ってミリ秒単位で止める方法

Sleep関数を使うと、ミリ秒単位で処理を止めることができます。ミリ秒とは、msとも書き、1/1000秒となります。

それでは、実際に5秒止めるコードを見てみましょう。

#include <stdio.h>
#include <windows.h>

int main(void) {
    int millisecond = 5*1000;

    printf("%d秒間止まります。\n", millisecond/1000);

    Sleep(millisecond);

    printf("%d秒間止まりました。\n", millisecond/1000);

    return 0;
}

実行結果:

5秒間止まります。
5秒間止まりました。

usleep関数を使ってマイクロ秒単位で処理を止める方法

sleep関数を使うと、秒単位で処理を止めることができました。

では、もう少し細かい単位で処理を止めたい時には、どうすればいいのでしょうか?sleep関数では、int型の整数を引数に取るため、1.5秒などの小数は指定することができません。

そこで、usleep関数を使えば、秒よりも細かく、マイクロ秒単位で処理を止めることができます。マイクロ秒というのは、1/1000000秒で、μsとも書きます。

つまり、1s = 1000000μsということです。それでは、1.5秒止めるプログラムを見ていきましょう。

#include <stdio.h>
#include <unistd.h>

int main(void) {
    int microsecond = 1.5 * 1000000;

    printf("%dμ秒間止まります。\n", microsecond);

    usleep(microsecond);

    printf("%dμ秒間止まりました。\n", microsecond);

    return 0;
}

実行結果:

1500000μ秒間止まります。
1500000μ秒間止まりました。

このように、usleep関数を使うことで、より細かい単位で、処理を止めることができました。

while文を使って簡易待機処理を自作する方法

sleep関数を使って、処理を指定した時間だけ止める方法について解説してきました。基本的に待機に関する動作は、ここまでで学んできた関数を使えば実現できると思います。

しかしどうしても、関数を使いたくない状況やCPUを保持し続けたい場合(どれもレアケースだと思いますが…)、時間で判断して待機させる処理を組むことも可能です。

一番手軽で簡単な方法はwhile文を使った待機処理です。while文というのは、ある条件を満たす限り、同じ処理を繰り返す命令をする文のことです。

また、time.hというライブラリーを使うと、時間計測や5秒後の時間などを取得することができます。時間に関する変数を使いたいときは、time_t型を使います。

また、clock関数を使うと、プログラムが始まってからの時間を得ることができ、例えば、5秒後の時間を得るためには、

5 * CLOCKS_PER_SEC + clock();

のように書きます。

これらを使うと、例えば、5秒後まで処理を止めることができます。

#include <stdio.h>
#include <time.h>

void mySleep(int second) {
    time_t now = second * CLOCKS_PER_SEC + clock();

    while (now > clock()) ;
}

int main(void) {
    int second = 5;

    printf("%d秒止まります。\n", second);

    mySleep(second);

    printf("%d秒止まりました。\n", second);

    return 0;
}

実行結果:

5秒止まります。
5秒止まりました。

このようにして、処理を止めることができます。

とはいえ、先ほど説明した通り、sleep関数とは違いCPUを使用し続けてしまいますので、基本的にはsleepなどの関数を使用することをお勧めします。

あえて簡易的に自作したい場合や、何か合わせて処理を行いたい場合などには、このような計測方法を参考にしてみてください。

まとめ

いかがだったでしょうか?今回はsleep関数などを使って指定した時間だけ処理を止める方法を解説しました。

処理を一時的に止めたいときなどに使用してください。

もし、処理を止めたい方法を忘れてしまったらこの記事を確認してください。

この記事を書いた人

ご閲覧いただきありがとうございます。森田一世と申します。プログラマーとしてRaspberry piを使ったり、記事を作成しています。

目次