如何锁定文件以便其他进程无法捕获它?
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
。
你可以做什么?
- 重命名文件。
- 更改文件的权限。
- 决定不用担心了。
最后一个选项是最简单的,也可能是最有效的。
有些系统确实支持强制文件锁定。通常,这是通过在 non-executable 文件上设置 SGID 位来指示的。如果您正在使用这样的系统,那么您应该能够阻止 cat
处理锁定的文件。
#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
。
你可以做什么?
- 重命名文件。
- 更改文件的权限。
- 决定不用担心了。
最后一个选项是最简单的,也可能是最有效的。
有些系统确实支持强制文件锁定。通常,这是通过在 non-executable 文件上设置 SGID 位来指示的。如果您正在使用这样的系统,那么您应该能够阻止 cat
处理锁定的文件。