Windows fopen和N标志

时间:2012-09-11 20:12:17

标签: windows fopen

我正在阅读一些使用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 docs on fopen并看到他们的fopen版本具有Microsoft特定的标志,似乎也是这样:N标志:

  

N:指定子进程不继承该文件。

问题:我是否正确理解我可以摆脱上面的那一块并在N参数中使用额外的mode替换它(在Windows上)?

1 个答案:

答案 0 :(得分:0)

是的,你可以。

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

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