【问题标题】:Redirection of stdin and stdout in a C Program在 C 程序中重定向标准输入和标准输出
【发布时间】:2015-07-25 22:11:00
【问题描述】:

我在我的 Windows 控制台应用程序中使用典型的 putsprintfgetchar 函数。现在我想将标准输出和标准输入重定向到 COM 端口。

单独重定向标准输出工作正常:

freopen ("COM1", "w", stdout);

之后,所有输出都按预期发送到 COM1。

但是对于输入,我面临两个问题:

freopen ("COM1", "r", stdin);

1) 只有标准输入重定向,COM1 打开正常。但是getchar(或类似函数)不会从 COM1 返回字符。 getchar 永远不会回来。我尝试了几种模式(r、r+、rb,甚至 w)。

2) 如果标准输出已经重定向到 COM1,则对标准输入的 freopen 调用失败(返回 NULL)。可能是因为 COM1 已用于标准输出。

环境:控制台应用程序、Windows 7、MinGW

我做错了吗?是否有另一种(或更好的)方法来完成重定向?

感谢您的帮助!

【问题讨论】:

  • 1) 我发现这是一个旧的 Windows 问题。端口设置不正确。必须设置超时。命令行上的“模式”把事情搞砸了。现在我直接在我的程序中调用 SetCommState() 和 SetCommTimeouts()。因此 freopen ("COM1", "r", stdin) 现在可以单独工作,但组合 - 重定向 stdout 和 stdin 仍然不起作用。

标签: c windows redirect serial-port stdin


【解决方案1】:

我现在无法测试它,因为我只有一个 RDP 可以访问的虚拟 Windows 机器,没有串行连接,但是,这样的东西不应该工作吗?

int comfd = open("COM1", O_RDWR);
dup2(comfd, 0);
dup2(comfd, 1);

或者,如果你不喜欢硬编码的 fds

int comfd = open("COM1", O_RDWR);
dup2(comfd, fileno(stdin));
dup2(comfd, fileno(stdout));

【讨论】:

  • 谢谢菲利克斯。我试了一下。到目前为止没有工作。但我将不得不进一步研究。
  • 啊 - 它正在工作。非常感谢!要恢复原始标准输入/输出 fd,请参见此处:C restore stdout to terminal
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多