一 前言:
? ? ? ? 在做項目的過程中,一般來說我們的信息輸入是有固定的端口/來源的,但是在當前的越來越快的開發節奏下,往往會出現輸入源還未完全確定的情況下需要我們先實現功能邏輯,信號接受端后面再對接。或者數據接受端和功能的邏輯同步開發的情況下,為了方便快捷的將數據傳遞到可執行文件中去,我們可以使用命名管道實現將我們的基本測試數據寫入到程序中,進而能先展示我們的功能或者調試我們的程序,或者做一個簡單的demo去展示團隊的快捷開發能力進而拿下項目。
二 思路和代碼:
1.bash腳本:
? ? ? ? 使用命名管道實現傳遞數據本質還是在本地新建一個文件,然后讓二進制文件去不停地讀取這個文件即可。所以我們的思路就可以直接聚焦到文件的創建和文件的讀取。ok我們將數據的傳遞過程和文件的創建過程都放在bash腳本里面去執行。
? ? ? ? 首先我們要寫入的數據是信號+值的方式,所以需要我們再運行腳本的時候識別是否有兩個參數,其次我們不能每次寫入的時候都創建一次命名管道,雖然這樣也可以但是完全沒有必要。我們創建之前識別下文件是否存在即可。那么我們的bash腳本的內容如下;
#!/usr/bin/bash#檢查參數的數量
if [ "$#" -ne 2 ]; thenecho "need two paramater"exit 1
fi# 檢查命名管道是否存在,如果不存在則創建
if [ ! -p ./my_pipe ]; thenecho "Creating named pipe ./my_pipe"mkfifo ./my_pipe
fi#接受參數并且注入到命名通道中去
echo "$1 $2"
echo "$1 $2" > ./my_pipe
? ? ? ? 我們首先識別是否有兩個參數的輸入,如果沒有則直接報錯,然后我們再判斷my_pipe文件是否存在,不存在我們再進行創建,最后我們通過echo命令將數據寫入到文件中即可。
2.讀取的代碼
? ? ? ? 代碼部分就比較簡單了,我們直接使用fstream進行文件的讀取即可。
#include <iostream>
#include <fstream>
#include <unistd.h>
int main(){const std::string fife_name = "./my_pipe";while(1){std::fstream file(fife_name);if(!file.is_open()){std::cout<<"coun't find file\n";break;}std::string line;while(std::getline(file,line)){std::cout<<"get msg is "<<line<<"\n";}usleep(1000*1000);}
}
????????這里我們設置1s讀取一次,然后輸出來。這個地方要注意記得生成可執行文件,然后我們先運行腳本再執行可執行文件即可。