C LANGUAGE TECHNOLOGY

【C言語】sleep/usleep/nanosleep/clock_nanosleep関数の使い方

悩んでいる人

C言語でスリープする方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++Solidity,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

sleep関数

sleep関数は,引数で指定した秒数をスリープします.

sleep関数を利用して1秒スリープするコードは以下になります.

実行結果は以下になります.

実行中に1秒間スリープしてから終了します.

usleep関数

usleep関数は,引数で指定したマイクロ秒をスリープします.

usleep関数は,GCC/Clangでは利用できますが,Visual Studioでは利用できないことに注意して下さい.

usleep関数を利用して1秒スリープするコードは以下になります.

実行結果は以下になります.

sleep関数のプログラムと同様に,実行中に1秒間スリープしてから終了します.

nanosleep関数

nanosleep関数は,第1引数のreqで指定された時間の間,プログラムをナノ秒単位でスリープします.

引数に指定するstruct timespec構造体の定義は以下になります.

シグナルハンドラにより割り込みが発生した場合,remがNULLでなければ残りの時間を rem が指す構造体に格納します.

nanosleep関数を利用して1秒スリープするコードは以下になります.

実行結果は以下になります.同様です.

clock_nanosleep関数

clock_nanosleep関数は,指定したクロックでナノ秒単位の高精度なスリープをします.

nanosleep関数との違いは,以下の2つです.

  • 呼び出し側が停止期間をどのクロックに対して計測するのかを選択できること
  • スリープ期間を絶対値でも相対値でも指定できること

clock_nanosleep関数の絶対値でスリープ期間を指定する機能は,LinuxのリアルタイムスケジュールポリシーSCHED_FIFOでRate Monotonicスケジューリングを実装する時に利用します.

clock_nanosleep関数を利用して1秒スリープするコードは以下になります.

実行結果は以下になります.同様です.

まとめ

C言語でスリープする方法として,sleep/usleep/nanosleep/clock_nanosleep関数の使い方を紹介しました.

sleep関数とusleep関数は,引数にスリープ時間を指定するだけで簡単に利用できます.

これに対して,nanosleep関数とclock_nanosleep関数は,struct timespec構造体でスリープ期間を指定するので少し手間がかかります.

用途に応じて,sleep/usleep/nanosleep/clock_nanosleep関数を使い分けましょう.

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , ,