文件I/O-fcntl
定义
函数声明
flock结构体
建议锁
强制锁
实例
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/file.h> void lock_set(int fd, int type) { // 设置lock结构体 struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = type; // 根据不同的type值, 设置文件锁 if (fcntl(fd, F_SETLK, &lock) == 0) { if (lock.l_type == F_RDLCK) { printf("read lock already set by %d.\n", getpid()); } else if (lock.l_type == F_WRLCK) { printf("write lock already set by %d.\n", getpid()); } else if (lock.l_type == F_UNLCK) { printf("release lock by %d\n", getpid()); } else { printf("error l_type.\n"); } } else { // 判断文件不能设置锁的原因 fcntl(fd, F_GETLK, &lock); /*判断文件不能上锁的原因*/ if(lock.l_type == F_UNLCK) printf("no lock by %d\n",lock.l_pid); /*/该文件已有写入锁*/ if(lock.l_type == F_RDLCK) printf("read lock already set by %d\n",lock.l_pid); /*该文件已有读取锁*/ else if(lock.l_type == F_WRLCK) printf("write lock already set by %d\n",lock.l_pid); } } void lock_get(int fd) { // 设置flock结构体 struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = F_RDLCK; // 判断文件是否上锁 if (fcntl(fd, F_GETLK, &lock) < 0) { printf("get lock failure by %d \n", getpid()); } // 判断文件不能上锁的原因 if (lock.l_type == F_UNLCK) { printf("no lock by %d\n", lock.l_pid); } // 该文件已有写入锁 else if (lock.l_type == F_RDLCK) { printf("read lock already set by %d", lock.l_pid); } // 该文件已有读取锁 else if (lock.l_type == F_WRLCK) { printf("write lock already set by %d", lock.l_pid); } } int main(int argc, char *argv[]) { // 打开文件 int fd; fd = open(argv[1], O_CREAT | O_RDWR | O_TRUNC, 0666); if (fd == -1) { perror("Error open func.\n"); exit(EXIT_FAILURE); } // 选择功能 int type; switch (argv[2][0]) { case 'w': // 写锁 type = F_WRLCK; break; case 'r': // 读锁 type = F_RDLCK; break; case 'u': // 解锁 type = F_UNLCK; break; case 'g': // 获取锁状态 type = 0; break; default: break; } if (type == 0) { lock_get(fd); } else { lock_set(fd, type); } // 关闭文件 close(fd); exit(EXIT_SUCCESS); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理