(八)readとwrite関数の使用
3062 ワード
一、read関数
read関数は、開いているデバイスまたはファイルからデータを読み出します.
パラメータcountは、読み出しを要求するバイト数であり、読み出したデータはバッファbufに保存され、ファイルの現在の読み書き位置は後方に移動する.なお、この読み書き位置とC標準I/Oライブラリを使用する場合の読み書き位置は異なる場合があり、この読み書き位置はカーネルに記載されており、C標準I/Oライブラリを使用する場合の読み書き位置はユーザ空間I/Oバッファに記載されている位置である.例えば、fgetcで1バイトを読むと、fgetcはカーネルから1024バイトをI/Oバッファにプリフェッチし、最初のバイトを返す可能性がある.このとき、ファイルがカーネルに記録する読み書き位置は1024であり、FILE構造体に記録される読み書き位置は1である.注意戻り値タイプはssize_tは、符号付きsize_を表すtは、正のバイト数、0(ファイルの末尾に到達することを示す)または負の値-1(エラーを示す)を返すことができる.read関数が返されると、返される値はbufの最初のバイトが読み込まれたばかりであることを示します.実際に読み込まれたバイト数(戻り値)は、要求された読み取りのバイト数countよりも小さい場合があります.たとえば、通常のファイルを読むと、countバイトを読む前にファイルの末尾に到達します.たとえば、ファイルの最後まで30バイトあり、100バイトの読み取りを要求すると、readは30を返し、次のreadは0を返します.端末装置から読むと、通常は動作単位で、改行文字まで読むと返されます.ネットワークから読むと、トランスポート層プロトコルやカーネルキャッシュメカニズムによっては、要求されたバイト数よりも戻り値が小さい場合があります.後述するsocketプログラミングセクションで詳しく説明します.
二、write関数
write関数は、開いているデバイスまたはファイルにデータを書き込みます.
簡単な例:(readとwrite関数によるファイルのコピー)
read関数は、開いているデバイスまたはファイルからデータを読み出します.
#include
ssize_t read(int fd, void *buf, size_t count);
: , -1 errno, read , read 0
パラメータcountは、読み出しを要求するバイト数であり、読み出したデータはバッファbufに保存され、ファイルの現在の読み書き位置は後方に移動する.なお、この読み書き位置とC標準I/Oライブラリを使用する場合の読み書き位置は異なる場合があり、この読み書き位置はカーネルに記載されており、C標準I/Oライブラリを使用する場合の読み書き位置はユーザ空間I/Oバッファに記載されている位置である.例えば、fgetcで1バイトを読むと、fgetcはカーネルから1024バイトをI/Oバッファにプリフェッチし、最初のバイトを返す可能性がある.このとき、ファイルがカーネルに記録する読み書き位置は1024であり、FILE構造体に記録される読み書き位置は1である.注意戻り値タイプはssize_tは、符号付きsize_を表すtは、正のバイト数、0(ファイルの末尾に到達することを示す)または負の値-1(エラーを示す)を返すことができる.read関数が返されると、返される値はbufの最初のバイトが読み込まれたばかりであることを示します.実際に読み込まれたバイト数(戻り値)は、要求された読み取りのバイト数countよりも小さい場合があります.たとえば、通常のファイルを読むと、countバイトを読む前にファイルの末尾に到達します.たとえば、ファイルの最後まで30バイトあり、100バイトの読み取りを要求すると、readは30を返し、次のreadは0を返します.端末装置から読むと、通常は動作単位で、改行文字まで読むと返されます.ネットワークから読むと、トランスポート層プロトコルやカーネルキャッシュメカニズムによっては、要求されたバイト数よりも戻り値が小さい場合があります.後述するsocketプログラミングセクションで詳しく説明します.
二、write関数
write関数は、開いているデバイスまたはファイルにデータを書き込みます.
#include
ssize_t write(int fd, const void *buf, size_t count);
: , -1 errno
簡単な例:(readとwrite関数によるファイルのコピー)
int main(int argc,char *argv[])
{
char buf[SIZE];
int fd_src,fd_dest,len;
if(argc < 3)
{
printf("./mycp src dest
");
exit(1);
}
umask(0);
fd_src = open(argv[1],O_RDONLY);
fd_dest = open(argv[2], O_CREAT | O_WRONLY | O_TRUNC, 0644);
/*
*
* -1
* 0
*/
while((len = read(fd_src, buf, sizeof(buf))) > 0)
write(fd_dest, buf, len);
close(fd_src);
close(fd_dest);
return 0;
}