Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxでのsleep関数、fflush関数とバッファの問題

Linuxでのsleep関数、fflush関数とバッファの問題

  

//---------------------- sleep()関数

関数名:sleep関数:一定時間サスペンドを実行します使用法:unsigned int sleep(unsigned int seconds);プログラム例:

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

int main(void){int i;

for(i = 1; i< 5; i ++){printf("%d秒間のスリープ\\ n"、i); sleep(i }; return 0;}

その他:

VC ++のSleep関数のプロトタイプは次のとおりです。

void Sleep(DWORD dwMilliseconds);

linux sleep関数のプロトタイプは次のとおりです。

unsigned int sleep(符号なしint秒);

MFCはマイクロ秒、linuxは秒です。 Linuxでのマイクロ秒スレッドスリープ関数は次のとおりです。

void usleep(符号なしlong usec); int usleep(符号なしlong usec); /* SUSv2 * /

またはselect関数+ timevalを使用してください。構造体は(マイクロ秒まで)、

またはpselect関数+ timespecを使用することもできます(ナノ秒まで正確で、十分正確です)。

//------- --------- fflush()関数

C99によるfflush関数の定義は次のとおりです。

int fflush(FILE * stream);

if stream出力ストリームまたは更新ストリームを指しており、この更新ストリームの最新の操作が入力されていない場合、fflush関数はこのストリームに書き込まれるデータをホスト環境に転送してファイルに書き込みます。それ以外の場合、その動作は未定義です。

元のテキストは次のとおりです。

int fflush(FILE * stream);


streamが最新の出力ストリームまたは更新ストリームを指す場合操作が入力されなかった場合、fflush関数は、そのストリームの未書き込みデータをホスト環境に配信してファイルに書き込みますが、それ以外の場合の動作は未定義です。

ここで、ホスト環境はと解釈できます。オペレーティングシステム
またはカーネルなど

したがって、streamが入力ストリーム(stdinなど)を指している場合、fflush関数の動作は未定義です。したがって、fflush(stdin)の使用は正しくありません。少なくとも移植性はありません。

fflushライブラリ関数の機能は、ファイルストリーム内のすべての未書き込みデータをただちに書き出すことです。例えば、この関数を使用して、ユーザー応答を読み込もうとする前に対話式プロンプトが端末に送信されるようにすることができます。この機能を使用すると、プログラムが実行を継続する前に、重要なデータが確実にディスクに書き込まれます。プログラムをデバッグするときに、そのプログラムを使用して、プログラムが中断されるのではなくデータを書き込んでいるかどうかを判断できます。 fclose関数を呼び出すと暗黙的にフラッシュ操作が実行されるので、fcloseの前にfflushを呼び出す必要はありません。

この関数は控えめに使うべきで、fflushは例外のためだけに使われると書かれています通常、fcloseとEXITは出力バッファをリフレッシュするために使われるべきです。 LINUXではこのようには使えません。

*





*

//---- --------------バッファの問題

*

詳細を見ることができます:ストリームとバッファの理解の概要と一般的な標準入力問題の解決策

*

*



標準I /Oキャッシュの目的は、読み書き呼び出しの使用を最小限に抑えることです。数量また、各I /Oストリームを自動的にキャッシュするので、これを考慮する必要があります。残念なことに、標準I /Oライブラリに関して最も紛らわしいのはそのキャッシュです。 I /O操作を実行するとき、さまざまな種類のキャッシュは、しばしば人々を圧倒します。標準I /Oは、フルキャッシュ、ローキャッシュ、およびノー​​キャッシュの3種類のキャッシングを提供します。

最も明確なことはStevensの "UNIX環境のための高度なプログラミング"です以下はStevensの "UNIX環境のための高度なプログラミング"の第5章から抜粋したものです:


//******************

標準I /Oは3種類のキャッシングを提供します。(1)フルキャッシング。この場合、標準入出力バッファーがいっぱいになったときに実際の入出力操作が実行されます。ディスク上にあるファイルは通常、標準のI /Oライブラリによって完全にキャッシュされます。ストリームに対して最初の入出力操作を実行するとき、関連する標準入出力関数は通常、キャッシュを使用するためにm l l o c(7.8節を参照)を呼び出します。リフレッシュ(fl s h)という用語は、標準I /Oキャッシュの書き込み操作を表します。キャッシュは標準的なI /Oルーチンによって自動的に更新されることができます(たとえば、キャッシュをいっぱいにするとき)、またはストリームを更新するために関数ff l u s hを呼び出すことができます。 U N I X環境では、リフレッシュには2つの意味があります。標準I /Oライブラリの場合、リフレッシュとはキャッシュの内容をディスクに書き込むことを意味します(キャッシュは部分的にしか埋められません)。端末ドライバ(11章で説明したtcfl uh関数など)に関しては、リフレッシュとは既存のキャッシュ内のデータを破棄することを意味します。 (2)行キャッシュ。この場合、標準入出力ライブラリーは、入出力で改行文字が見つかったときに入出力操作を実行します。これにより、(標準入出力関数fputcを使用して)一度に1文字を出力できますが、実際の入出力操作は行が書き込まれた後にのみ行われます。ストリームに端末が含まれる場合(標準入力や標準出力など)、通常はラインバッファが使用されます。行キャッシュには2つの制限があります。 1つ目は、標準I /Oライブラリが各行を収集するために使用するキャッシュの長さが固定されているためです。キャッシュがいっぱいになる限り、改行文字が書き込まれていなくてもI /O操作が実行されます。 2つ目は、(a)キャッシュのないストリーム、(b)行キャッシュのあるストリーム(カーネルからのデータが事前に必要)から入力データを取得したい場合は、標準入出力ライブラリを介して入力データを取得することです。すべての行キャッシュ出力ストリームをフラッシュします。 (b)の括弧内に記述があるのは、必要なデータがすでにキャッシュ内にある可能性があり、データが必要なときにカーネルがこれを行う必要がないからです。明らかに、キャッシュなしでストリームから入力する((a))には、その時点でカーネルからデータを取得する必要があります。 (3)キャッシュなし。標準I /Oライブラリは文字をキャッシュしません。標準入出力関数を使用してバッファなしでストリームに多数の文字を書き込む場合、それは、wシステムコール関数を使用して関連するオープンファイルにこれらの文字を書き込むことと同じです。標準エラーストリームs t d e r rは通常キャッシュされていないので、エラーメッセージを改行文字が含まれているかどうかにかかわらず、できるだけ早く表示することができます。 ANSI Cは以下のキャッシング機能を必要とする:(1)標準入力および標準出力が対話装置を含まない場合に限り、それらは完全にキャッシングされる。 (2)標準エラーが完全にキャッシュされることはありません。ただし、標準入出力に中断されていないデバイスが含まれているかどうか、それらがキャッシュされているかラインキャッシュされているか、標準出力がバッファリングされていないかラインキャッシュされているかはわかりません。 S V R 4および4 3 + B S Dのシステムでは、デフォルトで次の種類のキャッシュが使用されます。•標準エラーはキャッシュされません。 •端末デバイスに他のストリームが含まれている場合はそれらはラインキャッシュされ、それ以外の場合は完全にキャッシュされます。

//****************************

*

私たち標準入出力がよく使用され、ANSI Cはstdin、stdout、およびstderrのキャッシュ特性に規定を課していません。そのため、stdin、stdout、およびstderrのシステムによってシステムごとにキャッシュ特性が異なる可能性があります。主なキャッシュ機能は次のとおりです。stdinとstdoutはラインバッファで、stderrはキャッシュされていません。


Copyright © Windowsの知識 All Rights Reserved