【ただの独り言】write関数とかの覚書

 C言語ではwrite関数という関数がある。fwriteという関数もある。両者の違いは、普段は意識する必要も無いだろうが、パフォーマンスや電源断によるデータ保障などが気になる場合は、違いを分かっていたほうがいいかもしれない。

write関数、read関数について。

#include<unistd.h>
ssize_t write(int fd, const void *buf, size_t nbytes);
ssize_t read(int fd, const void *buf, size_t nbytes);
 fdには出力先を、bufに書き込みたいやつ、nbytesに書き込むサイズを指定する。
返り値は、実際に書き込み/読み取りしたサイズ。実はこれがネック。
下記に、read/write関数を利用した、catみたいなソースを記載。
#include <unistd.h> 
/**** catの偽者っぽいやつ ****/
/**** 標準入力に入力されたら ****/
/**** そのまま返す ****/
#define SIZE 512
int main(int argc, char *argv[])
{
    char buf[SIZE];
    int read_size;
    int write_size;

    while ((read_size = read(0, buf, sizeof(buf))) > 0) {
        write_size = write(1, buf, read_size);
    }
}
 以上が、readとwrite関数を用いた簡単なプログラム。このプログラムのバグは、必ずしも入力された文字が全部書き出されるわけではないということ。
 標準入力から読み込んだサイズはread_sizeに格納される。そのサイズ分、writeで書き出そうとしているが引数で指定している、read_size分書き出すことをwrite関数は保障しない。実際に書き出されたサイズが、write_sizeに返ってくる。
 確実にすべてを書き出したければ、write_sizeがread_sizeと等しくなるまでwriteをループさせるべきだろう、と思う。

次回はfwrite、fread関数に関して。