これが processaとbで、どちらもマルチスレッドです。
a1 つの新しいプログラムをforkbし、bすぐに実行します。adupログファイルへの s およびfreopens 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を使用していると確信しています。