这是一个设计问题而不是编码问题。我有一个父进程,可以分叉许多孩子。每个孩子都应该在同一个文本文件上阅读和写作。
我们如何安全地实现这一目标?
我的想法:
在父级中创建文件指针,然后在其上创建二进制信号量。并且进程将在获取文件指针和写入文件时竞争。在阅读案例中,我不需要信号量。
如果我弄错了,请告诉我。
我在linux下使用C语言。 谢谢。
答案 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()
替换实际数据文件,之后锁定被释放。
如果编写者可以在文件中的任何地方写入,那么您可能想要的是比纯文本更结构化的文件,类似于数据库。在这种情况下,应使用某种读写器锁来管理数据一致性和数据完整性。