Linux進程進程間的通訊之具名管道(FIFO) 具名管道(FIFO),它和一般的管道一樣。都是作為中間的郵遞員來實現兩個進程間的通訊交流。 具名管道(FIFO)有幾個特點: 1.具名管道(FIFO)是作為一種特殊的裝置檔案而存在。 2.通過FIFO管道不同進程間可以通過管道實現資料交流。而不像pipe只能用在有親緣關係的進程間。 3.當使用完該管道的進程執行所有的I/O操作後,具名管道仍然存在檔案系統中,以便以後繼續使用。 那麼我們怎麼來建立一個具名管道(FIFO)呢? 1.我們可以用命令列的方式進行建立。 mkfifo 檔案名稱 (檔案名稱 就是我們要建立的管道) 注意檔案類型和顏色大小。在後面的例子我們用完後再看。 2.第二種通過系統調用使用mkfifo函數。 #include<stat.h> #include<sys/types.h> int mkfifo(const char * pathname ,mode_t mode); 功能:就是建立一個具名管道 傳回值:成功返回0,失敗返回-1。 參數: pathname 是在那個命令下建立具名管道。 mode 模式即該具名管道的許可權。 下面看個例子: #include<stdio.h> #include<sys/stat.h> #include<sys/types.h> #include<stdlib.h> #include<string.h> #include<fcntl.h> #include<sys/wait.h> #include<unistd.h> #define LEN 1024 int main(int argc ,char*argv[]) { int result; pid_t pid; char buf[LEN]; int fd,flag=0; unlink("fifo"); result=mkfifo("fifo",0777);//建立的具名管道為755 if(result==-1){ perror("mkfifo error:");// print a system error message exit(EXIT_FAILURE); } if((pid=fork())==-1){//建立一個子進程 perror("fork error:"); exit(EXIT_FAILURE); }else if(pid==0){//子進程 fd=open("fifo",O_RDONLY); //以唯讀方式開啟剛才建立的具名管道 while(1){ read(fd,buf,LEN);//讀取具名管道中的資料放到buf中 printf("read from pipe: %s\n",buf); if(strcmp(buf,"exit")==0){//if讀到的字串為exit則退出 exit(EXIT_SUCCESS); } } }else{//父進程 fd=open("fifo",O_WRONLY); //以唯讀方式開啟剛才建立的具名管道 while(1){ waitpid(pid,NULL,WNOHANG); //等待子進程退出父進程用來回收資源等 if(flag==1){ exit(EXIT_SUCCESS); close(fd); } scanf("%s",buf); write(fd,buf,strlen(buf)+1); //向管道中寫入資料 if(strcmp(buf,"exit")==0){ flag=1;//退出標誌 sleep(1);//保證子進程先退出 } } } return 0; } 運行結果為: 可以看出管道檔案fifo的大小還是o,它只是中間介質。用來實先處理序間通訊的工具。 |