2013-02-20 58 views
0

我有一个程序。在这个程序中,我有一个http会话与其他设备。在程序中我有很多printf。当我通过fclose(stdout)关闭stdout时,我注意到由printf打印的消息被发送到http会话(包含在http数据包中的消息)。关闭标准输出时的奇怪行为

我想知道这个奇怪的行为,我想知道如何避免这种行为?我的意思是如何避免将打印的消息重定向到http会话?

回答

2

发生了什么事情是,您正在关闭stdout使用的文件描述符,并且下一个创建的文件描述符(在本例中为套接字)结束于传统使用的文件描述符(FD 1)。

不要关闭标准输出。如果你需要把它赶走,与文件描述符替换它指出/dev/null,e.g:

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

'freopen'不需要重复使用相同的fd号码,因此如果某些代码通过fd而不是stdio写入stdour,则可能会导致严重问题。 – 2013-02-20 20:40:27

+0

该文档指出:“freopen()函数的主要用途是更改与标准文本流(stderr,stdin或stdout)关联的文件。”所以如果它不保留相同的FD,我会很惊讶。 (实际上,它确实如此。) – duskwuff 2013-02-20 21:03:35

+0

标准输出可能因事故而关闭。例如关闭用于启动我的应用程序的ssh会话。如果另一个用户更改了IP地址,ssh会话可能会被accidentelly关闭。在这种情况下我必须做什么? – MOHAMED 2013-02-21 07:31:47

3

调用printffclose(stdout)后调用未定义的行为。不要这样做。如果您只需要禁止stdout,请将/ dev/null和dup2打开到fd#1。

+0

标准输出可能因事故而关闭。例如关闭用于启动我的应用程序的ssh会话。如果另一个用户更改了IP地址,ssh会话可能会被accidentelly关闭。在这种情况下我必须做什么? – MOHAMED 2013-02-21 07:31:28

+0

不,不可以。断开和关闭完全不同。 – 2013-02-21 13:17:07