1. 程式人生 > >程序間通訊---標準流管道

程序間通訊---標準流管道

與linux的檔案操作中有基於標準I/O操作一樣,管道操作也支援基於檔案流的操作,這種基於檔案流的管道主要用來建立一個連線到另一個程序的管道,這裡“另一個程序”是可以執行一定操作的可執行檔案,例如使用者執行“ls -l”或者./pipe,由於這類操作很常見,所以將一系列建立過程合併到一個函式popen()中完成,這個函式會完成以下步驟:

  1. 建立一個管道
  2. fork()一個子程序
  3. 在父子程序中關閉不需要的檔案描述符
  4. 執行exec()函式族呼叫
  5. 執行函式中指定的命令

這個函式可以大大減少程式碼的編寫量,但使用不太靈活,不能自己建立管道那麼靈活,並且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的執行效果: