我正在阅读一些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
?