fork建立程序和利用匿名管道程序間的通訊

2021-09-30 20:31:18 字數 1161 閱讀 1506

如果要使用匿名管道,那麼我們必須呼叫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 以當前的程序為副本建立乙個新的程序,新建立的程序被稱為子程序,當前的程序被稱為父程序,父程序和子程序執行在各自的位址空間。返回...