#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
struct flock fl;
fl.l_start = 0;
fl.l_len = 517; //found the size of the file outside (not best practise, I know)
fl.l_whence = SEEK_SET;
int fd = open("test", O_RDWR);
if(fd<0)
perror("open");
fl.l_type = F_RDLCK;
fl.l_pid = getpid();
if(fcntl(fd, F_SETLK, &fl) < 0)
{
perror("fcntl"); //geting fcntl: Invalid argument
exit(1);
}
if(fl.l_type != F_UNLCK)
{
printf("file has been exclusively locked by process:%un",fl.l_pid);
printf("press enter to release the filen");
getchar();
fl.l_type = F_UNLCK; //file released
}
}
我想锁定一个文件(test
(,其中包含lorem ipsum(一些随机文本(,这样在当前进程释放锁定之前,其他进程无法对其进行cat
。但是传递给fcntl
的哪个论点是错误的?
编辑:在评论之后,我已经初始化了fl
变量的一些成员(参见编辑(,没有,尽管正在工作。我仍然可以在另一个进程中cat
锁定的文件test
。。。为什么,当它被锁住的时候?
文件锁定不是强制锁定,而是建议锁定。
这意味着,如果像cat
这样的程序不查看文件是否被锁定,那么其他程序是否锁定它并不重要——cat
仍然会读取该文件。
除非您使用cat
的变体来检查文件锁定,否则您将无法使用文件锁定来停止cat
。
你能做什么呢?
- 重命名文件
- 更改文件的权限
- 决定不用担心
最后一个选项是最简单的,可能也是最有效的。
某些系统确实支持强制文件锁定。通常,这是通过在不可执行文件上设置SGID位来指示的。如果您使用这样的系统,那么您应该能够阻止cat
处理锁定的文件。