【发布时间】:2020-08-28 19:32:31
【问题描述】:
#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:%u\n",fl.l_pid);
printf("press enter to release the file\n");
getchar();
fl.l_type = F_UNLCK; //file released
}
}
我想锁定一个文件 (test),其中包含 lorem ipsum(一些随机文本),以便其他进程无法 cat 它直到当前进程释放锁定。但是传递给fcntl 的哪个参数是错误的?
编辑:
在 cmets 之后,我已经初始化了 fl 变量的一些成员(请参阅编辑),不,尽管工作。我仍然可以在另一个进程中cat锁定文件test...为什么,当它被锁定时?
【问题讨论】:
-
你没有初始化羊群结构。
-
阅读手册。 “记录锁定,它允许多个合作程序防止彼此同时以容易出错的方式访问文件的某些部分”。 “请记住,文件锁定只是用于控制对文件的访问的建议协议。不使用锁定协议的程序仍有可能访问文件。”所以不,你不能用这个阻止
cat。 -
你到底需要这个做什么?如果您正在写入某个文件并且在完成之前您不希望任何人阅读它,请首先写入一个没有任何人读取权限的临时文件,完成后您可以将其移动到右侧放置并修复权限。如果还有什么,请解释一下。
-
@give_me_one 什么?我想知道你想做什么。有一种叫做XY Problem 的东西,有人问如何做 Y,因为他们认为这会帮助他们做 X。但如果他们只是问如何做 X,他们会得到更好的答案。我问我做了什么,因为我想确保这里不是这种情况。
-
flock锁只阻止调用flock的其他程序。只调用open、read和close(如cat)的程序甚至不会注意到它们。fcntl锁也是如此。事实上,我不知道 Unix 中 任何 形式的文件锁定会阻止对open和/或read的调用。换句话说,你想做的事是做不到的。