gpt4 book ai didi

c++ - 部分覆盖文件描述符的内容

转载 作者:行者123 更新时间:2023-12-02 09:47:41 25 4
gpt4 key购买 nike

我试图创建一个文件,然后部分覆盖其内容。以下程序捕获了我要执行的操作的要点

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string>
#include <unistd.h>
#include <stdlib.h>

using namespace std;
int main() {

string tmpFilePath = "/tmp/myfile.XXXXXX";
int fd = mkstemp(&(tmpFilePath[0]));
string s1 = "Hello World";
FILE *fp = fdopen(dup(fd), "a");
fwrite(s1.c_str(), s1.size(), 1, fp);
fclose(fp);
fp = fdopen(dup(fd), "r+");
string s2 = "HELLO";
fseek(fp, 0, SEEK_SET);
fwrite(s2.c_str(), s2.size(), 1, fp);
fclose(fp);
rename(tmpFilePath.c_str(), "/tmp/myfile");
}
目的是创建一个具有“HELLO World”内容的文件。在Mac上可以正常使用,但是在运行Linux的Virtualbox VM上,文件内容最终显示为“Hello WorldHELLO”。我在做会导致不确定行为的事情吗?什么是部分覆盖文件的正确方法?

最佳答案

这是glibc的(外部)未记录的功能。fdopen的源代码说:

/* The May 93 draft of P1003.4/D14.1 (redesignated as 1003.1b)
[System Application Program Interface (API) Amendment 1:
Realtime Extensions], Rationale B.8.3.3
Open a Stream on a File Descriptor says:

Although not explicitly required by POSIX.1, a good
implementation of append ("a") mode would cause the
O_APPEND flag to be set.

(Historical implementations [such as Solaris2] do a one-time
seek in fdopen.)

However, we do not turn O_APPEND off if the mode is "w" (even
though that would seem consistent) because that would be more
likely to break historical programs.
*/
因此,第一个 fdopen(使用“a”模式)在基础文件描述中设置了 O_APPEND标志,第二个 fdopen并未取消设置它,因此它继续有效。
解决问题的方法很多,包括:
  • 不要使用dup,请单独打开文件,从而创建一个单独的文件描述(dup ed描述符共享相同的基础文件描述)
  • 不要使用"a",搜索到最后再写
  • 使用fcntl手动关闭O_APPEND
  • 关于c++ - 部分覆盖文件描述符的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64143694/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com