flock
2015-12-10 17:09
204 查看
flock返回正常0,不正常非0.
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 不阻塞,文件已经被所了的话返回非0。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/wait.h>
#include <errno.h>
#define LOCK_FILE_PATH "./flock.txt"
int main()
{
int pid = fork();
if(pid > 0)
{
usleep(200);//等一哈,等写文件
while(access(LOCK_FILE_PATH, F_OK))
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
usleep(200);
}
FILE *readf = fopen(LOCK_FILE_PATH, "r");
if(!readf)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
exit(-1);
}
int rfd = fileno(readf);
char getbuf[100];
if(flock(rfd, LOCK_EX | LOCK_NB) == 0)//锁文件,非阻塞模式,如果文件被锁,返回非0到else
{//正常
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fscanf(readf,"%10s", getbuf);
printf("surpas:%s,%d,%s\n", __FILE__, __LINE__, getbuf);
if(flock(rfd,LOCK_UN) == 0)
{//正常
printf("surpas:%s,%d\n", __FILE__, __LINE__);
}
}
else
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
}
fclose(readf);
wait(NULL);
printf("surpas:%s,%d\n", __FILE__, __LINE__);
}
else if(pid == 0)
{
FILE *writef = fopen(LOCK_FILE_PATH, "w");
if(!writef)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
exit(-1);
}
int wfd = fileno(writef);
if(flock(wfd, LOCK_EX) == 0)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fprintf(writef,"abcdefghijk123456");
sleep(2);//写完等一哈,看读那边是否阻塞
if(flock(wfd,LOCK_UN) == 0)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fclose(writef);
exit(0);
}
}
else
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fclose(writef);
exit(-1);
}
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fclose(writef);
exit(-1);
}
}
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 不阻塞,文件已经被所了的话返回非0。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/file.h>
#include <sys/wait.h>
#include <errno.h>
#define LOCK_FILE_PATH "./flock.txt"
int main()
{
int pid = fork();
if(pid > 0)
{
usleep(200);//等一哈,等写文件
while(access(LOCK_FILE_PATH, F_OK))
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
usleep(200);
}
FILE *readf = fopen(LOCK_FILE_PATH, "r");
if(!readf)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
exit(-1);
}
int rfd = fileno(readf);
char getbuf[100];
if(flock(rfd, LOCK_EX | LOCK_NB) == 0)//锁文件,非阻塞模式,如果文件被锁,返回非0到else
{//正常
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fscanf(readf,"%10s", getbuf);
printf("surpas:%s,%d,%s\n", __FILE__, __LINE__, getbuf);
if(flock(rfd,LOCK_UN) == 0)
{//正常
printf("surpas:%s,%d\n", __FILE__, __LINE__);
}
}
else
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
}
fclose(readf);
wait(NULL);
printf("surpas:%s,%d\n", __FILE__, __LINE__);
}
else if(pid == 0)
{
FILE *writef = fopen(LOCK_FILE_PATH, "w");
if(!writef)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
exit(-1);
}
int wfd = fileno(writef);
if(flock(wfd, LOCK_EX) == 0)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fprintf(writef,"abcdefghijk123456");
sleep(2);//写完等一哈,看读那边是否阻塞
if(flock(wfd,LOCK_UN) == 0)
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fclose(writef);
exit(0);
}
}
else
{
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fclose(writef);
exit(-1);
}
printf("surpas:%s,%d\n", __FILE__, __LINE__);
fclose(writef);
exit(-1);
}
}
相关文章推荐
- Fragment+ViewPager+RadioGroup实现的页面简单切换
- URI和URL的区别
- json的见解~~~~
- thinkphp 邮件发送
- 图的表示方式
- C#执行OracleHelper
- webview滑动事件监听
- 利用cookie来写计时器和历史记录(简略)
- 移除重复数据并插入置顶的文章ID
- 网页上右边有一个微信二维码随着页面滚动而不动的效果
- StringBuilder与StringBuffer的区别
- CentOS 7最小安装(文字界面)中设置连接网络
- C++11中的匿名函数(lambda函数,lambda表达式)
- sqlserver 2008 表分区测试
- Storm资源列表
- Android自定义XML文件
- [JWFD开源工作流]最新的工程
- Redis下的LRU缓存
- WebRTC-多人视频聊天流程
- If WCF Service side and Client side config is different?!