C言語のSleep()関数

C Yan Yunosleep Guan Shu



ユーザーとの対話が必要なプログラムを開発する場合、アプリケーションが読みやすく使いやすいようにシステム時間を調整する必要がある場合があります。

たとえば、順番に実行されるタスクをユーザーに通知する必要があるコンソール アプリケーションを開発している場合、情報メッセージがクリアされる前にユーザーが読む時間を確保できるように、情報メッセージは適切な時間保持される必要があります。プログラムは次のコマンドに進みます。

この Linuxhint 記事では、sleep() 関数を使用してリアルタイムで遅延を作成する方法を学びます。この関数の構文と説明、および 1 秒未満の端数で遅延を作成するために POSIX が提供するオプションを示します。次に、実際の例、コード、画像を使用して、プログラムの実行を遅らせる方法と、この関数に対する信号の影響を示します。








C 言語の Sleep() 関数の構文



署名されていない 整数 寝る ( 署名されていない 整数 )

C言語でのSleep()関数の説明

sleep() 関数は、符号なし整数である「sec」入力引数で指定された秒数の間、プロセスまたはスレッドをスリープ状態にします。 sleep() 関数が呼び出されると、呼び出しプロセスはタイムアウトになるかシグナルを受信するまでスリープ状態になります。



この関数は、リアルタイム プロセスの実行で 1 秒を超える長い遅延を強制するためによく使用されます。 1 秒未満の遅延の場合、POSIX は、sleep() と同じメソッド呼び出しを使用するマイクロ秒分解関数 usleep() を提供します。 1 マイクロ秒未満の遅延の場合、1 ナノ秒の分解能を持つ nanosleep() 関数もありますが、遅延時間を設定するための入力引数として「timespec」構造体を使用する別の呼び出しメソッドを使用します。





sleep() 関数が指定された時間をすべて消費した場合、結果として 0 を返します。指定された時間が経過する前にシグナルの到着によって実行が中断された場合は、その時点までの残り秒数を返​​します。

sleep() 関数は「unistd.h」ヘッダーで定義されています。これを使用するには、次のようにこのファイルをコードに含める必要があります。



#include

Sleep() 関数を使用してプロセスに遅延を導入する方法

この例では、コマンド コンソールに「経過時間」メッセージを出力し、その後にプロセスの経過秒数を表示する無限ループで構成されるタイマーを作成します。 sleep() 関数によって生じる遅延により、これらの各ループが 2 秒ごとに繰り返されます。

これを行うには、「.c」拡張子を持つ空のファイルを取得し、そのファイルに「stdio.h」ヘッダーと「unistd.h」ヘッダーを追加します。次に、空の main() 関数を開き、その中で経過時間のカウンターとして使用する int 型の変数秒を定義します。

ヘッダーが挿入され、変数が宣言されたら、無限ループを開き、その中で printf() 関数を使用してメッセージと時刻値を表示します。次の行では、time 変数を 2 ずつインクリメントし、値 2 を入力引数として sleep() 関数を呼び出します。このようにして、このサイクルが 1 秒ごとに繰り返され、画面上に経過時間を表示するカウンターが表示されます。次に、このアプリケーションのコードを見てみましょう。この例の完全なコードを見てみましょう。

#include
#include

空所 主要 ( )
{
整数 = 0 ;
その間 ( 1 )
{
プリントフ ( 「経過時間: %i \n ) ;
+= 2 ;
寝る ( 2 ) ;
}

}

以下では、このコードのコンパイルと実行の図を見ていきます。ご覧のとおり、プログラムは 2 秒ごとに、プロセスの実行以降の経過秒数を画面に表示します。

Sleep() 関数に対するシグナルの影響

この例では、sleep() 関数を使用してスリープ状態になったプロセスに対するシグナルの影響を観察します。これを行うには、main() 関数とシグナル 36 のハンドラーで構成される単純なアプリケーションを作成します。

main() 関数の最初の行では、sleep() 関数によって返される値を格納する int 型の残りの変数を宣言します。次に、signal() 関数を使用してハンドラーをシグナル 36 にバインドします。次の行では、プロセスの PID を表示します。これを使用して、2 番目のシェルからプロセスにシグナルを送信します。最後に、sleep() 関数を呼び出し、その入力引数を 2 番目のシェルからシグナルを送信するのに十分な長さの 60 秒に設定します。残りの変数を出力引数として sleep() に送信します。

シグナル 36 にアタッチされるハンドラーは、printf() 関数が「残り時間:」メッセージを出力し、その後にシグナルがプロセスに到着したときに sleep() によって返される値を出力するコード行で構成されます。ここで、この例のコードを見てみましょう。

#include
#include
#include
#include <信号.h>

空所 ハンドラ ( 整数 残り ) ;

空所 主要 ( )
{
整数 残り ;
信号 ( 36 ハンドラ ) ;
プリントフ ( 「プロセスID: %i \n 取得 ( ) ) ;
残り = 寝る ( 60 ) ;
}

空所 ハンドラ ( 整数 残り )

{
プリントフ ( 「残り時間: %i \n 残り ) ;
}

次の画像は、このコードのコンパイルと実行を示しています。

このプロセスにおけるシグナルの効果を確認するために、このコードをコンパイルして実行します。次に、2 番目の端末から次の構文で信号を送信します。

殺す - n信号PID

次の図は、前のコンソールでのコードの実行と、次のコンソールから送信された信号の到着の影響を示しています。ご覧のとおり、シグナルはプロセスをウェイクアップすることで sleep() 関数の効果を抑制しています。

結論

この Linuxhint の記事では、sleep() 関数を使用して、指定した秒数の間プロセスをスリープ状態にする方法を説明しました。また、関数と呼び出しメソッドの構文、説明も示しました。

実際の例、コード スニペット、画像を使用して、sleep() 関数を使用してプロセスをスリープ状態にする方法と、シグナルの到着がスリープ状態のプロセスに与える影響について説明しました。