通过多个进程访问文件

时间:2013-03-11 16:49:36

标签: c linux process semaphore

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

我们如何安全地实现这一目标?

我的想法:

在父级中创建文件指针,然后在其上创建二进制信号量。并且进程将在获取文件指针和写入文件时竞争。在阅读案例中,我不需要信号量。

如果我弄错了,请告诉我。

我在linux下使用C语言。 谢谢。

2 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

如果编写者将数据附加到文件中,您的方法似乎很好(至少直到文件对文件系统来说太大)。

如果作家正在进行文件替换,那么我会接近这样的事情:

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

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

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