如何编写reader.c以等待被锁定的文件解锁?附writer.c代码
编写reader.c实现等待文件解锁后操作
以下是符合需求的reader.c代码,它会等待writer.c释放文件锁后再执行读取操作:
#include <stdio.h> #include <stdlib.h> #include <sys/file.h> #include <fcntl.h> int main() { // 以只读二进制模式打开目标文件 FILE *fp = fopen("f.bin", "rb"); if (fp == NULL) { perror("Failed to open file"); return EXIT_FAILURE; } int fd = fileno(fp); // 请求共享锁,默认阻塞直到排他锁释放 if (flock(fd, LOCK_SH) == -1) { perror("Failed to acquire lock"); fclose(fp); return EXIT_FAILURE; } printf("Lock acquired, starting read...\n"); int a; // 读取文件中的整数数据 if (fread(&a, sizeof(int), 1, fp) != 1) { perror("Failed to read data"); flock(fd, LOCK_UN); fclose(fp); return EXIT_FAILURE; } printf("Read value: %d\n", a); // 释放锁并关闭文件 flock(fd, LOCK_UN); fclose(fp); return EXIT_SUCCESS; }
核心逻辑说明
- 锁机制匹配:和
writer.c保持一致使用flock锁,flock是基于整个文件的跨进程锁,不同进程间的锁状态互通。 - 阻塞等待:
flock(fd, LOCK_SH)默认是阻塞调用,当文件被writer.c的排他锁(LOCK_EX)占用时,reader.c会自动休眠,直到锁被释放后再继续执行。 - 锁类型选择:用
LOCK_SH共享锁更合理,读操作不需要独占文件,多个reader.c进程可以同时获取共享锁,不会互相阻塞。如果需要独占式操作,可替换为LOCK_EX,同样会等待解锁。 - 错误处理:添加了文件打开、锁获取、数据读取的异常判断,确保程序健壮性。
内容的提问来源于stack exchange,提问作者Vadim Kashtanov
相关产品推荐
相关产品推荐

