【问题标题】:Accessing a file by several processes通过多个进程访问文件
【发布时间】:2013-03-11 16:49:36
【问题描述】:

这是一个设计问题,而不是编码问题。我有一个会分叉许多孩子的父进程。每个孩子都应该在同一个文本文件上读写。

我们怎样才能安全地做到这一点?

我的想法:

在父级中创建文件指针,然后在其上创建一个二进制信号量。进程将竞争获取文件指针并写入文件。在读取的情况下,我不需要信号量。

如果我记错了请告诉我。

我在 linux 下使用 C。 谢谢。

【问题讨论】:

  • 可能是一个骗局,但无论如何都值得一读 (stackoverflow.com/questions/2057784/…)
  • 搜索文件和/或记录锁定,并在探索更复杂的方案之前确定这是否合适。
  • 我会避免在这种情况下使用单个文本文件(因为在文本文件中间写入意味着主要插入文本,这会改变整个文件的大小和其他进程处理的偏移量)。也许分享例如gdbm 索引文件或某些数据库会更合适...

标签: c linux process semaphore


【解决方案1】:

POSIX 系统具有使用fcntl 和/或flock 的内核级文件锁。它们的历史有点复杂,它们的使用和语义并不总是很明显,但它们确实有效,尤其是在简单的情况下。对于锁定整个文件,flock 更易于使用 IMO。如果您只需要锁定文件的一部分,fcntl 提供了该功能。

顺便说一句,NFS 上的文件锁定在所有(大多数?)平台上并不安全。

man 2 flock

man 2 fcntl

http://en.wikipedia.org/wiki/File_locking#In_Unix-like_systems

另外,请记住,文件锁定只是“建议”。如果您绕过获取锁,它们实际上并不会阻止您对文件进行写入/读取/等操作。

【讨论】:

    【解决方案2】:

    如果编写器将数据附加到文件中,您的方法似乎很好(至少在文件变得对于文件系统来说太大之前)。

    如果作者正在做文件替换,那么我会这样处理:

    • 读取 API 将根据缓存值检查上次修改的时间(使用 fstat())。如果时间已更改,则在执行读取之前重新打开文件并更新缓存的修改时间。

    • 写入 API 将获取锁,并写入临时文件。然后调用rename()替换实际的数据文件,之后锁被释放。

    如果作者可以在文件中的任何位置写入内容,那么您可能需要比纯文本更结构化的文件,类似于数据库。在这种情况下,应该使用某种读写锁来管理数据一致性和数据完整性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多