直接提供一份文件锁的demo:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <fcntl.h> /*check lock status*/ void wr_lock_status(int type) { switch (type){ case F_RDLCK: printf("Current lock is F_RDLCK\n"); break; case F_WRLCK: printf("Current lock is F_WRLCK\n"); break; case F_UNLCK: printf("Current lock is F_UNLCK\n"); break; default: break; } } /*lock the file*/ int wr_file_lock(char *filename, int lock_type) { int fd; struct flock lock; int ret; fd = open(filename,O_RDWR | O_TRUNC); if (-1 == fd){ perror("open error\n"); return -1; } lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; lock.l_type = lock_type; lock.l_pid = -1; ret = fcntl(fd,F_GETLK,&lock); if (-1 == ret){ perror("Get lock status failed\n"); return -1; } wr_lock_status(lock.l_type); //unlck then do it if (lock.l_type == F_UNLCK){ lock.l_type = lock_type; ret = fcntl(fd,F_SETLK,&lock); if (-1 == ret){ printf("Lock failed %d\n",lock.l_type); return -1; } wr_lock_status(lock.l_type); }else{ return -1; } return 0; } /*write something in file*/ int wr_file_write(char *filename, char *text) { FILE *file; int ret; file = fopen(filename,"ab"); if (NULL == file){ perror("error fopen\n"); return -1; } ret = fwrite(text,sizeof(char),strlen(text),file); if (EOF == ret){ perror("error fwrite\n"); return -1; } return ret; } int main(int argc, char **argv) { char filename[32] = "/tmp/wat"; char text[32] = "helloworld"; int ret; ret = wr_file_lock(filename,F_WRLCK); if (-1 == ret){ printf("wr_file_lock error at main\n"); return -1; } printf("lock wrlock succussfully\n"); ret = wr_file_write(filename,text); if (-1 == ret){ printf("fwrite failed\n"); return -1; } printf("fwrite %d\n",ret); //ret = wr_file_lock(filename,F_UNLCK); if (-1 == ret){ perror("unlock error\n"); return -1; } while(1){ sleep(2); ret = wr_file_write(filename,text); if (-1 == ret){ printf("fwrite failed\n"); return -1; } printf("fwrite %d\n",ret); } return 0; }
效果图:
已经用上F_WRLCK则需要去解锁。
Life is mess, don't let mess mess us.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了