3

我想从 c 程序创建一个文件,我想在我的 c 二进制文件中使用很长时间。但我想以这样的方式创建文件,直到我的 c 程序完成处理文件创建并解锁它之前没有人(可能使用 vim 或任何其他编辑器)能够打开和读取文件内容。

请提前帮助我。

4

3 回答 3

5

为此,您可以在 Unix 上定义强制文件锁定。但是,有必要(重新)挂载文件系统,以便它遵守强制锁。

1 例如,要重新挂载 root fs,请使用(作为 root):

mount -oremount,mand /

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

echo "big secret" > locked_file

3 我们需要设置-group-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

于 2012-11-20T07:56:45.753 回答
1

可以使用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 . . .
于 2015-12-03T09:53:51.350 回答
0

我喜欢第一个答案(简短而甜蜜),但它在 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: %d\n", rc, errno);
        errno = 0;  // clear for next time
    }
}   
//
void main(){
    FILE *fp;
    int rc;
    //
    printf("fopen\n");
    fp = fopen("flock_demo.dat","r+");
    if (fp == NULL){
        printf("err: %d\n", errno);
    perror("-e-cannot open file");
    exit(2);
    }
    printf("flock\n");
    rc = flock( fileno(fp), LOCK_EX );
    debug(rc);
    printf("now run this program on another session\n");
    printf("then hit <enter> to continue");
    getchar();
    printf("\n");
    printf("funlock\n");
    rc = flock( fileno(fp), LOCK_UN );
    debug(rc);
    printf("fclose\n");
    rc = fclose(fp);
    debug(rc);
}
于 2021-11-14T13:41:11.227 回答