fopen
書き込み用にファイルを開くために使用するコードを読んでいます。コードは、これらのファイルを時々閉じて名前を変更できる必要があります (ローテーション ファイル ロガーです)。著者は、これが起こるためには、子プロセスがこれらのFILE
ハンドルを継承してはならないと言います。(Windows では、つまり、Unix では問題ありません。) そこで、作成者は、ハンドルを継承不可として複製し、元のハンドルを閉じる特別なサブルーチンを作成します。
if (!(log->file = fopen(log->path, mode)))
return ERROR;
#ifdef _WIN32
sf = _fileno(log->file);
sh = (HANDLE)_get_osfhandle(sf);
if (!DuplicateHandle(GetCurrentProcess(), sh, GetCurrentProcess(),
&th, 0, FALSE, DUPLICATE_SAME_ACCESS)) {
fclose(log->file);
return ERROR;
}
fclose(log->file);
flags = (*mode == 'a') ? _O_APPEND : 0;
tf = _open_osfhandle((intptr_t)th, _O_TEXT | flags);
if (!(log->file = _fdopen(tf, "at"))) {
_close(tf);
return ERROR;
}
#endif
今、私はMSDNのドキュメントfopen
も読んでおり、彼らのバージョンの にfopen
は、同じことをしているように見えるMicrosoft固有のフラグがあることがわかります:N
フラグ:
N: 子プロセスにファイルを引き継がないことを指定します。
質問: 上記の部分を削除して、(Windows の場合)パラメータの追加要素に置き換えることができるということを正しく理解してN
いますか?mode