如果连root都无法删除使用O_CREAT创建的锁文件,我会犯下什么错误O_EXCEL?

时间:2012-02-20 17:22:19

标签: c++ unix solaris

我们创建了一个锁文件以避免竞争条件。锁定文件在/tmp目录中创建,该目录设置了粘滞位。我们没有将文件的模式作为可选项传递 文件创建期间的第三个参数。该文件使用fopen函数和

创建
int fd = fopen(filename, O_CREAT | O_EXCEL);

我们正在删除此锁定文件,一旦其使用结束。但有时文件不会被删除 它保留在/tmp文件夹中,阻止其他进程,应用程序仍处于活动状态,无需继续操作。通过向系统发送命令来删除锁定文件 并且使用的命令是/usr/bin -rf。令人惊讶的是,文件所有者和root用户都无法在此之后删除该文件。

  

ll lockfile文件夹中执行操作/tmp会授予O / P权限            “--- x ------”部分,我无法破译。更改权限            具有chmod 777 filenameroot用户ID的lockfile不起作用。            并且必须重新启动系统才能从/tmp目录中删除锁定文件。

2 个答案:

答案 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