首页 > 解决方案 > C - 将数据写入文件,要么全部写入,要么不写入

问题描述

就我而言,写部分数据是无稽之谈,所以我想通了:

ssize_t write_all(int fd, unsigned char* data, size_t size) {
    ssize_t w;
    size_t written = 0;
    unsigned char* buf = data;

    do {
        w = write(fd, buf, size-written);
        if (w > 0) {
            written += w;
            if (written == size) {
                return written;
            } else {
                buf += w;
            }
        } else {
            lseek(fd, SEEK_CUR, -written);
            return 0;
        }
    } while (1);
}

这个对吗?或者有没有更好的做法?

标签: c

解决方案


这是我要做的:

  1. 在方便的地方创建一个临时文件(例如/tmp

  2. 写出该文件,直到达到可以声明操作成功的程度

  3. 取消链接原始文件并将新文件移动到相同的位置/名称。

一旦您调用write(),就数据实际刷新到磁盘的时间而言,您将受到内核的支配。

您可以使用O_SYNC来增加数据已写入的保证级别 -O_SYNC将导致write()阻塞,直到数据写入磁盘。O_DSYNC具有相同的行为,但它会阻塞,直到所有文件系统元数据也被写入,从而更有力地保证数据一旦write()返回就可以检索。


推荐阅读