我想从c程序创建一个文件,我想在我的c二进制文件中使用一点时间。但是我想以这样的方式创建文件,在我的 c 程序完成处理创建的文件并解锁它之前,没有人(可以使用 vim 或任何其他编辑器)能够打开和读取文件内容。
请提前帮助我,谢谢。
为此,您可以在 Unix 上定义一个强制文件锁定。但是,有必要(重新)挂载文件系统,以便它遵循强制锁。
1 例如,要重新挂载根 fs,请使用 (作为根):
mount -oremount,mand /
2 现在,让我们创建我们的秘密文件:
echo "big secret" > locked_file
3 我们需要设置组 ID,并禁用对文件的组执行权限:
chmod g+s,g-x locked_file
以及我们的 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 */
}
更多信息请访问http://kernel.org/doc/Documentation/filesystems/mandatory-locking.txt
可以使用 flock() 锁定文件。它的语法是
#include <sys/file.h>
#define LOCK_SH 1 /* shared lock */
#define LOCK_EX 2 /* exclusive lock */
#define LOCK_NB 4 /* don't block when locking */
#define LOCK_UN 8 /* unlock */
int flock(int fd, int operation);
第一个文件使用 fopen() 或 open() 打开。然后这个打开的文件使用 flock() 锁定,如下所示
int fd = open("test.txt","r");
int lock = flock(fd, LOCK_SH); // Lock the file . . .
// . . . .
// Locked file in use
// . . . .
int release = flock(fd, LOCK_UN); // Unlock the file . . .
我喜欢第一个答案(简短而甜蜜),但它不适用于 CentOS-7 上的 gcc。这个小黑客满足了我对使用涉及procmail的小应用程序的需求(注意:如果您要更新数据文件内容,请务必在释放锁之前调用fflush。否则,跳过锁释放并仅调用fclose,因为此时似乎锁已被移除)
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/file.h>
//
#define LOCK_SH 1 // shared lock
#define LOCK_EX 2 // exclusive lock
#define LOCK_NB 4 // don't block when locking
#define LOCK_UN 8 // unlock
extern int errno; // this is located elsewhere
//
void debug(int rc){
if ((rc>0)||(errno>0)){
printf("rc: %d err: %dn", rc, errno);
errno = 0; // clear for next time
}
}
//
void main(){
FILE *fp;
int rc;
//
printf("fopenn");
fp = fopen("flock_demo.dat","r+");
if (fp == NULL){
printf("err: %dn", errno);
perror("-e-cannot open file");
exit(2);
}
printf("flockn");
rc = flock( fileno(fp), LOCK_EX );
debug(rc);
printf("now run this program on another sessionn");
printf("then hit <enter> to continue");
getchar();
printf("n");
printf("funlockn");
rc = flock( fileno(fp), LOCK_UN );
debug(rc);
printf("fclosen");
rc = fclose(fp);
debug(rc);
}