linux中使用匿名管道實現程序間通訊
阿新 • • 發佈:2019-02-12
管道是最基本的IPC機制,由pipe函式建立。在呼叫pipe函式時,會在記憶體中建立一個緩衝區,稱為管道。這個管道有兩個端,一個讀端和一個寫端。通過filedes引數傳給使用者程式的兩個檔案描述符,filedes[0]指向管道的讀端,filedes[1]指向管道的寫端。
在linux中一切皆檔案,管道可以看成是一個檔案,可以通過read和write函式對管道進行讀寫操作。程序間通訊時如何通過匿名管道實現的呢?
1.父程序呼叫pipe開闢管道,得到兩個檔案描述符指向管道的兩端;
2.父程序呼叫fork建立子程序,子程序也有兩個檔案描述符指向管道的兩端;
3.父程序關閉管道讀端,子程序關閉管道寫端,父程序可以往管道里寫,子程序可以從管道里讀。管道用環形佇列實現,資料從寫入端流入,讀端流出,這樣就實現了程序間通訊。
執行結果:#include<stdio.h> #include<unistd.h> #include<errno.h> #include<string.h> #include<sys/wait.h> int main() { <span style="white-space:pre"> </span>int _pipe[2]; int ret = pipe(_pipe); if(ret == -1) { printf("creare pipe error\n"); return 1; } pid_t id = fork(); if(id < 0) { printf("fork error\n"); return 2; } else if(id == 0) { close(_pipe[0]); int i = 0; char* mesg_c = NULL; while(i++ < 10) { mesg_c = "i am a child!"; write(_pipe[1],mesg_c,strlen(mesg_c)+1); sleep(1); } close(_pipe[1]); } else { close(_pipe[1]); char _mesg[100]; int j = 0; while(j++ < 100) { memset(_mesg,'\0',sizeof(_mesg)); int ret = read(_pipe[0],_mesg,sizeof(_mesg)); printf("%s:code is :%d\n",_mesg,ret); } if(waitpid(id,NULL,0) < 0) return 3; } return 0; }
總結:程序通過檔案描述符對管道進行控制,只有有血緣關係的程序才可以通過管道進行通訊。