gpt4 book ai didi

c - 将标准输出重定向到套接字

转载 作者:太空宇宙 更新时间:2023-11-04 02:58:08 25 4
gpt4 key购买 nike

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

dup2(new_fd, STDOUT_FILENO);

这样做之后,所有写入 stdout 的 stdio 函数都会失败。我试图以这种方式重新打开标准输出:

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

谢谢。

最佳答案

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);

关于c - 将标准输出重定向到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com