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

时间:2012-05-12 18:25:59

标签: c file-io process posix mpi

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

它是这样的:

  • 所有进程都会打开相同的文件进行编写。

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

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

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

我发现进程可能位于通过NFS挂载文件的不同计算机上,我怀疑它可能会回答我的问题 - 但是,如果文件是本地的,它会起作用吗?

1 个答案:

答案 0 :(得分:4)

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

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

现在,如果程序使用lseek(2)并写入(2),那么我相信您可以考虑保证结果,但现在它仅限于Posix操作系统。

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