文件锁
文件锁
int lockf(int fd, int cmd, off_t len);
int flock(int fd, int operation);
int fcntl(int fd, int cmd, ... /* arg */ );
例程:lockf.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/wait.h>
#define FILENAME "/tmp/out" //echo 1 > /tmp/out
#define PROCNUM 20
#define BUFFSIZE 1024
static void add(void)
{
FILE *fp;
int fd;
char buff[BUFFSIZE];
fp = fopen(FILENAME,"r+"); //读写方式打开文件
if(fp == NULL)
{
perror("fopen():");
exit(1);
}
fd = fileno(fp); //通过文件流获取文件符
lockf(fd,F_LOCK,0); //锁住文件 从当前位置到文件末尾
fgets(buff,BUFFSIZE,fp); //读取文件
fseek(fp,0,SEEK_SET); //偏移到文件头
fprintf(fp,"%d\n",atoi(buff)+1); //将内容加一在写入文件
sleep(1); //测试
fflush(fp); //刷新数据流
lockf(fd,F_ULOCK,0); //解锁文件 从文件当前位置到文件末尾
fclose(fp); //关闭文件
}
int main(int argc, char **argv)
{
int i;
pid_t pid;
for(i=0;i<PROCNUM;i++) //循环创建子线程
{
pid = fork();
if(pid <0)
{
perror("fork():");
exit(1);
}
if(pid ==0)
{
add(); //子线程执行add函数
exit(0);
}
}
for(i=0;i<PROCNUM;i++) //等待子线程结束
wait(NULL);
exit(0);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现