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

syncシステムコール

概要

syncはバッファキャッシュ中の更新データをディスクに書き込みます。

バッファされたメタデータとデータ本体の変更が、対応するファイルシステムに書き込まれます。

ファイルディスクリプタを指定してsync処理を行う場合にはfsyncを利用します。


syncは失敗することがありません。

しかしながら、データの完全性を保証しておらず、実際にデータの書き込みが終了する前に処理が戻ってくる可能性があります。

Linuxや最新のunixOSでは待ち合わせを行うように変更されています。


syncの目的

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

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

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

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

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


サンプルプログラム


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>

/*!
 * @brief     sync
 * @return    0:success/-1:failure
 */
static int
sample_func(void)
{
    int rc = 0;

    write(1, "sample\n", 7);

    rc = fsync(1);
    if(rc < 0){
        printf("Error: fsync() %s\n", strerror(errno));
        return(-1);
    }
    sync();

    return(0);
}

int
main(int argc, char *argv[])
{
    int rc = 0;

    if(argc != 1){
        fprintf(stderr, "Usage: %s\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    rc = sample_func();
    if(rc != 0) exit(EXIT_FAILURE);

    exit(EXIT_SUCCESS);
}


関連ページ