
我編寫了一組程序,旨在使用無線電發射器-接收器 (NRF24L01) 連接兩個設備,就像它們透過串行介面連接一樣。
目前,我能夠向一個方向發送 bash 命令,比如說從設備 A 到 B。
我的 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,這增加了很多複雜性(老實說,我必須查找它)。如果你想要這樣,我絕對建議你尋找一個類似的程式來開始。