2012-09-11 46 views
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:指定文件不是由子進程繼承。

問:我理解正確的話,我可以額外Nmode參數擺脫件以上,並取代它(在Windows上)?

回答

0

是的,你可以。

fopen("myfile", "rbN")創建非可繼承的文件句柄。

N標誌在Linux文檔中對於fopen的任何地方都沒有提及,所以該解決方案很可能不是便攜式的,但對於MS VC而言,它工作正常。

+0

感謝您的確認;是的,我確保只在Windows上使用這個額外的標誌。 –

+0

任何人都可以評論Windows'N'是否大致等同於glibc的'e'(它對應於POSIX'O_CLOEXEC')?他們是否解決了基本相同的問題? – Quuxplusone