2011-01-28 19 views

Odpowiedz

47

W systemach POSIX, można to zrobić w następujący sposób:

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); 

Co chcesz nie jest możliwe w dalszym ogólności.

Każde rozwiązanie korzystające z freopen jest niepoprawne, ponieważ nie pozwala przywrócić oryginalnego stdout. Każde rozwiązanie przypisane do stdout jest nieprawidłowe, ponieważ stdout nie jest lwartością (jest to makro, które rozwija się do wyrażenia typu FILE *).

+0

Nie używaj dup2. Użyj close (new), a następnie dup (1); dup() zapewnia, że ​​otrzymasz poprawny deskryptor. 'Jeśli newfd był otwarty, wszystkie błędy, które zostałyby zgłoszone podczas zamykania() , zostaną utracone. Uważny programista nie użyje dup2 bez uprzedniego zamknięcia newfd. ' –

+9

@MoraruLilian: Użyłem' dup2' bardzo celowo. Twój komentarz ma wszystkie argumenty pomieszane w stosunku do mojego kodu, więc nie mogę być pewien, o co ci chodzi, ale każde rozwiązanie bez 'dup2' ma ** niebezpieczne warunki wyścigowe **. Punkt 'dup2 (x, y)' ma zastąpić 'y' ** atomicznie ** kopią' x'. –

Powiązane problemy