23
내 C 프로그램 내에서 일시적으로 STDOUT을 "/ dev/null"(예를 들어)로 리디렉션하고 싶습니다. 그렇다면 "/ dev/null"에 기록한 후 STDOUT을 복원하고 싶습니다. 어떻게 관리하나요? 다음과 같이C 프로그램의 파일에 stdout을 임시 리디렉션 할 수 있습니까?
POSIX 시스템에서내 C 프로그램 내에서 일시적으로 STDOUT을 "/ dev/null"(예를 들어)로 리디렉션하고 싶습니다. 그렇다면 "/ dev/null"에 기록한 후 STDOUT을 복원하고 싶습니다. 어떻게 관리하나요? 다음과 같이C 프로그램의 파일에 stdout을 임시 리디렉션 할 수 있습니까?
POSIX 시스템에서, 당신은 그것을 할 수 있습니다 : 당신이 원하는 것은 더 일반성에 수 없습니다
int bak, new;
fflush(stdout);
bak = dup(1);
new = open("/dev/null", O_WRONLY);
dup2(new, 1);
close(new);
/* your code here ... */
fflush(stdout);
dup2(bak, 1);
close(bak);
.
freopen
을 사용하는 모든 솔루션은 원래 stdout
을 복원 할 수 없기 때문에 잘못되었습니다. stdout
에 할당 된 모든 솔루션은 stdout
이 lvalue가 아니기 때문에 잘못되었습니다 (이는 FILE *
유형의 표현식으로 확장되는 매크로입니다).
dup2를 사용하지 마십시오. close (new)를 사용하고 dup (1); dup()은 올바른 설명자를 얻을 수 있도록합니다. 'newfd가 열린 경우 close() 시간에보고 된 오류는 모두 사라집니다. 신중한 프로그래머는 newfd를 먼저 닫지 않고 dup2를 사용하지 않을 것입니다. ' –
@ MoraruLilian : 저는 매우 의도적으로'dup2'를 사용했습니다. 귀하의 의견은 내 코드 대 모든 인자가 섞여 있으므로, 귀하의 요점은 확실하지 않지만'dup2 '가없는 모든 솔루션은 ** 위험한 경쟁 조건 **을 가지고 있습니다. 'dup2 (x, y)'의 포인트는'y' ** 원자 적으로 **를'x'의 복사본으로 대체하는 것입니다. –