程序間通訊---標準流管道
阿新 • • 發佈:2019-01-22
與linux的檔案操作中有基於標準I/O操作一樣,管道操作也支援基於檔案流的操作,這種基於檔案流的管道主要用來建立一個連線到另一個程序的管道,這裡“另一個程序”是可以執行一定操作的可執行檔案,例如使用者執行“ls -l”或者./pipe,由於這類操作很常見,所以將一系列建立過程合併到一個函式popen()中完成,這個函式會完成以下步驟:
- 建立一個管道
- fork()一個子程序
- 在父子程序中關閉不需要的檔案描述符
- 執行exec()函式族呼叫
- 執行函式中指定的命令
這個函式可以大大減少程式碼的編寫量,但使用不太靈活,不能自己建立管道那麼靈活,並且popen()必須使用標準的I/o函式進行操作,也不能使用read(),wirte()這種不帶緩衝的I/O函式,必須使用pclose()來關閉管道流,該函式關閉標準I/O流,並等待命令執行結束
popen()函式語法如下:
pclose()函式語法如下:
這裡有個例子使用popen()來執行"ps -ef"命令,popen()函式可以使程式短小精悍
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #define BUFFSIZE 1024 int main() { FILE * fp ; char *cmd = "ps -ef" ; char buf[BUFFSIZE] ; //r:產生標準輸出,把cmd中的命令送到/bin/sh以-c引數由shell執行 if ((fp = popen(cmd, "r")) == NULL) { printf("popen error\n") ; exit(1) ; } while((fgets(buf, BUFFSIZE, fp)) != NULL)//從檔案結構指標fp中讀取資料,每次讀取BUFFSIZE-1個數據 { printf("%s", buf) ; } pclose(fp) ; exit(0) ; }
執行效果就是ps -ef的執行效果: