2011-01-28 5 views

답변

47

, 당신은 그것을 할 수 있습니다 : 당신이 원하는 것은 더 일반성에 수 없습니다

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 * 유형의 표현식으로 확장되는 매크로입니다).

+0

dup2를 사용하지 마십시오. close (new)를 사용하고 dup (1); dup()은 올바른 설명자를 얻을 수 있도록합니다. 'newfd가 열린 경우 close() 시간에보고 된 오류는 모두 사라집니다. 신중한 프로그래머는 newfd를 먼저 닫지 않고 dup2를 사용하지 않을 것입니다. ' –

+9

@ MoraruLilian : 저는 매우 의도적으로'dup2'를 사용했습니다. 귀하의 의견은 내 코드 대 모든 인자가 섞여 있으므로, 귀하의 요점은 확실하지 않지만'dup2 '가없는 모든 솔루션은 ** 위험한 경쟁 조건 **을 가지고 있습니다. 'dup2 (x, y)'의 포인트는'y' ** 원자 적으로 **를'x'의 복사본으로 대체하는 것입니다. –

관련 문제