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进行加锁操作,原因在于两个进程对其文件上锁的位置不一样,所以可以成功地对该文件上锁;

原创粉丝点击