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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - 将标准输入/输出重定向到单个双向文件描述符相关的知识,希望对你有一定的参考价值。

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

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


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

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

答案

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

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

如果你有其中一个,你可以通过使用dupdup2将它设置为fd的0,1来设置一个读取和写入它的进程(也就是说,使用那个fd作为stdin和stdout)和2。

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

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


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

以上是关于C - 将标准输入/输出重定向到单个双向文件描述符的主要内容,如果未能解决你的问题,请参考以下文章

07输入输出重定向

Linux用户

linux中的管道符重定向于环境变量

管道符重定向与环境变量

Linux文件描述符与重定向

Linux管道符重定向与环境变量