我一直在努力学习Go,但我一直难以尝试从普通文件读取和写入.
我可以得到inFile, _ := os.Open(INFILE, 0, 0),但实际上获取文件的内容没有意义,因为read函数将a []byte作为参数.
func (file *File) Read(b []byte) (n int, err Error)
Run Code Online (Sandbox Code Playgroud) 我需要我的代码(C++,在Linux上)来调用第二个可执行文件,之前已经编写了一个由第二个程序读取的输出文件.天真的做法,
std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");
Run Code Online (Sandbox Code Playgroud)
遭遇潜在的竞争条件,即使执行out.close(),文件也无法立即被读取secondprogram?如果是这样,解决这个问题的最佳做法是什么?
三个音符:
mkstemp.设想:
任务代码(错误检查省略):
// open, write and close
fd = open(name);
write(fd, buf, len);
close(fd);
< more code here **not** issuing read/writes to name but maybe open()ing it >
// open again and fsync
fd = open(name);
fsync(fd);
Run Code Online (Sandbox Code Playgroud)
name系统中不再有任务同时访问。
它是否已定义,更重要的是,它是否会同步 所引用的 inode 上可能的未完成写入name?即,我会buf在 fsync 之后从文件中读回吗?
来自 POSIX http://pubs.opengroup.org/onlinepubs/009695399/functions/fsync.html我想说这似乎合法......
谢谢。
5 月 18 日编辑:感谢您的回答和研究。我(2016 年)向 extfs 首席开发人员之一(Ted)提出了这个问题,并得到了这样的答案:“Posix 不保证它,但实际上它应该适用于大多数文件系统,包括 ext4。Posix 中的关键词规格为:
该
fsync()函数应请求将由命名的打开文件描述符的fildes所有数据传输到与 所描述的文件关联的存储设备fildes。
它没有说“...描述的文件的所有数据fildes”,而是说“打开的文件描述符的所有数据”。因此从技术上讲,不能保证由另一个文件描述符写入的数据会同步到磁盘。
实际上,文件系统不会尝试通过 fd 进入的脏数据,因此您无需担心。编写的内容超过严格要求的操作系统是符合标准的,因此您通常会发现这一点,即使它没有得到保证。”这比“完全相同的持久保证”不太具体,但相当权威,尽管可能已经过时了。
我想做的是一个适用于单个文件的“同步”命令。就像 …
可能的重复:
删除文件中的特定行(python)
我需要从文件 f= 中删除包含数字“2”的行
2 3
5 6
7 2
4 5
Run Code Online (Sandbox Code Playgroud)