c - 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);
}
这个对吗?或者有没有更好的做法?
解决方案
这是我要做的:
在方便的地方创建一个临时文件(例如
/tmp
)写出该文件,直到达到可以声明操作成功的程度
- 取消链接原始文件并将新文件移动到相同的位置/名称。
一旦您调用write()
,就数据实际刷新到磁盘的时间而言,您将受到内核的支配。
您可以使用O_SYNC
来增加数据已写入的保证级别 -O_SYNC
将导致write()
阻塞,直到数据写入磁盘。O_DSYNC
具有相同的行为,但它会阻塞,直到所有文件系统元数据也被写入,从而更有力地保证数据一旦write()
返回就可以检索。
推荐阅读
- java - Spring Cloud Dataflow server Custom Build 2.6.1
- c - skb 中的端口信息与 tcpdump 的不匹配
- javascript - 为什么 Symbol.iterator 只返回 value 属性而不是返回 done 和 value 属性
- html - 在 JS 变量中使用 HTML 标签(反应)
- microsoft-teams - 如何在 Microsoft Team App 清单中添加图像轮播?
- php - 在电子商务购物车的 URL 中传递多个 PHP 变量?
- html - 如何在悬停时更改svg颜色
标签无法使用? - sql - 如何跟踪哪些表已/已被修改
- c++ - C++ 在内存安全方面与 Rust 有多接近?
- node.js - 如何将顶级异步等待与打字稿一起使用?