如何锁定文件以便其他进程无法捕获它?

how to lock a file so that other process cannot cat it?

#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
    }
}

我想锁定一个包含 lorem ipsum(一些随机文本)的文件 (test),以便其他进程无法 cat 它,直到当前进程释放锁。但是传递给 fcntl 的参数是错误的?

编辑: 在评论之后我已经初始化了 fl 变量的一些成员(见编辑),不,尽管工作。我仍然可以在另一个进程中 cat 锁定的文件 test...为什么,当它被锁定时?

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

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

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

你可以做什么?

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

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

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