在做遠端通訊程式的時候經常有這樣一類用例:
client端傳送乙個請求,需要從server獲取相關資訊,比如client端需要知道server根目錄下目錄結構等等,這樣怎麼做呢?
也許這是你會想到我們有ls, ping命令,對了,linux中這些實用的命令,還有shell指令碼提供了強大的功能,如果我們能在server端執行這些指令碼並且得到他們的輸出就太好了!是的,執行乙個命令太簡單了,exec函式族就可以解決問題,但是關鍵問題是如何獲得命令的輸出呢?
好,說到輸出,這些命令的輸出都是寫在程序標準輸出上檔案描述符上。那就好辦了,我們讓命令輸出到自定義的檔案描述符上,然後去讀取這個檔案描述符!而這裡涉及到父子程序的通訊,我們利用管道就可以實現了。現在整理一下順序:
1,父程序建立乙個pipe
2,fork子程序
3,父程序讀取pipe,等待子程序寫入資料
4,子程序中重定向stdout為pipe的寫端
5,子程序執行命令
6,子程序執行完畢,推出
7,父程序讀取pipe完畢,退出
到這一步我們就獲得了乙個功能強大的命令執行器,它可以執行任何程式以及shell指令碼,然後對返回的字串分析重構得到我們想要的格式,大功告成!這樣解決「在client端時刻監控到server端的網路連線狀態「的問題就易如反掌了,只需要執行ping -t然後分析返回的字串,就可以了!就這麼簡單。
但是,有更好的解決方案嗎? 當然有!請看popen函式
#include
file* popen(const char* cmdstring, const char type);
popen內部先執行fork,然後呼叫exec執行cmdstring,並且返回乙個標準i/o檔案指標,如果type是"r",則返回cmdstring的標準輸出,如果type是「w」,則返回cmdstring的標準輸入。這不正是我們上面做的工作嗎? demo**如下:
#include
int main( void )
原來一切如此簡單! 更難得的是popen是c標準函式庫提供的,也就是說也適用於windows平台,輕鬆做到平台無關!
後記這是我在兩年前的乙個專案中遇到的問題,server端需要執行各種各樣複雜的命令,由於是在windows系統中,當時的方案是利用重定向管道和createprocess包裝了乙個command executer,工作非常穩定!但是在平台移植的時候遇到問題,最終找了popen!
跨平台執行 Rafy 首次部署記錄
一直想在 linux 上使用 mono 試試執行 rafy,最近因為業務需要,總算是真正地試驗了一次。下面是本次部署記錄的一些要點。linux 相對於 windows 來說,linux 更輕量,安裝很簡單,安裝速度也非常快。這兩個是目前可行的 net 跨平台方案。我們需要快速理解兩個方案,分析哪個方...
跨平台執行 Rafy 首次部署記錄
一直想在 linux 上使用 mono 試試執行 rafy,最近因為業務需要,總算是真正地試驗了一次。下面是本次部署記錄的一些要點。linux 相對於 windows 來說,linux 更輕量,安裝很簡單,安裝速度也非常快。這兩個是目前可行的 net 跨平台方案。我們需要快速理解兩個方案,分析哪個方...
linux 關閉popen 開啟的命令
程式設計了乙個圖形介面用於開了乙個執行緒執行終端命令,通過pope開啟乙個管道來執行命令,此時需要迴圈讀取程式執行的結果。void command exec void cmdstr while fgets buff,200,cmdstream null pclose cmdstream pthrea...