1
我正在閱讀一些使用fopen
來打開文件進行書寫的代碼。代碼需要能夠關閉和重新命名這些文件(這是一個旋轉文件記錄器)。作者說,要發生這種情況,子進程不得繼承這些句柄。 (在Windows上,也就是,在Unix沒關係。)因此,筆者寫道,複製該句柄非遺傳和關閉原裝手柄一個特殊的子程序:Windows fopen和N標誌
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
版本都有,似乎做同樣的一個微軟的具體標誌:在N
標誌:
N:指定文件不是由子進程繼承。
問:我理解正確的話,我可以額外N
在mode
參數擺脫件以上,並取代它(在Windows上)?
感謝您的確認;是的,我確保只在Windows上使用這個額外的標誌。 –
任何人都可以評論Windows'N'是否大致等同於glibc的'e'(它對應於POSIX'O_CLOEXEC')?他們是否解決了基本相同的問題? – Quuxplusone