2013-02-20 7 views
0

У меня есть программа. В этой программе у меня есть сеанс http с оборудованием. и в программе у меня много printf. когда я закрываю stdout с fclose(stdout). Заметьте, что сообщения, напечатанные printf, отправляются на сеанс http (сообщения, входящие в http-пакеты).странное поведение при закрытии stdout

Я задаюсь вопросом об этом странном поведении, и мне интересно, как избежать такого поведения? Я имею в виду, как избежать перенаправления печатных сообщений на сеанс http?

ответ

2

Что происходит, так это то, что вы закрываете дескриптор файла, используемый stdout, а следующий созданный дескриптор файла (в этом случае сокет) заканчивается файловым дескриптором, традиционно используемым им (FD 1).

Не закрывайте стандартный вывод. Если вам нужно, чтобы сделать его уйти, заменить его файловый дескриптор указывает на /dev/null, например:

freopen("/dev/null", "w", stdout); 
+0

«freopen» не требуется повторное использование одного и того же номера fd, поэтому это может привести к серьезным проблемам, если какой-либо код записывает stdour по fd, а не по stdio. –

+0

В документации указано, что «Основное использование функции freopen() заключается в изменении файла, связанного со стандартным текстовым потоком (stderr, stdin или stdout)». Поэтому я был бы очень удивлен, если бы он не оставил тот же FD. (На практике это определенно делает.) – duskwuff

+0

stdout может быть закрыт случайно. Например, закрыть сеанс ssh, который я использую для запуска приложения. Сессия ssh может быть закрыта случайно, если другой пользователь изменил IP-адрес. что я должен делать в этом случае? – MOHAMED

3

Вызов printf после fclose(stdout) вызывает неопределенное поведение. Не делай этого. Если вам просто нужно заблокировать stdout, откройте/dev/null и dup2 на fd # 1.

+0

stdout может быть закрыт случайно. Например, закрыть сеанс ssh, который я использую для запуска приложения. Сессия ssh может быть закрыта случайно, если другой пользователь изменил IP-адрес. что я должен делать в этом случае? – MOHAMED

+0

Нет, этого не может быть. Отключенные и закрытые совершенно разные. –

Смежные вопросы