首页 > 解决方案 > 在保持文件锁定的同时切换模式

问题描述

我正在编写 ac 程序,我需要将文件模式从写入切换到追加,但还需要通过以写入模式打开文件来维护我应用于文件的文件锁定。如何保持文件锁定状态并切换到用户可以输入文本的附加模式。

我正在使用 c 语言编写代码并使用 fcntl 锁定文件。并使用 fopen() 打开文件。我可以使用不同的指针打开同一文件的多个实例吗?

我在代码开始时第一次以写入模式打开文件,然后,当我接近程序中的附加选项时,我创建了另一个指针并在附加模式下使用 fopen() 打开同一个文件,而不关闭第一个文件。我知道这是错误的方法,但我担心如果我在以附加模式打开它之前使用 fclose() 关闭第一个文件指针,我在其中实现的文件锁将被释放,这是我不想的。谁能告诉我正确的方法?

我的功能基本上是这样的:

打开一个文件

对其应用建议文件锁定

让用户编辑该文件(向其中添加文本或删除文件或打印其内容)

温暖用户以进行同时编辑(如果有),然后允许他们继续

代码片段:

//to open file in write mode at the very beginning of program
FILE *fd = fopen(argv[1], "w");
int result = flock(fileno(fd), LOCK_SH);

//set fcntl
static struct flock lock;
lock.l_type = F_WRLCK;
lock.l_start = 0;
lock.l_whence = SEEK_SET;
lock.l_len = 0;
lock.l_pid = getpid();
int ret = fcntl(fd, F_SETLKW, &lock);

//switch case to append data
FILE *fPtr = fopen(argv[1], "a");
        printf("Enter contents to store in file : \n");
        gets(data);
        fprintf(fPtr, "%s", data);
        printf("Data added to the file successfully");
        fclose(fPtr);
        break;

//switch case to print contents:
fPtr = fopen(argv[1], "r");
        while(fgets(buffer, BUFFER_SIZE, fPtr) != NULL)
    {
     totalRead = strlen(buffer);
     buffer[totalRead - 1] = buffer[totalRead - 1] == '\n'
                                ? '\0'
                                : buffer[totalRead - 1];
     printf("%s\n", buffer);
     }fclose(fPtr);

标签: cfile

解决方案


推荐阅读