将相同内容写入文件是否需要同步?

时间:2013-08-11 13:30:08

标签: bash file-io filesystems

假设我有两个进程可以将相同的内容写入同一个文件:

echo "large content" > aFileName
cat aFileName

是否需要同步/锁定?我可以确定在这样的命令之后,文件的内容不会因所有进程中的竞争条件而被肢解吗?

1 个答案:

答案 0 :(得分:1)

每个进程都将使用自己的文件指针,因此在正常情况下它应该是安全的。 我能看到的唯一问题是:

  1. 进程A截断文件
  2. 进程A写入一些数据
  3. 进程B截断文件
  4. 进程B写入的内容少于步骤#2中编写的进程A
  5. 进程B异常终止而不编写整个文件
  6. 现在,步骤#2中写入的一些数据会丢失,即使进程A继续写下其余数据。

    您可以写入一个临时文件,该文件在写完所有内容后以原子方式重命名。确保临时文件与输出位于同一文件系统上,并在其名称中使用一些唯一标识符(例如进程ID)。另外,设置陷阱处理程序以删除文件。

    此解决方案的缺点是它占用更多存储空间,因为临时文件的多个副本可能同时写入,并且如果进程终止而没有陷阱处理程序能够运行,则某些所述临时文件可能会作为垃圾留下来