これが processa
とb
で、どちらもマルチスレッドです。
a
1 つの新しいプログラムをforkb
し、b
すぐに実行します。a
dup
ログファイルへの s およびfreopen
s stderr (a
デファクト Apache の httpd2.22 です)b
から開かれた stderr を継承しa
ます。(私はapache httpdを適応させています、これb
は私のプログラムです)、そしてロギングにb
使用しますfprintf(stderr....)
- そのため
a
、b
ロギング用に同じファイルを共有します a
には、b
ログを書き込むためのロック メカニズムはありません
一部のログ メッセージがインターリーブしていて、ログ メッセージの一部が失われていることがわかりました。
同じファイルへの 2 つのライターが暗黙的にお互いをロックアウトできますか?
より重要な問題はfprintf
、1 つのマルチスレッド プロセス内でのみ使用する場合、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を使用していると確信しています。