2013-02-27 51 views
0

我正在尝试将stdout重定向到套接字。我做这样的事情:将stdout重定向到套接字

dup2(new_fd, STDOUT_FILENO); 

这样做毕竟stdio功能写入标准输出失败。我试图重新打开标准输出是这样的:

fclose(stdout); 
stdout = fdopen(STDOUT_FILENO, "wb"); 

printf等功能仍然不工作。

编辑:

我affraid,我误解了问题摆在首位。经过一些调试后,我发现这是一个真正的问题:

printf("Test"); // We get Broken pipe here 
// Reconnect new_fd 
dup2(new_fd, STDERR_FILENO); 
printf("Test"); // This also returns Broken pipe despite that stdout is fine now 

谢谢。

+0

'fdopen'只包装现有的文件描述符。当你调用'fclose'时,你关闭'stdout'并删除fd 1作为一个有效的文件描述符。 – Michael 2013-02-27 01:59:26

+0

即使没有'fclose',它也不起作用。在执行'dup2' printf失败后,我仍然可以将'write()'写入'STDOUT_FILENO'。 – 2013-02-27 02:06:20

+0

因为您在'STDOUT_FILENO'上复制了'new_fd',您需要关闭它并重新打开。你在做什么操作系统? – Michael 2013-02-27 02:09:06

回答

1

我已经清除标准输入输出的故障指示灯解决了这个问题:

clearerr(stdout); 

感谢你的帮助。

1

1:dup2(src, dst)

一些操作系统通过使用文件描述符跟踪打开的文件。 dup2内部将文件描述符从src复制到dst,如果它已经打开,则关闭dst

你的第一个陈述正在做什么是使每个写入STDOUT_FILENOnew_fd代表的对象。我说对象,因为它可能是一个套接字以及一个文件。

我没有看到你的第一行代码有什么问题,但我不知道如何定义new_fd

2:开张大吉stdout

当您关闭文件描述符,操作系统从表中删除。但是,当您打开文件描述符时,操作系统会将最小的可用文件描述符设置为返回的值。因此,要重新打开stdout,您只需重新打开设备即可。我相信设备会根据操作系统而变化。例如,在我的Mac上,设备是/dev/tty

因此,要重新打开标准输出,要做到以下几点:固定stdout

close(1); 
open("/dev/tty", O_WRONLY); 
+1

对不起,我没有关注。我不想重新打开标准输出。我想将stdout重定向到套接字。 – 2013-02-27 13:08:36

相关问题