如果要使用匿名管道,那麼我們必須呼叫pipe函式來進行建立,其原型如下:
#include int pipe(int file_descriptor[2]);
我們可以看到pipe函式的定義非常特別。當返回值為0時,則在陣列中儲存兩個新的檔案描述符;如果返回-1,那麼便是呼叫失敗。
陣列中的兩個檔案描述符以一種特殊的方式連線起來,資料基於先進先出的原則,寫到file_descriptor[1]的所有資料都可以從file_descriptor[0]讀回來。由於資料基於先進先出的原則,所以讀取的資料和寫入的資料是一致的。
這裡需要特別注意的是,不要用file_descriptor[0]寫資料,也不要用file_descriptor[1]讀資料!因為其行為未定義的,但在有些系統上可能會返回-1表示呼叫失敗。資料只能從file_descriptor[0]中讀取,資料也只能寫入到file_descriptor[1],不能倒過來。
那麼接下來,我們看一下例子。我們首先在原先的程序中建立乙個管道,然後再呼叫fork建立乙個新的程序,最後通過管道在兩個程序之間傳遞資料,源**如下:
#include #include #include #include #define max_buffer 25
int main ()
/***fork()相當於父程序轉殖了乙個自己。
*子程序不會重新執行fork之前的**,它只會執行fork之後的
*/fpid=fork();
if (fpid < 0)
else if (fpid == 0) //返回值等於零處於子程序
else //返回值大於零處於父程序
;int iread = read(fd[0],bufread,max_buffer);
printf("[parent process]read the data is \"%s\",the size of read is %d!\n",bufread,iread);
//release resource
close(fd[0]);
close(fd[1]);
printf("[parent process]finish!\n");
} exit(exit_success);
return 0;
}
fork建立子程序利用pipe管道通訊
這裡。每個程序各自有不同的使用者位址空間,任 何乙個程序的全域性變數在另乙個程序中都看不到,所以程序之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,程序1把資料從使用者空間拷到核心緩衝區,程序2再從核心緩衝區把資料讀走,核心提供的這種機制稱為程序間通訊 ipc,interprocess comm...
語言 管道 建立匿名管道
本質 特點 實現方式 侷限性 匿名管道 僅適用於有血緣關係的程序通訊.本功能實現的是 ps axu grep bash 通過呼叫 ps 和 grep命令 然後分別將他們的輸出 和 輸入的檔案描述符改變.從終端改入到管道中.intmain int argc,char ar pid t pid fork...
程序建立fork 和vfork
乙個現有的程序可以通過兩種方式建立乙個新的程序,下面詳細介紹兩種fork vfork 函式原型 man 手冊 include pid t fork void 描述 fork 以當前的程序為副本建立乙個新的程序,新建立的程序被稱為子程序,當前的程序被稱為父程序,父程序和子程序執行在各自的位址空間。返回...