【问题标题】:how to lock a file so that other process cannot cat it?如何锁定文件以使其他进程无法捕获它?
【发布时间】: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 的其他程序。只调用openreadclose(如cat)的程序甚至不会注意到它们。 fcntl 锁也是如此。事实上,我不知道 Unix 中 任何 形式的文件锁定会阻止对 open 和/或 read 的调用。换句话说,你想做的事是做不到的。

标签: c unix locking fcntl


【解决方案1】:

文件锁定不是强制锁定——它是建议锁定。

这意味着如果像cat 这样的程序不查看文件是否被锁定,那么其他程序是否锁定它并不重要——cat 仍然会读取文件。

除非您使用检查文件锁定的cat 变体,否则您将无法使用文件锁定来停止cat

你能做些什么呢?

  1. 重命名文件。
  2. 更改文件的权限。
  3. 决定不用担心。

最后一个选项是最简单的——也可能是最有效的。

某些系统确实支持强制文件锁定。通常,这是通过在不可执行文件上设置 SGID 位来指示的。如果您使用的是这样的系统,那么您应该能够阻止cat 处理锁定的文件。

【讨论】:

    猜你喜欢
    • 2013-03-16
    • 2011-03-14
    • 1970-01-01
    • 2016-08-06
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    相关资源
    最近更新 更多