【问题标题】:race condition betwen script and C binary program脚本和 C 二进制程序之间的竞争条件
【发布时间】:2015-05-02 22:26:02
【问题描述】:

我有一个 C 语言程序正在将数据写入文件。

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

另一方面,我有一个脚本文件,它可以使用 C 二进制程序同时对同一个文件执行 2 个操作:

  1. 它可以删除文件

  2. 它可以使用命令向文件中添加一些行

    echo "some data" >> file
    

脚本和 C 二进制程序之间是否存在竞争条件的风险? Linux ioctl 是否可以解决此类问题?

如果存在竞争条件的风险,如何在处理文件之前对 C 和 shell 进行检查?

【问题讨论】:

  • 是的,那里有竞争条件。
  • 为什么投反对票?这是一个合法的问题。
  • 我认为你应该使用数据库而不是文本文件
  • shell 脚本见man 1 flock,C 程序见man 2 flock

标签: c linux bash shell


【解决方案1】:

如果两个进程在没有任何“处理”的情况下写入同一个文件,则始终存在竞争条件。 (可能在统计上很小 - 但仍然存在)。

你可以:

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

【讨论】:

【解决方案2】:

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

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

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

【讨论】:

  • 很久没有在Unix上编程了;我忘了flockfcntl。 jm666 的答案是解决此类问题的理想解决方案。我要留下我的答案,因为它是 a 解决方案,但要赞成这个答案,因为它是 the 解决方案。
猜你喜欢
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 2012-06-24
  • 2016-02-02
  • 2013-11-14
  • 1970-01-01
  • 2015-01-16
  • 2016-11-16
相关资源
最近更新 更多