![编写和执行程序以使其表现得像控制台](https://linux22.com/image/155036/%E7%BC%96%E5%86%99%E5%92%8C%E6%89%A7%E8%A1%8C%E7%A8%8B%E5%BA%8F%E4%BB%A5%E4%BD%BF%E5%85%B6%E8%A1%A8%E7%8E%B0%E5%BE%97%E5%83%8F%E6%8E%A7%E5%88%B6%E5%8F%B0.png)
我编写了一组程序,旨在使用无线电发射器-接收器 (NRF24L01) 连接两个设备,就像它们通过串行接口连接一样。
目前,我能够向一个方向发送 bash 命令,比如说从设备 A 到 B。我的 A 设备当前是 AVR 微控制器。
我的 B 设备是 Rapberry Pi。我使用以下命令将收到的文本通过管道传输到 bash。这允许发送命令,但不允许将其输出发送回 A 设备。
./program | bash
我不知道如何以不会阻塞和阻止程序对接收到的数据做出反应的方式将 bash 的输出传输回我的程序。如果可以在两个方向设置管道,我仍然不认为我可以使用像fgets
它们阻塞的函数。
两个设备共享相同的发送和接收功能库,可以通过选项调用这些发送和接收函数以使其成为非阻塞。
答案1
最简单的方法可能是让您的程序使用pipe2
三次以创建三个管道(分别用于 stdin、stdout 和 stderr)。也许您希望它们处于非阻塞模式。然后 fork,并让孩子使用dup2
将管道放入文件描述符 0、1 和 2。然后子进程使用其中之一执行家族跑步bash
。
然后家长可以使用select
确定何时有数据要读取或有空间要写入。
您可能可以利用一些库或现有的实现。
注意#1:pipe2
返回两个文件描述符,一个用于管道的读取端,一个用于管道的写入端。例如,对于 bash 的标准输入,bash 需要读取端(读取输入),而您的程序需要写入端(写入 bash 的输入)。 bash 的标准输出则相反:bash 需要写入端,您的程序需要读取端。
注意#2:这并不能为您提供完整的终端体验;为此,您需要处理 ptys,这增加了很多复杂性(老实说,我必须查找它)。如果你想要这样,我绝对建议你寻找一个类似的程序来开始。