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:指定文件不被子进程继承。

问题:我是否正确理解我可以摆脱上面的那部分并用参数N中的附加值替换它(在 Windows 上) mode

4

1 回答 1

0

是的你可以。

fopen("myfile", "rbN")创建一个不可继承的文件句柄。

Linux 文档中的任何地方都没有提到该N标志fopen,因此该解决方案很可能是不可移植的,但对于 MS VC,它可以正常工作。

于 2013-04-23T20:39:12.057 回答