linux 关于文件读写的问题
环境:linux2.61,多个进程同时写文件的话,每一个进程open一个自己的文件句柄,然后同事对一个文件进行读写,每一个读写是原子的么?会不会比如:进程A写了一半,里面...
环境: linux 2.6
1, 多个进程同时写文件的话, 每一个进程open一个自己的文件句柄, 然后同事对一个文件进行读写, 每一个读写是原子的么? 会不会比如: 进程A写了一半,里面又有进程B写进去的内容? 需不需要加锁呢?
2, 单个进程的多线程共享一个文件句柄, 是否会发生比如A线程还没写完,B文件又写了一部分进去, 也就是说A线程无法输出一条完整的日志,B线程就写进去了, 需要给文件加锁么?
3, 打开文件如果为append方式,用fprintf,或者write,fwrite等方式, 会不会出现问题1,2的情况.
4, 用 read和write 读写文件过程中, linux是否有它自己的输出缓冲区, 也就是说不是立刻调用IO,而是缓冲区满了之后才输出出来. 但是我在后台跟踪日志的时候,还是能够看到及时消息的, 为什么? 它刷新文件的机制是什么呢?
5, 如果fprintf有自己的默认缓冲区, 那是多大
请各位达人指教, 能否有什么书可以描写这部分, 我对这一块一直有点迷糊, 多谢 展开
1, 多个进程同时写文件的话, 每一个进程open一个自己的文件句柄, 然后同事对一个文件进行读写, 每一个读写是原子的么? 会不会比如: 进程A写了一半,里面又有进程B写进去的内容? 需不需要加锁呢?
2, 单个进程的多线程共享一个文件句柄, 是否会发生比如A线程还没写完,B文件又写了一部分进去, 也就是说A线程无法输出一条完整的日志,B线程就写进去了, 需要给文件加锁么?
3, 打开文件如果为append方式,用fprintf,或者write,fwrite等方式, 会不会出现问题1,2的情况.
4, 用 read和write 读写文件过程中, linux是否有它自己的输出缓冲区, 也就是说不是立刻调用IO,而是缓冲区满了之后才输出出来. 但是我在后台跟踪日志的时候,还是能够看到及时消息的, 为什么? 它刷新文件的机制是什么呢?
5, 如果fprintf有自己的默认缓冲区, 那是多大
请各位达人指教, 能否有什么书可以描写这部分, 我对这一块一直有点迷糊, 多谢 展开
2个回答
展开全部
1. 文件write操作是原子的,多个进程同时写文件,原理上是没问题的。但是问题会出现在:如果多个进程写文件时是先lseek再write,就会出现覆盖。打开文件时使用append标志可以使先lseek再write这个操作变成原子操作,这样可以避免覆盖。
2. 多线程共享一个文件句柄的话,是不会有问题的。
3.
4.linux读写磁盘文件过程中,一般情况下并不是直接操作磁盘上的文件,而是读写内存中的磁盘高速缓存,内核选择合适的时机把脏页同步到磁盘。所以读写文件时不立刻调用io不是因为你说的缓冲区,read和write是没有缓冲区的。
5. fprintf和printf一样,是有缓冲区的,不过大小我不知道,也没必要知道吧。
2. 多线程共享一个文件句柄的话,是不会有问题的。
3.
4.linux读写磁盘文件过程中,一般情况下并不是直接操作磁盘上的文件,而是读写内存中的磁盘高速缓存,内核选择合适的时机把脏页同步到磁盘。所以读写文件时不立刻调用io不是因为你说的缓冲区,read和write是没有缓冲区的。
5. fprintf和printf一样,是有缓冲区的,不过大小我不知道,也没必要知道吧。
更多追问追答
追问
非常感谢,但还有个疑问,就是您说的 “”而是读写内存中的磁盘高速缓存,那我怎么在跟踪日志的时候能及时获得输出的消息呢?假如高速缓存还没满,我还能看到吗?
追答
我只是说一般情况下是操作磁盘高速缓存,磁盘高速缓存也可以被绕过的,如果打开文件时使用了O_DIRECT标志的话。你能及时看到日志输出,是因为,你想想,消息写进日志,也就是高速缓存,读日志时,也是从高速缓存读,根本就不会有错。而且系统选择了合适的时间进行高速缓存和磁盘同步,并不是因为高速缓存满了,高速缓存的数据结构蛮复杂的,不会满的。
如果深入学习内核的话,就会发现这些应用层的疑问其实没有什么。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询