这里有两个多线程的进程 a
和 b
。
a
分叉(fork)b
,并且b
立刻执行一个新程序;a
使用dup
和freopen
把 stderr 重定向到日志文件中(a
实际上是 Apache 的 httpd2.22);b
继承了来自a
打开的 stderr。 (我正在修改 Apache httpd,b
是我的程序),因此b
使用fprintf(stderr....)
记录日志;- 所以,
a
和b
共享同一个日志文件; - 没有锁机制可以防止
a
和b
写入日志时互相干扰;
我发现一些日志信息交错,且有一些日志信息丢失。
这两个写入同一文件的进程是否会隐式地将彼此锁定?
更重要的问题是:如果我们只在一个单独的多线程进程内使用 fprintf
,那么 fprintf
就是线程安全的,即一个 fprintf
调用不会干扰另一个线程中的 fprintf
调用吗?许多文章都这么说,但我自己难以确保,所以在这里寻求帮助。
A:复制文件描述符的代码如下:
......
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, ".........");
为了方便起见,我用以下方式登录:
fprintf(stderr,".....\n")
我相信 Apache 和我使用同一个文件描述符进行文件写入。