当替换文件的大小与原始文件大小相同时,是否可以安全地修改文件

问题描述 投票:0回答:1

我想做与sed -i 's/abc/def/' file类似的操作但没有临时文件。在我的情况下,匹配和替换的长度为[[same;以下是安全的:

fd = open(file, O_RDWR); fstat(fd, &sbuf); mm = mmap(0, sbuf.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); i = 0; while (i < sbuf.st_size) { memcpy(tmpbuf, mm + i, BUFSIZ); // read from mem to tmpbuf (BUFSIZ at a time) if ((p = strstr(tmpbuf, needle))) { // match found memcpy(mm + i + (p - tmpbuf), replace, strlen(replace)); // strlen(replace) == strlen(needle) } i += BUFSIZ; } munmap(mm, sbuf.st_size); fsync(fd); close(fd);
(为简便起见,省略了错误处理)

此外,不确定mmap是否可以使速度更快!

c mmap
1个回答
0
投票
这取决于您所说的“安全”。与在完成后在旧文件之上使用临时文件和原子rename不同,此操​​作没有原子性。其他进程可能会看到文件处于中间,部分修改的状态。而且,商店之间没有任何订购;他们可以在看到替换的开始之前就看到替换的结束,或者可以以任何其他可能的顺序看到替换,如果也使用mmap而不使用任何内存屏障,则可能以

inconsistent替换。注意,mmap确实没有什么特别的。您也可以使用write做同样的事情。

如果这些都不对您构成“不安全”,则该操作是完全安全的。特别是它不会截断文件或类似内容。
© www.soinside.com 2019 - 2024. All rights reserved.