0

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

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

我的想法:

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

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

我在linux下使用C。谢谢你。

4

2 回答 2

1

POSIX systems have kernel level file locks using fcntl and/or flock. Their history is a bit complicated and their use and semantics not always obvious but they do work, especially in simple cases. For locking an entire file, flock is easier to use IMO. If you need to lock only parts of a file, fcntl provides that ability.

As an aside, file locking over NFS is not safe on all (most?) platforms.

man 2 flock

man 2 fcntl

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

Also, keep in mind that file locks are "advisory" only. They don't actually prevent you from writing/reading/etc to a file if you bypass acquiring the lock.

于 2013-03-11T20:06:43.517 回答
0

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

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

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

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

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

于 2013-03-11T19:46:02.917 回答