我们创建了一个锁文件以避免竞争条件。锁定文件在/tmp
目录中创建,该目录设置了粘滞位。我们没有将文件的模式作为可选项传递
文件创建期间的第三个参数。该文件使用fopen
函数和
int fd = fopen(filename, O_CREAT | O_EXCEL);
我们正在删除此锁定文件,一旦其使用结束。但有时文件不会被删除
它保留在/tmp
文件夹中,阻止其他进程,应用程序仍处于活动状态,无需继续操作。通过向系统发送命令来删除锁定文件
并且使用的命令是/usr/bin -rf
。令人惊讶的是,文件所有者和root用户都无法在此之后删除该文件。
在
ll lockfile
文件夹中执行操作/tmp
会授予O / P权限 “--- x ------”部分,我无法破译。更改权限 具有chmod 777 filename
到root
用户ID的lockfile不起作用。 并且必须重新启动系统才能从/tmp
目录中删除锁定文件。
答案 0 :(得分:4)
你说你正在创建这样的文件:
int fd = fopen(filename, O_CREAT | O_EXCEL);
这与fopen的签名不符:
FILE *fopen(const char *filename, const char *mode);
所以我认为你实际上可能正在使用open:
int fd = open(filename, O_CREAT | O_EXCL);
这是一个错误,因为open(2)的第三个参数是“mode”,当使用O_CREAT时它是必需的。
由于您没有传递mode参数,因此您正在调用未定义的行为,并且该模式可能已设置为某个不需要的值。尝试传递0666作为open(2)的第三个参数,看看是否有帮助。
答案 1 :(得分:1)
同时修复问题并删除文件 - 以root身份运行:
chmod 755 /tmp/lockfile
rm /tmp/lockfile