【发布时间】:2012-07-24 18:03:41
【问题描述】:
这里是进程a和b,它们都是多线程的。
-
aforksb和b立即执行一个新程序; -
adups 和freopens stderr 到日志文件(a是事实上的 apache 的 httpd2.22) -
b从a继承打开的标准错误。 (我正在适配 apache httpd,b是我的程序),b使用fprintf(stderr....)进行日志记录 - 所以
a、b共享同一个文件进行日志记录 -
a、b没有写日志的锁机制
我发现有些log msg是交错的,还有一点log msg丢失了。
同一文件的两个写入者可以隐式地相互锁定吗?
更重要的问题是:如果我们只在一个多线程进程中使用fprintf,fprintf 是线程安全的,即fprintf 的一个调用不会干预另一个线程中的另一个fprintf 调用?很多文章都这么说,但是我自己也不容易保证,所以在这里求助。
A:复制fd的代码是这样的:
......
rv = apr_file_dup2(stderr_log, s_main->error_log, stderr_p);//dup the stderr to the logfile
apr_file_close(s_main->error_log);//here ,2 fd point to the same file description,so close one of
然后
B:apache 它自己使用这种方式进行日志记录:
......
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s_main, ".........");
C:为了方便,我是这样登录的:
fprintf(stderr,".....\n")
我很确定 apache 和我使用相同的 fd 进行文件写入。
【问题讨论】:
-
最好贴出实际代码,而不是代码描述。
-
这是一个很长的程序,我的 fprintf 分散在各处。我会在 apache2 中找到将 stderr 复制到 error.log 的代码,然后将它们发布在这里
-
请原谅,我的积分是不是因为这个原因被扣分了?