linux多进程之间的文件锁

转载 2015年07月07日 10:14:48

原文地址>>

之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。

linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数:
      表头文件  #include

   定义函数  int flock(int fd,int operation);

   函数说明  flock()会依参数operation所指定的方式对参数fd所指的文件做各种锁定或解除锁定的动作。此函数只能锁定整个文件,无法锁定文件的某一区域。

   参数  operation有下列四种情况:

   LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。

  LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。

  LOCK_UN 解除文件锁定状态。

   LOCK_NB 无法建立锁定时,此操作可不被阻断,马上返回进程。通常与LOCK_SH或LOCK_EX 做OR(|)组合。

   单一文件无法同时建立共享锁定和互斥锁定,而当使用dup()或fork()时文件描述词不会继承此种锁定。

   返回值  返回0表示成功,若有错误则返回-1,错误代码存于errno。

为了更好的移植性,对于文件的打开与关闭我选择了fopen和fclose的组合,但flock的第一个参数要求的是int类型的文件描述符。这里对fopen返回的FILE类型的文件指针进行转换,转换为int型的文件描述符 (假设open函数返回的文件描述符为fd,而fopen返回的文件指针为*fp,则fd等价于fp->_fileno).


下面为两个进程的实例:

 

#include

#include

#include

#include


int main(void)

{

    FILE *fp = NULL;

    int i = 20; 

    

    if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件

        printf("file open error!\n");

    if (flock(fp->_fileno, LOCK_EX) != 0) //给该文件加锁

        printf("file lock by others\n");

    while(1) //进入循环,加锁时间为20秒,打印倒计时

    {   

        printf("%d\n", i--);

        sleep(1);

        if (i == 0)

            break;

    }   

    fclose(fp); //20秒后退出,关闭文件

    flock(fp->_fileno, LOCK_UN); //文件解锁

    return 0;

 

}


 

#include

#include

#include

#include


int main(void)

{

    FILE *fp = NULL;

    int i = 0;

    

    if ((fp = fopen("./file_lock.test", "r+b")) == NULL) //打开文件

        printf("file open error!\n");

    flock(fp->_fileno, LOCK_EX); //文件加锁

    while(1) //进入循环

    {   

        printf("%d\n", i++);

        sleep(1);

    }   

    fclose(fp); //关闭文件

    flock(fp->_fileno, LOCK_UN); //释放文件锁

    return 0;

 

}


首先运行file1.c,紧接着运行file2.c(运行file1.c后20秒内要运行file2.c否则看不到现象)
现象是:file1.c执行起来以后,开始倒计时。此时运行file2.c会阻塞在加锁处。当file1.c运行20秒后关闭文件,并释放文件锁后,file2.c会开始运行。

Linux C:多进程文件操作之文件锁

flock函数可以锁定文件,避免多个进程对同个文件进行操作时出现数据出错。flock的用法是在打开文件后对文件读写前调用flock函数上锁,文件操作完后flock解锁,但需注意另一个进程操作同个文件时...

linux多进程之间的文件锁

转载地址:http://blog.sina.com.cn/s/blog_804354760101al6q.html 之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操...
  • kunkliu
  • kunkliu
  • 2017年12月04日 15:12
  • 4

linux下多进程多线程写文件

  • 2015年10月04日 18:17
  • 4KB
  • 下载

Linux:多进程访问同一文件,如何用文件锁进行保护, fcntl()详解

在Linux系统中,进程运行在自己的虚拟内存空间中,如何协调不同虚拟地址空间中的进程访问一个非共享资源,文件加锁是基本进程通信方法之一。   可以使用fcntl()、lockf()、flock()...

各种多进程之间的通信实例

  • 2013年01月17日 16:55
  • 5.64MB
  • 下载

共享内存,多进程之间实现共享

  • 2011年05月06日 17:08
  • 94KB
  • 下载

linux下多进程/多线程文件操作详解

一、基本概念 内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响 1.每个进程在进程表都有一个记录项,记录项中包含有一张打开文件描述符表,与文件描...

linux下多进程写入文件的原子性

【原文链接】 http://tsecer.blog.163.com/blog/static/1501817201311284223689/
  • PlayerL
  • PlayerL
  • 2014年10月07日 11:43
  • 3448

Linux C 多进程下载文件demo

1、使用多进程,实现多个客户端同时下载文件目录: 头文件#include #include #include #include #include #include #include #...

Linux--多进程拷贝一个文件

下面程序是一个精简版的多进程拷贝文件,要求源文件是一个文件,而不是一个目录。程序注意点是,必须在创建进程后在进程中打开源和目的文件,否则, 通过fork之后,多个进程会同时共享一个文件表项,导致读写...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux多进程之间的文件锁
举报原因:
原因补充:

(最多只允许输入30个字)