当前位置: 技术问答>linux和unix
关于文件读写的问题
来源: 互联网 发布时间:2017-03-24
本文导语: 环境: linux 2.6 1, 多个进程同时写文件的话, 每一个进程open一个自己的文件句柄, 然后同事对一个文件进行读写, 每一个读写是原子的么? 会不会比如: 进程A写了一半,里面又有进程B写进去的内容? 需不需要加锁呢? ...
环境: linux 2.6
1, 多个进程同时写文件的话, 每一个进程open一个自己的文件句柄, 然后同事对一个文件进行读写, 每一个读写是原子的么? 会不会比如: 进程A写了一半,里面又有进程B写进去的内容? 需不需要加锁呢?
2, 单个进程的多线程共享一个文件句柄, 是否会发生比如A线程还没写完,B文件又写了一部分进去, 也就是说A线程无法输出一条完整的日志,B线程就写进去了, 需要给文件加锁么?
3, 打开文件如果为append方式,用fprintf,或者write,fwrite等方式, 会不会出现问题1,2的情况.
4, 写文件过程中, linux是否有它自己的输出缓冲区, 也就是说不是立刻调用IO,而是缓冲区满了之后才输出出来. 但是我在后台跟踪日志的时候,还是能够看到及时消息的, 为什么? 它刷新文件的机制是什么呢?
请各位达人指教, 能否有什么书可以描写这部分, 我对这一块一直有点迷糊, 多谢
1, 多个进程同时写文件的话, 每一个进程open一个自己的文件句柄, 然后同事对一个文件进行读写, 每一个读写是原子的么? 会不会比如: 进程A写了一半,里面又有进程B写进去的内容? 需不需要加锁呢?
2, 单个进程的多线程共享一个文件句柄, 是否会发生比如A线程还没写完,B文件又写了一部分进去, 也就是说A线程无法输出一条完整的日志,B线程就写进去了, 需要给文件加锁么?
3, 打开文件如果为append方式,用fprintf,或者write,fwrite等方式, 会不会出现问题1,2的情况.
4, 写文件过程中, linux是否有它自己的输出缓冲区, 也就是说不是立刻调用IO,而是缓冲区满了之后才输出出来. 但是我在后台跟踪日志的时候,还是能够看到及时消息的, 为什么? 它刷新文件的机制是什么呢?
请各位达人指教, 能否有什么书可以描写这部分, 我对这一块一直有点迷糊, 多谢
|
就三楼说的,请教一下啊
1、多进程需要互斥加锁没问题,但多线程时,用的是同一打开文件表项,就是用的同一个偏移指针,不用加锁吧?
2、关于文件缓存机制,看APUE和这篇文件http://www.ibm.com/developerworks/cn/linux/l-cn-directio/index.html
|
我明白楼主的意思,但是write在写入数据小于一定长度就视为原子操作,而楼主的中文……且算作是20个字节吧!这个长度是很小的!所以楼主的程序中单次write不会被打断,也就是说不会输出类似:“这是来自线程1的这是来自线程2的数据n数据n”这样的效果。
所以楼主的程序肯定是一句一句的输出出来没问题,但是同一线程的1000句会被打断输出,举个例子,就是第一行是线程1输出的,但是你不能保证第二句也是线程1输出的,这就是问题所在。但是如果楼主要的就是这样,那确实,不用加锁!
但是,我们的程序一般情况下是要求每个线程多句写入的内容要在文件中连续。另外,程序大多读写都有,如果是这样,那楼主的程序就会问题百出。所以针对此情况linux提供了读写锁机制!
如果资源并发的被访问就要加锁,应尽量避免并发访问,其实这是常识性的东西。
所以楼主的程序肯定是一句一句的输出出来没问题,但是同一线程的1000句会被打断输出,举个例子,就是第一行是线程1输出的,但是你不能保证第二句也是线程1输出的,这就是问题所在。但是如果楼主要的就是这样,那确实,不用加锁!
但是,我们的程序一般情况下是要求每个线程多句写入的内容要在文件中连续。另外,程序大多读写都有,如果是这样,那楼主的程序就会问题百出。所以针对此情况linux提供了读写锁机制!
如果资源并发的被访问就要加锁,应尽量避免并发访问,其实这是常识性的东西。