我在C中有一个将数据写入文件的程序。
C程序在执行期间不保持文件打开,只需用(fopen ("myfile.txt","a")
)打开文件并写入一些数据然后关闭文件。
另一方面,我有一个脚本文件,可以使用C二进制程序同时对同一个文件进行2次操作:
可以删除文件
它可以使用命令
为文件添加一些行echo "some data" >> file
脚本和C二进制程序之间是否存在竞争风险? Linux ioctl可以管理这样的问题吗?
如果存在竞争风险,如何在处理文件之前检查C和shell?
答案 0 :(得分:8)
如果两个进程写入同一个文件而没有任何"处理",则始终存在竞争条件。 (可能在统计上很小 - 但仍然存在)。
你可以:
fcntl
,flock
(请参阅例如this qst)/some/path/file.lck
(内容通常是锁定过程的主机名和进程ID(pid) - 允许检测停止锁定)并在每次修改原始文件之前检查其存在(和/或内容)。修改后,您只需删除"锁定文件")。它在操作系统级锁定方面要慢得多,但它易于操作并且非常方便用于锁定"在shell脚本中)。 (请记住,文件创建始终是原子的。)答案 1 :(得分:0)
您需要在C程序和shell之间创建某种信号量。
最简单的方法之一是在文件上设置sticky bit。让程序设置此值并取消设置,并让bash脚本检查它是否已设置。如果是这样,您可以让脚本挂起,直到它取消设置。
要添加该位,您可以使用posix chmod并将1000八进制加到文件的权限中(如果要删除它,则减去01000)。
要在bash文件中测试它,除其他外,你可以使用find,例如对于名为foo.txt的文件,您可以执行find . -name foo.txt -perm 1000
并查看find是否返回值。 (我从unix.com)的问题中得到了片段的想法。