C - 将标准输入/输出重定向到单个双向文件描述符

时间:2018-02-28 18:25:50

标签: c stdout stdin io-redirection bidirectional

在某些情况下,例如在处理串行设备文件时,我可以打开双向文件描述符。但是,STDIN / STDOUT是两个单独的单向文件。 是否可以从STDIN / STDOUT创建双向文件描述符?我要求接口对称:在编写需要readwrite的用户函数时,它是在处理标准管道时,只需要为两个方向指定文件描述符是不方便的。

有很多关于重定向STDIN / STDOUT的讨论(例如使用dup2),但这个讨论主要涉及到子进程的管道输入。我没有找到任何将两个文件描述符合并为一个的信息。

编辑:这是问题的原始背景。 我不关心解决这个特殊问题;有很多变通方法。我想知道将两个单向FD组合成单个双向FD。

我正在开发一个C实用程序来控制Linux上UART上的一些花哨的电子设备,我想通过使用文件中的预制事务来测试我的代码的输入/输出。也就是说,我的模拟设备响应将来自我之前创建的文本文件,并通过STDIN输入,而发送的命令将转到STDOUT并保存到文件中。这将允许在连接真实电子设备之前进行交易验证,如果处理不当可能会发生故障。

1 个答案:

答案 0 :(得分:2)

[我不确定这会回答你的问题,我只是把它作为评论,但它太长了。]

肯定有许多"双向" Unix和Linux中的文件描述符 - 串口和TCP流立即浮出水面。

如果你有其中一个,你可以使用dup或{{1}设置一个对它进行读写的进程(即使用那个fd作为stdin和stdout)的进程将其设置为fd' 0,1, 2。

最后,如果你是一个进程并且你相信你已经被给予双向fd为0,1和2,那么你可以抓住0,1或2来读取和写入它(即写入0或从1读取)。

但如果fd的0和1不是彼此的克隆,我不知道如何结合"将它们分成一个允许读写的单一fd。

附录:如果你使用标准的Unix管道,你提到了携带两个文件描述符的麻烦。我认为"双向"标准管道的替代方案是Unix域套接字(显然现在称为dup2)。