原帖由 思一克 于 2006-8-4 08:32 发表
不会。
read, write 可以认为是原子的。中间不会被打断。写LOG是APPEND,无数进程不会乱。
当如果你自己写LOG,必须一个记录一个write调用写入。如果2次以上write调用一个记录就会交错。
原帖由 isnowran 于 2006-8-4 09:32 发表
老大,如果日志是在nfs或是磁带上,还能认为是原子的吗?一个程序,总不能挑文件系统吧?
原帖由 isnowran 于 2006-8-4 09:59 发表
?我记忆中原子操作只有sync,open,fcntl,dup以及锁等等为数不多的函数,从来没有印象书中说过write、read也是原子操作,我先去查查。。。
原帖由 isnowran 于 2006-8-4 10:29 发表
谢谢二位指点,纠正了我一个误区死角,至少今天就不算白活了;)
再提个疑问,如果通过网络write或read 1M 的数据,假设网络状况很糟糕,要持续30分钟,那么系统会怎么样?一直等下去吗?
或者说此时这个进 ...
原帖由 原来如此 于 2006-8-7 09:22 发表
我赞成前面说的消息队列+单独进程轮询写入来进行日志记录,这样可以避开write是否是原子操作的问题
原帖由 henngy 于 2006-8-8 09:59 发表
每个进程配一个日志文件不好嘛?干吗非要多个进程公用一个日志文件?
原帖由 sunlan 于 2006-8-8 11:13 发表
我的做法是加文件锁。具体代码如下:
[code]
#include <stdarg.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
#include <dirent ...
原帖由 思一克 于 2006-8-8 11:37 发表
lockf根本没有必要。
如果多个进程在LOG,lockf还可能影响性能。
原帖由 linuxiang 于 2006-8-9 10:44 发表
多谢思一克的耐心教导,终于明白了加write调用的实质。原来还有内核来保证write即使被中断也是原子的
原帖由 思一克 于 2006-8-8 12:26 发表
冲突与否取决于进程同时进行的多少。
你为了写LOG这一个附带的工作让一个进程BLOCK在那里是不对的,要么用LOG-SERVER,syslog.
在LINUX,UNIX,等 LOCKF是不必要的。因为不可能交叉。你看前面的帖子。
原帖由 思一克 于 2006-8-8 12:26 发表
冲突与否取决于进程同时进行的多少。
你为了写LOG这一个附带的工作让一个进程BLOCK在那里是不对的,要么用LOG-SERVER,syslog.
在LINUX,UNIX,等 LOCKF是不必要的。因为不可能交叉。你看前面的帖子。
原帖由 linuxiang 于 2006-8-3 23:43 发表
一个程序有多个进程,父子进程都以O_APPEND方式打开同一个日志文件,用系统调用write向文件写入一条日志,像这种没有进程间相互协调,会不会出现日志信息混乱的情况(一个进程的日志写入一半后出现另一进程的日志 ...
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |