(八)readとwrite関数の使用

3062 ワード

一、read関数
read関数は、開いているデバイスまたはファイルからデータを読み出します.
#include 
ssize_t read(int fd, void *buf, size_t count);
   :          ,    -1   errno,    readread  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; }