c - 在保持文件锁定的同时切换模式
问题描述
我正在编写 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);
解决方案
推荐阅读
- angular - 如何在 StackBlitz 中降级 npm 包的依赖关系?
- visual-studio - 将 C++ Builder 项目移植到 Visual Studio?
- java - java - 无法从客户端向服务器发送多条消息
- sql - Oracle 中的模式匹配
- angular - Angular / Firestore - 根据特定值创建多个文档
- lua - 'then' 预计在 ',' 附近,但我已经将 then 放置在 Lua 中
- java - Spring Data MongoDB nosql 注入
- android - 显示黑色背景的导航抽屉视图背景颜色
- javascript - 重复使用代码而不提交表单两次
- vba - 使用 VBA 插入分页符