W moim programie C chciałbym tymczasowo przekierować STDOUT na "/ dev/null" (na przykład). Następnie po napisaniu do "/ dev/null" Chciałbym przywrócić STDOUT. Jak sobie z tym poradzić?W jaki sposób mogę tymczasowo przekierować standardowe wyjście do pliku w programie C?
23
A
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 *
).
Powiązane problemy
- 1. W jaki sposób mogę skompresować standardowe pliki do standardowego formatu, a także wypisać standardowe wyjście?
- 2. Jak mogę przekierować wyjście funkcji kości do pliku w Perlu?
- 3. Przekieruj standardowe wyjście z SBT do pliku
- 4. Jak przekierować standardowe wyjście do pliku podczas korzystania z podprocesu.call w pythonie?
- 5. Jak mogę przekierować wyjście nosetests do pliku tekstowego?
- 6. Jak przekierować wyjście standardowe do nowej karty Vima?
- 7. Jak mogę przekierować wyjście portu COM Windows do pliku?
- 8. Jak przekierować wyjście kompilatora gcc do pliku?
- 9. Dlaczego podprocesować standardowe wyjście do pliku jest zapisane w kolejności?
- 10. Czy mogę przekierować standardowe wyjście w pythonie na jakiś bufor łańcuchowy?
- 11. Jak przekierować wyjście konsoli do pliku tekstowego
- 12. W python, czy mogę przekierować wyjście funkcji drukowania na stderr?
- 13. W golangu w jaki sposób mogę zapisać stdout pliku exec.Cmd do pliku?
- 14. C++ FILE wskaźnik na standardowe wyjście?
- 15. Python: Jak mogę przekierować to wyjście?
- 16. W C, w jaki sposób mogę przekierować STDOUT_FILENO do/dev/null przy użyciu dup2, a następnie przekierować ponownie do pierwotnej wartości później?
- 17. Jak przekierować standardowe wejście do pliku w wierszu poleceń systemu Windows?
- 18. Czy istnieje sposób przekierowania wiadomości syslog na standardowe wyjście?
- 19. Jak drukować zarówno na standardowe wyjście i złożyć w C
- 20. Jak mogę uchwycić wyjście standardowe procesu potomnego?
- 21. Jak przekierować standardowe wejście i wyjście z Basha
- 22. Standardowe wyjście przekierowane do pliku pokazuje różni się od faktycznej
- 23. Dlaczego kolejność wyjścia programu C różni się, gdy jego standardowe wyjście jest przekierowywane do pliku?
- 24. Scala interactive interpreter (REPL) - jak przekierować wyjście do pliku tekstowego?
- 25. Przechwyć standardowe wyjście z CreateProcessAsUser w języku C#
- 26. Jak przekierować Boost.Log do pliku
- 27. Dlaczego printf() nie wypisuje do pliku, gdy standardowe wyjście jest przekierowane do tego pliku?
- 28. Python 2.x - Napisz wyjście binarne na standardowe wyjście?
- 29. Jak zrobić wyjście GCC na standardowe wyjście?
- 30. Jak przechwycić standardowe wyjście błędów z usługi Windows?
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. ' –
@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'. –