1

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

4

1 に答える 1

0

はい、できます。

fopen("myfile", "rbN")継承不可能なファイル ハンドルを作成します。

このNフラグは の Linux ドキュメントのどこにも記載されていないfopenため、このソリューションはおそらく移植可能ではありませんが、MS VC では問題なく動作します。

于 2013-04-23T20:39:12.057 に答える