Linux 文件锁flock 实现两个进程相互监听存活状态
表头文件 #include<sys/file.h>
定义函数 int flock(int fd,int operation);
函数说明 flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。
在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock。
参数 operation有下列四种情况:
LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。
LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。
LOCK_UN 解除文件锁定状态。
LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。
单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。
返回值 返回0表示成功,若有错误则返回-1,错误代码存于errno。
int checkexit(char* pfile){
if (pfile == NULL)
return -;
int lockfd = open(pfile,O_RDWR);
if (lockfd == -)
return -;
int iret = flock(lockfd,LOCK_EX|LOCK_NB)
if (iret == -)
return -;
return ;
}
下面为两个进程的实例:
file1.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <unistd.h> int main(void)
{
int fp = open("file_lock.test", O_WRONLY);
int i = ; if (fp == -) //打开文件
{
printf("file1 open error!\n");
}
else{
printf("file1 open success!\n");
} if (flock(fp, LOCK_EX) != ) //给该文件加锁
{
printf("file1 lock by others\n");
}
else{
printf("file1 no user by others\n");
}
while () //进入循环,加锁时间为20秒,打印倒计时
{
printf("%d\n", i--);
sleep();
if (i == )
break;
}
close(fp); //20秒后退出,关闭文件
flock(fp, LOCK_UN); //文件解锁
return ; }
file2.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <unistd.h> int main(void)
{
int fp = open("file_lock.test", O_WRONLY);
int i = ; if (fp == -) //打开文件
{
printf("file2 open error!\n");
}else{
printf("file2 open success!\n");
} if (flock(fp, LOCK_EX) != ) //给该文件加锁
{
printf("file2 lock by others\n");
}
else{
printf("file2 no user by others\n");
}
while() //进入循环
{
printf("%d\n", i++);
sleep();
}
close(fp); //关闭文件
flock(fp, LOCK_UN); //释放文件锁
return ; }
1、4个文件,a进程文件a1,a2,b进程b1,b2
2、a进程加锁文件a1,b进程加锁文件b1
3、a进程创建a2文件,然后轮询查看b2文件是否存在(这里可以轮询,因为时间很短),不存在代表b进程还没创建,b进程同理
4、a进程轮询到b2文件存在了,代表b进程已经创建并可能在对b1文件加锁,此时删除文件b2,代表a进程已经加锁完毕,允许b进程读取a进程的锁,b进程同理
5、a进程监听文件a2,如果a2被删除,代表b进程进行到了步骤4已经对b1加锁完成,可以开始读取b1文件的锁(不能直接监听a2文件删除,也就是不能跳过34步,这也是最难想的一部分,如果那样可能此时b进程还没创建,和b进程创建完成并加锁完成的状态是一样的,就会让进程a误以为进程b加锁完成),b进程同理
a.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h> #define a1 "a1"
#define a2 "a2"
#define b1 "b1"
#define b2 "b2" void observer_file_exist(char* file_path){
int lockFD = access(file_path, F_OK);
while (lockFD == -){
lockFD = access(file_path, F_OK);
printf("wait %s create!\n", file_path);
sleep();
}
printf("%s create finish!\n", file_path);
} void observer_file_delete(char* file_path){
int lockFD = access(file_path, F_OK);
while (lockFD != -){
lockFD = access(file_path, F_OK);
printf("wait %s to be delete!\n", file_path);
sleep();
}
printf("%s create finish!\n", file_path);
} void remove_path_file(char* file_path){
int lockFD = access(file_path,F_OK);
if(lockFD!=-){
printf("%s exsit remove ... ing!\n",file_path);
int result=remove(file_path);
printf("%s exsit remove finish!\n",file_path);
}else{
printf("%s not exsit!\n",file_path);
}
} int main(void)
{ int fd1 = open(a1, O_WRONLY | O_CREAT,);;
if (fd1 == -) //打开文件
{
printf("%s has been created and completed !\n", a1);
}
else{
printf("%s crate success!\n", a1);
} if (flock(fd1, LOCK_EX) != ) //给该文件加锁
{
printf("no user by others, %s lock success\n",a1);
}else{
printf("lock by others ,%s lock fail \n",a1);
} int fd2 = open(a2, O_WRONLY | O_CREAT,);;
if (fd2 == -) //打开文件
{
printf("%s has been created and completed !\n", a2);
}
else{
printf("%s crate success!\n", a2);
}
close(fd2);
observer_file_exist(b2);
remove_path_file(b2);
observer_file_delete(a2);
printf("b process crate success!\n"); printf("wait %s release lock.\n",b1);
int fdb1 = open(b1, O_WRONLY);
if (flock(fdb1, LOCK_EX) == ){
printf("%s the file was unlocked \n",b1);
}else{
printf("%s the file was not unlocked. \n",b1);
} //close(fd1);
return ; }
b.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/file.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h> #define a1 "a1"
#define a2 "a2"
#define b1 "b1"
#define b2 "b2" void observer_file_exist(char* file_path){
int lockFD = access(file_path,F_OK);
while(lockFD == -){
lockFD = access(file_path,F_OK);
printf("wait %s create!\n",file_path);
sleep();
}
printf("%s create finish!\n",file_path);
} void observer_file_delete(char* file_path){
int lockFD = access(file_path,F_OK);
while(lockFD != -){
lockFD = access(file_path,F_OK);
printf("wait %s to be delete!\n",file_path);
sleep();
}
printf("%s create finish!\n",file_path);
} void remove_path_file(char* file_path){
int lockFD = access(file_path,F_OK);
if(lockFD!=-){
printf("%s exsit remove ... ing!\n",file_path);
int result=remove(file_path);
printf("%s exsit remove finish!\n",file_path);
}else{
printf("%s not exsit!\n",file_path);
}
} int main(void)
{ int fd1 = open(b1, O_WRONLY|O_CREAT,);;
if (fd1 == -) //打开文件
{
printf("%s has been created and completed !\n",b1);
}else{
printf("%s crate success!\n",b1);
} if (flock(fd1, LOCK_EX) == ) //给该文件加锁
{
printf("no user by others, %s lock success\n",b1);
}else{
printf("lock by others ,%s lock fail \n",b1);
} int fd2 = open(b2, O_WRONLY|O_CREAT,);;
if (fd2 == -) //打开文件
{
printf("%s has been created and completed !\n",b2);
}else{
printf("%s crate success!\n",b2);
}
close(fd2);
observer_file_exist(a2);
remove_path_file(a2);
observer_file_delete(b2);
printf("a process crate success!\n"); printf("wait %s release lock.\n",a1);
int fda1 = open(a1, O_WRONLY);
if(flock(fda1, LOCK_EX)==){
printf("%s the file was unlocked.\n",a1);
}
else{
printf("%s the file was not unlocked.\n",a1);
} //close(fd1);
return ; }
Linux 文件锁flock 实现两个进程相互监听存活状态的更多相关文章
- 本地启动服务,两个进程分别监听两个端口,导致两个 URL 不同
问题描述: 本地启了两个服务:A(http://localhost:8001) B(http://localhost:8000),A 项目要怎么才能关联到 B 项目,也就是 A 项目请求怎么跳到 B ...
- linux文件锁flock【转】
转自: https://www.cnblogs.com/kex1n/p/7100107.html linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要 ...
- Linux文件锁flock
Linux文件锁flock 在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. flock,建议性锁 ...
- Linux文件锁flock ,检测进程是否已经存在
在多个进程同时操作同一份文件的过程中,很容易导致文件中的数据混乱,需要锁操作来保证数据的完整性,这里介绍的针对文件的锁,称之为“文件锁”-flock. 头文件:#include<sys/fil ...
- linux网络连接的查看和端口的监听
网络软件都是由客户端和服务端组成,由服务端在服务器上监听指定的端口处理接收到的数据,而客户端是向服务器端监听的端口发送数据,并由服务器端对该数据进行处理,然后将处理结果返回给客户端. 那么我们在lin ...
- java实现服务端守护进程来监听客户端通过上传json文件写数据到hbase中
1.项目介绍: 由于大数据部门涉及到其他部门将数据传到数据中心,大部分公司采用的方式是用json文件的方式传输,因此就需要编写服务端和客户端的小程序了.而我主要实现服务端的代码,也有相应的客户端的测试 ...
- linux下oracle11g R2的启动与关闭监听、数据库
su - oracle 切换到oracle账户 lsnrctl start 启动监听 sqlplus /nolog 登陆sqlplus conn /as ...
- linux上使用netstat查看当前服务和监听端口
netstat这个命令常用在网络监控方面.利用这个命令,可以查看当前系统监听的服务和已经建立的服务,以及相应的端口.协议等信息. netstat参数说明 netstat参数虽然很多,但是常用的不多,主 ...
- linux下启动多个php,分别监听不同的端口。
在工作中,我们可能会遇到,服务器集群的搭建. 这个时候,我们不可能,每一台服务器都是lnmp的环境,我们会把nmp分别放在不同的服务器上,不同的服务器负责不同的功能.比如我们下面要说的php 加入ng ...
随机推荐
- html+css自定义导航
利用css来编写的导航条,先看看效果: 代码区: html: <!--导航部分--> {block name="nav"} <nav> <div cl ...
- 人工智能热门图书(深度学习、TensorFlow)免费送!
欢迎访问网易云社区,了解更多网易技术产品运营经验. 这个双十一,人工智能市场火爆,从智能音箱到智能分拣机器人,人工智能已逐渐渗透到我们的生活的方方面面.网易云社区联合博文视点为大家带来人工智能热门图书 ...
- python---信用卡ATM
一 需求 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还, ...
- npm 还是 yarn ?
技术选型时这个问题总是困扰我,今天看到一篇文章,详细的解释了 npm 和 yarn 在性能,安全,支持性和使用难易度上的区别,看完之后这个问题终于有一个答案: 如果你在意速度和 UI,选 yarn,如 ...
- winform 动态添加控件及事件
for (int i = 0; i < 4; i++) { Button btn = new Button(); //btn.Name = dt.Rows[i]["ANDON_CONT ...
- 13、OpenCV Python canny边缘提取
__author__ = "WSX" import cv2 as cv import numpy as np def lapalian_demo(image): #拉普拉斯算子 # ...
- 18.Jewels and Stones(珠宝和石头)
Level: Easy 题目描述: You're given strings J representing the types of stones that are jewels, and Sre ...
- 洛谷 P1028 数的计算
嗯... 首先这道题想到的就是递推.... 但是递推失败 (不知道自己是怎么想的 然后又想打一个暴力,但是数的最高位太难存储了,所以又放弃了(并且好像这个暴力大约500就会炸... 然后看了题解,才发 ...
- 神奇的操作--O(1)快速乘
从同机房大佬那里听来的... 用O(1)时间求出两个相乘超过long long的数的取摸的结果 神奇的操作... inline long long multi(long long x,long lon ...
- 关于Django在写小项目的一些小注意事项
个人常踩的坑的小问题: . 在筛选元素的时候,及时queryset里面只有一个元素,取值还是要用方法取出来 例:#当狗指定pd时候已经唯一,还是要加fir()方法,本人经常忘记了 models.Boo ...