c - 使用来自多个进程的 fseek/fwrite 写入文件的不同区域?

标签 c file-io process posix mpi

我最近遇到了一些未经充分测试的遗留代码,用于将分布在多个进程(这些是基于 MPI 的并行计算的一部分)的数据写入同一个文件。这真的能保证有效吗?

它是这样的:

  • 所有进程都打开同一个文件进行写入。

  • 每个进程调用 fseek 以查找文件中的不同位置。此位置可能超过文件末尾。

  • 然后每个进程使用 fwrite 将数据 block 写入文件。寻找地点 和 block 大小使得这些写入完全平铺 文件的一部分 -- 没有间隙,没有重叠。

这是否保证有效,还是有时会严重失败?没有锁定来序列化写入,实际上它们很可能是从同步点开始的。另一方面,我们可以保证它们正在写入不同的文件位置,这与其他问题不同,这些问题在尝试从多个进程写入“文件末尾”时出现问题。

我突然想到,这些进程可能位于通过 NFS 挂载文件的不同机器上,我怀疑这可能回答了我的问题——但是,如果文件是本地的,它会工作吗?

最佳答案

我相信这通常会奏效,但不能保证我能找到。 fwrite(3) 的 Posix 规范遵从 ISO C,两个标准都没有提到并发性。

所以我怀疑它通常会起作用,但 fseek(3) 和 fwrite(3) 是缓冲 I/O 函数,因此成功将取决于库实现的内部细节。因此,绝对没有保证,但有各种理由期望它会起作用。

现在,如果程序使用 lseek(2) 和 write(2),那么我相信您可以认为结果是有保证的,但现在它仅限于 Posix 操作系统。

有一件事似乎……很奇怪……为什么MPI 程序 决定通过NFS 而不是消息API 共享其数据?它看起来更慢、更不便携、更容易出问题,而且通常只是浪费 MPI 功能集。鉴于对单个 NFS 服务器的依赖,它肯定不再是分布式的。

关于c - 使用来自多个进程的 fseek/fwrite 写入文件的不同区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10566328/

相关文章:

python - 为什么 python 子进程输出与 shell 不同?

c - 搜索文件被程序拒绝

c - 同名的两个静态变量(两个不同的文件)和外部其中一个在任何其他文件中

c++ - 读取中间名可选的文件

java - 杀死进程和 System.exit(0) 之间的区别;

debugging - 能够从进程 ID 识别进程身份的最佳 erlang 方法是什么?

c - C 中的分而治之,可能到达非 void 函数的末尾

c - 从 C 中的文件名获取 MIME 类型

c++ - 在C++中写入输入和输出文件

java - JFileChooser:保存取消之前用户导航到的最后一个目录