linux下多进程同时操作文件

原创 2015年07月14日 15:51:19

        我们都知道多进程同时操作文件会出现问题,但是具体会出现什么问题呢?不知道大家有没有仔细研究过,今天我就带大家一起来研究一下。

     在操作文件之前,很有必要了解一下内核中文件的存储和访问方式:

      这张图摘自《APUE》,我觉得画的很好,所以就没有自己再画了。

       从图中能够看出每个进程都有自己独立的一个进程表项,由文件指针指向文件表项;在文件表项中两个很重要的东西:状态标志和当前文件偏移量,问什么说它很重要,因为在多进程写文件出错时,一般都是由文件偏移量引起的(这个后面会讲到);然后由V节点指针指向一个V节点表(关于i节点我会在另外的博客中阐述)

       第一种情况:父子进程同时写一个文件


      父进程再用fork函数创建子进程的时候,会把自己的上下文环境拷贝一份复制到子进程的内存空间中,这里当然包括进程表。所以子进程的进程表和父进程的是一模一样的,它们指向的是同一个文件表,上面讲到过,当前偏移量会引起文件操作错误。

      对于这个文件偏移量,有几点需要搞清楚:在用open函数打开文件时如果没有加上O_APPEND标志,那么这个文件表的文件偏移量为0;加上的话,它会把V节点中的当前文件长度赋给文件偏移量;写完文件之后(没有关闭文件描述符),文件长度会变化,相应的当前偏移量也随着文件长度的变化而变化。这里需要注意,是写完一个文件之后(也就是write函数执行完之后),便宜量才会改变。

     到这里的话,基本上就清楚了:如果写操作是一个原子操作的话(可以用pwrite实现),那么父子进程写同一个文件不会出现任何问题;如果不是原子操作的话,有可能在父进程的write函数没有返回之前又执行了子进程的write函数,由于当前文件偏移量没有改变,所以会覆盖掉原先内容。

      第二种情况:非父子进程写同一个文件

     

       对于非父子类型的多进程写同一个文件,其情况又是另外一回事了:

        进程各自有各自的进程表,至于为什么要有各自的进程表而不是共享一个进程表?可以这么想:各个进程打开文件的标志可能会不一样,有的可能只读、只写、或者读写方式,这样的话,它们中的内容肯定会不一样。

       对于fd0,假设它刚刚写完一个文件,fd0指向的文件表中的当前偏移量改变了,但是fd1中的偏移量没有改变,这就造成fd1在写文件时会覆盖fd0写入文件的内容。

      具体情况大家可以在自己的机器上试验一下。


       

版权声明:本文为博主原创文章,未经博主允许不得转载。

Python多进程写入同一文件

最近用python的正则表达式处理了一些文本数据,需要把结果写到文件里面,但是由于文件比较大,所以运行起来花费的时间很长。但是打开任务管理器发现CPU只占用了25%,上网找了一下原因发现是由于一个叫G...
  • Q_AN1314
  • Q_AN1314
  • 2016年07月16日 10:18
  • 11201

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

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

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

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

Linux 多进程读写文件 文件锁

目前遇到一个问题:多个进程对同一个文件进行写操作,如何避免冲突。研究了一下,做个小结。   对于多进程写文件,主要有以下两种处理方式: 1.类似于Linux日志文件服务 启动一...
  • abcd1f2
  • abcd1f2
  • 2015年07月07日 14:30
  • 1012

Linux 多进程读写文件 文件锁

目前遇到一个问题:多个进程对同一个文件进行写操作,如何避免冲突。研究了一下,做个小结。   对于多进程写文件,主要有以下两种处理方式: 1.类似于Linux日志文件服务 启动一个logger进...
  • dajian790626
  • dajian790626
  • 2013年01月29日 18:33
  • 1698

Linux系统环境下关于多进程并发写同一个文件的讨论

讨论关于并发环境下,多个进程对同一文件写入的问题,我们会涉及到文件共享的知识。在开始之前,我们先讨论一些有关文件共享的知识。 1. 文件共享   Unix系统支持在不同进程间共享打开的文件...
  • midion9
  • midion9
  • 2016年01月14日 16:32
  • 1641

linux 利用进程向文件中写入并输出1~100

  • 2009年11月19日 12:13
  • 991B
  • 下载

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

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

多进程同时写一个文件会怎样?

一、问题还原在多进程的环境下,父子进程同时去写一个文件,例如父进程每次写入aaaaa,子进程每次写入bbbbb,问题是会不会出现写操作被打断的现象,比如出现aabbbaaabb这样交替的情况?二、结论...
  • yangbodong22011
  • yangbodong22011
  • 2017年03月18日 01:46
  • 2764

Linux多进程之间的文件锁详解

之前对于文件的操作通常在一个进程中完成,最近需要在两个进程中对同一个文件进行操作。故想到了文件锁。linux下可以使用flock()函数对文件进行加锁解锁等操作。简单介绍下flock()函数: 1....
  • wangbaochu
  • wangbaochu
  • 2015年09月18日 15:38
  • 3982
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux下多进程同时操作文件
举报原因:
原因补充:

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