脚本与C二进制程序之间的竞争条件

脚本与C二进制程序之间的竞争条件,c,linux,bash,shell,C,Linux,Bash,Shell,我有一个C语言的程序,正在将数据写入文件 C程序在执行过程中不保持文件打开,它只是用(fopen(“myfile.txt”,“a”))打开文件并写入一些数据,然后关闭文件 另一方面,我有一个脚本文件,可以使用C二进制程序在同一文件上同时执行两个操作: 它可以删除该文件 它可以使用命令向文件中添加一些行 echo "some data" >> file 脚本和C二进制程序之间是否存在竞争条件的风险?Linux ioctl能处理这样的问题吗 如果存在争用条件的风险,如何在处理文件之前

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

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

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

  • 它可以删除该文件

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

    echo "some data" >> file
    
  • 脚本和C二进制程序之间是否存在竞争条件的风险?Linux ioctl能处理这样的问题吗


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

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

    你可以:

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

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

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

        要添加位,您需要使用posix并向文件的权限中添加1000个八进制(如果要删除它,则减去01000)。
        要在bash文件中测试它,除其他外,您可以使用find,例如,对于名为foo.txt的文件,您可以执行
        find-命名foo.txt-perm 1000
        ,然后查看查找是否返回值。(我从一个问题中得到了这个小小的想法)。

        是的,那里有一个比赛条件。为什么要投反对票?这是一个合理的问题。我认为你应该使用数据库而不是文本文件。shell脚本和C程序的脚本分别是
        man1flock和
        man2flock;我忘了
        flock
        fcntl
        。jm666的答案是解决此类问题的理想方案。我留下了我的答案,因为这是一个解决方案,但投票给那个答案,因为它是解决方案。另请参见:和。了解Linux上文件锁类型之间可能存在的兼容性问题很重要。