2015-03-02 57 views
4

我有一个正在向数据写入数据的程序。脚本和C二进制程序之间的竞争条件

C程序在执行过程中并未保持打开文件,只是用(fopen ("myfile.txt","a"))打开文件并写入一些数据,然后关闭文件。

在另一边,我有一个脚本文件,就可能在同一时间与C二进制程序做出相同的文件2个操作:

  1. 它可以删除文件

  2. 它可以添加一些行的文件,命令

    echo "some data" >> file 
    

是否有种族℃的风险在脚本和C二进制程序之间进行? Linux ioctl可以管理这样的问题吗?

如果存在竞争状态的危险,如何使处理文件之前基于C的检查和壳呢?

+6

是的,这里有一个竞赛条件。 – 2015-03-02 14:20:37

+0

为什么选择投票?这是一个合法的问题。 – jm666 2015-03-02 14:27:03

+0

我认为你应该使用数据库而不是文本文件 – 2015-03-02 14:35:38

回答

8

如果两个进程写入同一个文件中没有任何“处理”,总是存在一种竞争状态。 (可能在统计上很小 - 但仍然存在)。

您可以:

  • 使用OS调用锁定文件,如fcntlflock(参见例如this qst
  • 创建外部“锁档”这样/some/path/file.lck(内容通常是锁定进程的主机名和进程ID(pid) - 允许检测到暂停锁),并在每次修改原始文件之前检查它的存在(和/或内容)。修改后,您可以简单地删除“锁定文件”)。它与操作系统级别的锁定相比要慢得多,但它很容易处理,并且非常方便在shell脚本中“锁定”)。 (请记住,文件创建始终是原子)。
+0

另请参阅:[mandatory-locking.txt](https ://www.kernel.org/doc/Documentation/filesystems/mandatory-locking.txt)和[locks.txt](https://www.kernel.org/doc/Documentation/filesystems/locks.txt)。 了解Linux上文件锁定类型之间兼容性问题的可能性很重要。 – 2015-03-02 16:37:23

+0

@BrianMcFarland **非常好的文档。感谢您的链接。 – jm666 2015-03-02 16:41:53

0

您需要在C程序和你的shell之间建立某种信号量。

一个做到这一点的最简单的方法是设置sticky bit上的文件。让你的程序设置这个值并取消它,并让bash脚本检查它是否被设置。如果是这样,您可以将脚本挂起,直到它未被设置。

要添加该位,您可以使用posix chmod并将1000个八进制添加到文件的权限(并在要删除它时减去01000)。 要在bash文件中测试它,除其他外,您可以使用find,例如对于名为foo.txt的文件,您可以执行find . -name foo.txt -perm 1000并查看查找是否返回值。 (我从unix.com的问题中得到了这个片段的想法)。

+2

我在Unix上编程已经很长时间了;我忘了'flock'和'fcntl'。 jm666的答案是像这样的问题的理想解决方案。我将离开我的答案,因为它是_a_解决方案,但是提出这个答案是因为它是解决方案。 – 2015-03-02 14:49:05