使用C程序在Linux中锁定文件

use*_*947 3 filelock

我想从C程序创建一个文件,并且想在我的C二进制文件中使用较长时间。但是我想以这样的方式创建文件:在我的C程序完成对文件的创建和解锁之前,没有人(可以使用vim或任何其他编辑器)打开和读取文件内容。

请提前帮助我。

jul*_*mme 5

为此,您可以在Unix上定义强制性文件锁定。但是,有必要重新安装文件系统,以便使用强制性锁定。

1例如,要重新安装根fs,请使用(作为根):

mount -oremount,mand /
Run Code Online (Sandbox Code Playgroud)

2现在,让我们创建我们的秘密文件:

echo "big secret" > locked_file
Run Code Online (Sandbox Code Playgroud)

3我们需要设置set-group-id,并禁用文件的组执行特权:

chmod g+s,g-x locked_file
Run Code Online (Sandbox Code Playgroud)

还有我们用来锁定该文件的C代码:(该代码将锁定该文件,并将其锁定一段时间,您可以尝试另一个终端读取它,读取将被延迟,直到释放锁定为止)。

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main() {

struct flock fl;
int fd;

fl.l_type   = F_WRLCK;  /* read/write lock */
fl.l_whence = SEEK_SET; /* beginning of file */
fl.l_start  = 0;        /* offset from l_whence */
fl.l_len    = 0;        /* length, 0 = to EOF */
fl.l_pid    = getpid(); /* PID */

fd = open("locked_file", O_RDWR | O_EXCL); /* not 100% sure if O_EXCL needed */

fcntl(fd, F_SETLKW, &fl); /* set lock */

usleep(10000000);

printf("\n release lock \n");

fl.l_type   = F_UNLCK;
fcntl(fd, F_SETLK, &fl); /* unset lock */

}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问 http://kernel.org/doc/Documentation/filesystems/mandatory-locking.txt