C言語システムコール-write

writeシステムコール

概要

writeはファイルディスクリプタが示すファイルに対してバッファ(buf)のデータを指定バイト数(count)書き込みます。

writeはreadと異なり、戻り値として得られる実際の書き込みバイト数が指定バイト数より少なくなる可能性は低いといえます。


writeの注意点

writeシステムコールで書き込んだデータは、直ちにディスクに反映されるわけではありません。

writeで書き込んだ内容は、一旦カーネルのバッファへ格納され、カーネルの判断でシステムに余裕がある状態の時に実際に書き込み処理を行います。

そのため、データが書き込まれるタイミングや実際に書き込まれたかどうかを知ることは困難です。

この問題を回避するために、sync()やfsync()という関数があります。

syncを呼び出すと、バッファキャッシュ中の更新されたデータがディスクに書き込まれます。


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int
main(void)
{
    int fd = 0;
    char *path = "./tmp/datatable.swap";
    char *buf= "-table\n";
    ssize_t num = 0;
    ssize_t cnt = strlen(buf);

    fd = open(path, O_RDWR|O_CREAT|O_APPEND, 0666);
    if(fd < 0){
        printf("Error: open(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    num = write(fd, buf, cnt);
    if(num < 0){
        printf("Error: write(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    if(close(fd) < 0){
        printf("Error: close(%d) %s\n", errno, strerror(errno));
        return(-1);
    }

    return(0);
}


関連ページ