2012-03-28 4 views
2

파일을 사용하여 stdout 및 stderr의 출력을 리디렉션하려고합니다. 나는 freopen을 사용하고 있으며 올바른 디렉토리에 파일을 생성하지만 파일은 비어 있습니다. stdout과 stderr를 리다이렉트하는 코드를 주석 처리하면 출력이 콘솔에 표시됩니다. I 메인으로하고 있지만 못해 파일을 작성하여 출력한다 억제제없이에서 printf ("I가 사용") 배치 한freopen이 지정된 파일에 쓰지 않습니다.

freopen(stderrStr.c_str(), "a+", stderr); //where stderrStr and stdoutStr are the path/file name 
freopen(stdoutStr.c_str(), "a+", stdout); 

fclose(stdout); 
fclose(stderr); 

: 여기

코드이다.

+0

stdout 또는 stderr를 닫지 마십시오. 프로그램 종료시 자동으로 닫힙니다. –

+0

@dark_charlie http://www.cplusplus.com/reference/clibrary/cstdio/freopen/ 에서 예제를 얻었습니다. 그리고 나는 그 긴밀한 선언문을 주석 처리했습니다. – user1185853

답변

3

내가하려고하는 것을 수행하기 위해 나는 dup2 (2)을 사용합니다.

간단히 개방 (2) 두 파일의 FD1과 FD2 다음 표준 에러에 대한 표준 출력에 대한 dup2(fd1, 1)dup2(fd2, 2)를 사용합니다.

운영 체제 3 개 파일 기술자의 주요의 진입하기 전에 설정 (libc의, 로더 나 커널, 확실하지) :

0 : stdin pipe 
1 : stdout pipe 
2 : stderr pipe 

와 dup2가의 문서에서 :

dup2에 (INT newfd를, INT newfd는) 이렇게 두 dup2에 호출이 열려있는 파일과 1과 2를 대체

필요

경우 먼저 newfd를 닫고, newfd를 사본이 될 newfd 있습니다. 따라서 프로세스가 write (2) (printf 및 cout 호출과 같은 syscall 모든 출력 루틴)을 fd 1 또는 fd 2로 호출하면 데이터는 OS

의 파이프 설정 대신 파일에 기록됩니다

맨 페이지 참고 :

매뉴얼 페이지가 장으로 나옵니다. 표기 foo는 (N)이 푸를 열려면 장 N.에 이름이 "foo는"의 매뉴얼 페이지를 의미합니다 (N) 유형 : 예 쓰기를 열 수 있도록

$ man N foo 

(2) 입력 :

$ man 2 write 
관련 문제