スライドショー

【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関数などを使って指定した時間だけ処理を止める方法を解説しました。

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

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

LINEで送る
Pocket

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

MoritaIssei

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説