C言語下位のI/O入出力まとめ
3146 ワード
/*名称:C言語の最下位I/O説明:C言語でのファイルへのアクセスには2つの方法があり、1つはここの最下位のアクセスである.もう1つは、標準的なファイルへのアクセスです.基本的な違いは,システムが自動的にプログラムにバッファ区間を開くかどうかである.後者は、プログラムに一定のバッファ区間を開き、ファイルアクセスの効率を向上させることができます.ここの下位I/Oについては、自分で手動で開く必要があります.これは好児郎~志在四方のCSDNブログから抜粋したものです:詳しく話しています.
バッファファイル操作の特徴ANSI標準Cライブラリのファイル処理関数システム呼び出しの回数を減らし、効率を高めるために、アプリケーションによって、バッファメカニズムを採用する:メモリに「バッファ」を開き、プログラム中の各ファイルに使用する.ディスクファイルの読み取り操作を行う時、一度にファイルから大量のデータをバッファに読み出すことができる.今後,この部分へのアクセスはシステム呼び出しを用いる必要がなく,すなわち少量のCPU状態切替のみが必要となる.ファイルの書き込み操作を行う場合は、まずコンテンツをバッファに格納し、バッファがいっぱいになった後、または更新が必要な場合にシステムコールを呼び出してバッファ内のコンテンツを一度にディスクに書き込むことができます.
非バッファファイル操作の特徴は非バッファのファイルアクセス方式を採用し、そのファイルに対して読み書き操作を行うたびに、読み書きファイルシステム呼び出しを使用してその操作を処理する必要があるため、ユーザーがあるディスクファイルにアクセスする必要がある場合、アクセスするたびにシステム呼び出しを実行し、システム呼び出しを実行するとCPU状態の切り替えにかかわる.すなわち,ユーザ空間からカーネル空間に切り替え,コンテキストの切り替えを実現することで,一定のCPU時間をロスし,頻繁なディスクアクセスがプログラムの実行効率に大きな影響を及ぼす.Open()、read()、write()、lseek()およびclose()は、キャッシュなし(キャッシュなしとは、readおよびwriteのたびにカーネル内のシステム呼び出しが呼び出される)で、ファイル(デバイスを含む)を直接読み書きすることを特徴とする非キャッシュファイル操作関数です.これらの関数はANSI Cの構成部分ではないが,POSIXの構成部分である.
*/
バッファファイル操作の特徴ANSI標準Cライブラリのファイル処理関数システム呼び出しの回数を減らし、効率を高めるために、アプリケーションによって、バッファメカニズムを採用する:メモリに「バッファ」を開き、プログラム中の各ファイルに使用する.ディスクファイルの読み取り操作を行う時、一度にファイルから大量のデータをバッファに読み出すことができる.今後,この部分へのアクセスはシステム呼び出しを用いる必要がなく,すなわち少量のCPU状態切替のみが必要となる.ファイルの書き込み操作を行う場合は、まずコンテンツをバッファに格納し、バッファがいっぱいになった後、または更新が必要な場合にシステムコールを呼び出してバッファ内のコンテンツを一度にディスクに書き込むことができます.
非バッファファイル操作の特徴は非バッファのファイルアクセス方式を採用し、そのファイルに対して読み書き操作を行うたびに、読み書きファイルシステム呼び出しを使用してその操作を処理する必要があるため、ユーザーがあるディスクファイルにアクセスする必要がある場合、アクセスするたびにシステム呼び出しを実行し、システム呼び出しを実行するとCPU状態の切り替えにかかわる.すなわち,ユーザ空間からカーネル空間に切り替え,コンテキストの切り替えを実現することで,一定のCPU時間をロスし,頻繁なディスクアクセスがプログラムの実行効率に大きな影響を及ぼす.Open()、read()、write()、lseek()およびclose()は、キャッシュなし(キャッシュなしとは、readおよびwriteのたびにカーネル内のシステム呼び出しが呼び出される)で、ファイル(デバイスを含む)を直接読み書きすることを特徴とする非キャッシュファイル操作関数です.これらの関数はANSI Cの構成部分ではないが,POSIXの構成部分である.
*/
#include
#include
#include
#include
#include
int main()
{
int fd,size;
char s[] = "This is a program!
";
char buffer[80];
//open a file
fd = open("temp.log",O_WRONLY|O_CREAT);
if(-1 == fd)
{
printf("Open file failed!
");
return -1;
}
//wirte a string to the file
write(fd,s,sizeof(s));
//close the file
close(fd);
//reopen the file in a readonly way
fd = open("temp.log",O_RDONLY);
if(-1 == fd)
{
printf("Open file failed!
");
return -1;
}
//read from the file
size = read(fd,buffer,sizeof(buffer));
//close the file
close(fd);
printf("%s
",buffer);
return 0;
}