2012-09-11 4 views
1

fopen을 사용하여 쓰기 위해 파일을 여는 코드를 읽습니다. 코드는 때때로이 파일을 닫고 이름을 바꿀 수 있어야합니다 (회전하는 파일 로거입니다). 작성자는이 작업을 수행하기 위해 자식 프로세스가 이러한 FILE 핸들을 상속하지 않아야한다고 말합니다. (. Windows에서, 즉, 유닉스에 괜찮아요) 그래서 저자는 비 상속으로 핸들을 복제하고 원래 핸들을 닫 특별한 서브 루틴 기록 : 이제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 : 파일이 자식 프로세스에 의해 상속되지 않도록 지정합니다.

질문 : 내가 mode 매개 변수에 추가 N로 (Windows에서) 위의 그 조각을 제거하고 교체받을 수 있음을 올바르게 이해합니까?

답변

0

예, 가능합니다.

fopen("myfile", "rbN")은 상속 할 수없는 파일 핸들을 만듭니다.

fopen의 경우 Linux 설명서에서는 N 플래그가 언급되어 있지 않으므로 솔루션은 대부분 휴대용이 아니지만 MS VC의 경우 제대로 작동합니다.

+0

감사합니다. 네, Windows에서만이 여분의 플래그를 사용해야합니다. –

+0

Windows'N '이 glibc의'e' (POSIX'O_CLOEXEC'에 해당)와 대략 같은지에 대해 아무도 의견을 말할 수 있습니까? 그들은 기본적으로 동일한 문제를 해결합니까? – Quuxplusone