我正在尝试将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
感谢。
答案 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);
感谢您的帮助。