linux系统编程之记录锁
来源:互联网 发布:装修报价预算软件 编辑:程序博客网 时间:2024/06/02 01:49
1.如果多个进程/线程同时写文件,那么使用O_APPEND,可以保证写操作是原子操作,但是O_APPEND只写到文件末尾。如果需要修改文件内容,则无法使用O_APPEND了,需要使用记录锁来锁定文件,保证写操作的原子性。
/************************************************************************* * File Name: Record.cpp * Author: The answer * Function: Other * Mail: 2412799512@qq.com * Created Time: 2017年08月11日 星期五 20时02分01秒 ************************************************************************/#include<iostream>#include<string.h>#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<sys/stat.h>#include<sys/types.h>#include<fcntl.h>#include<assert.h>using namespace std;int main(int argc,char **argv){ int fd = 0; int ret = 0; const char * buf = "hello world.\n"; /* hello.txt为空文件 */ fd = open("hello.txt",O_RDWR); assert(fd != -1); struct flock lock; lock.l_type = F_WRLCK; /* 写锁*/ lock.l_whence = SEEK_SET; /* SEEK_SET */ lock.l_start = 0; lock.l_len = 1024; /* 开始对文件进行加锁 */ fcntl(fd,F_SETLKW,&lock); printf("process %d have the lock.\n",getpid()); /* 对文件进行写操作 */ ret = write(fd,buf,strlen(buf)); assert(ret >= 0); puts("wait unlock..."); getchar(); lock.l_type = F_UNLCK; fcntl(fd,F_SETLKW,&lock); printf("process %d have unlock.\n",getpid()); return 0;}
2.此刻文件会被加锁,直到键盘的回车被按下,才被解锁;这时若另外一个进程也想对这个文件再次进行加锁,是会阻塞在那里的,直到原来的锁解锁之后才能对其进行操作;可以看到两个进程阻塞了。另外一个进程的加锁部分代码如下:
truct flock lock; lock.l_type = F_WRLCK; /* 写锁*/ lock.l_whence = SEEK_SET; /* SEEK_SET */ /* 和上面第一个程序上锁的位置相同 */ lock.l_start = 4096; lock.l_len = 1024;
3. 若指定两个锁加锁文件不在同一个地方,则不会受到影响,所谓“记录锁”,就是能够对文件的某部分进行加锁操作;修改另外一个进程的加锁位置如下:
struct flock lock; lock.l_type = F_WRLCK; /* 写锁*/ lock.l_whence = SEEK_SET; /* SEEK_SET */ /* 修改两个锁不在文件的同一个位置加锁便可 */ lock.l_start = 4096; lock.l_len = 1024;
运行结果:
可以看到两个进程都可以同时对该文件hello.txt进行加锁操作,原因在于两个进程对其文件上锁的位置不一样,所以可以成功地对该文件上锁;
阅读全文
0 0
- linux系统编程之记录锁
- UNIX/LINUX编程学习之文件锁、记录锁
- Linux系统编程之fcntl
- Linux系统编程之管道
- linux编程之系统调用
- Linux系统编程之----》信号
- linux系统编程之进程
- linux系统编程之网络编程(一)
- Linux学习记录--文件管理相关系统编程
- Linux学习记录--文件IO操作相关系统编程
- Linux系统编程---记录终端输入的命令
- Linux服务器编程——Linux系统编程之进程
- Linux嵌入式系统编程之C基础!
- LINUX系统编程之日历时间
- linux系统编程之fcntl使用
- linux系统编程之getsockopt/setsockopt 函数
- linux 系统编程 之信号 test10_1.c
- linux 系统编程之信号 test10_2.c
- OC:希尔排序的理解
- 机器学习Chapter-1(线性模型)
- 143_IO_File_路径常量_绝对与相对路径_构建对象
- Android Input系统InputManagerService简介
- linux压缩解压命令
- linux系统编程之记录锁
- 金明的预算budget题解
- AndroidUI之TextView属性讲解
- 【java数据结构】插入排序
- Zynq usb无法识别
- 集合类接口的实现类
- js 数组对象去重
- 堆砖块
- C语言符号