linux下のファイル同期関数(fflush、sync、fsync、fdatasync)の違い


機械の異常シャットダウンが発生した場合、書き込みログファイルの情報が失われる問題があるので、記録します. Linux実装では、カーネルにバッファキャッシュまたはページキャッシュが設けられており、ほとんどのディスクI/Oはバッファによって行われます.ファイルにデータを書き込む場合、カーネルは通常、バッファにデータをコピーします.バッファが満たされていない場合は、出力キューに格納するのではなく、書き込みが満たされるのを待つか、カーネルが他のデータを格納するためにバッファを再利用する必要がある場合は、出力キューにバッファを格納し、キューの先頭に達するまで実際のI/O操作を行います.これが遅延書きと呼ばれる出力方式です.遅延書き込みはディスクの読み取り回数を減らしますが、ファイルの内容と新しい速度を低減します.システムに障害が発生した場合、書き込みを遅らせると、ファイルと新しい損失が発生する可能性があります.このような状況に対応するために、linuxではsysnc、fsync、fdatasyncの3つの関数が提供され、実際のファイルシステムとバッファ内のコンテンツの一致を保証します.
#include

int fsync(int fd);
int fdatasync(int fd);
void sync(void);

「1」、sync「3」、fdatasyncデータに加えて、fsyncはファイルのプロパティを同期的に更新します.《4》Cライブラリのfflush   標準のI/O関数(fread,fwriteなど)はメモリにバッファを確立し、この関数はメモリバッファをリフレッシュし、コンテンツをカーネルバッファに書き込み、ディスクに書き込むにはfsyncを呼び出す必要がある(fflsuhを呼び出してからfsyncを呼び出す.そうしないと役に立たない).
関係:
ディスク
1、例
int main()
{
    FILE* wstream = fopen("test.log","wb+");
    int wfd = -1;
    if(wstream)
    {
        char tmp_str[12]="test file sync";
        fwrite(tmp, 1, strlen(tmp_str), wstream);

        fflush(wstream);  //     

        wfd = fileno(wstream);  //           
        if(wfd != -1)
        {
            fsync(wfd);  //        
        }

        fclose(wstream);
    }
    else
    {
        perror("Open test.log: ");
    }

    return 0;
}

2、参考:『1』、https://blog.csdn.net/xiaoshengqdlg/article/details/44114939『2』、unix環境高級プログラミング第3版–3.13