将stdout重定向到套接字

时间:2013-02-27 01:33:54

标签: c sockets stdout stdio dup2

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

dup2(new_fd, STDOUT_FILENO);

执行此操作后,写入stdout的所有stdio函数都会失败。我试图以这种方式重新打开stdout:

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

但是printf和其他功能仍然不起作用。

编辑:

我害怕我在第一时间误解了这个问题。经过一些调试后,我发现这是一个真正的问题:

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

感谢。

2 个答案:

答案 0 :(得分:1)

1:dup2(src, dst)

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

您的第一个声明正在做的是每次写入STDOUT_FILENO都要转到new_fd所代表的对象。我说对象,因为它可以是一个套接字以及一个文件。

我的第一行代码没有任何问题,但我不知道如何定义new_fd

2:重新开启stdout

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

因此,要重新打开标准输出,您需要执行以下操作:

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

答案 1 :(得分:1)

我通过在修复stdout后清除stdio的错误指示符来解决问题:

clearerr(stdout);

感谢您的帮助。