利用管道實現程序間的單向通訊
阿新 • • 發佈:2018-11-11
管道是程序間通訊的最原始方式,今天我們利用管道的程序間通訊,來實現簡單的程序間單向通訊
首先我們需要了解命名管道的一些特性命名管道的使用與建立
然後建立一個fifo_c的檔案來實現輸入資料和傳送資料
/*這是一個命名管道的實現,往命名管道中寫入資料,並且傳送給另一個程序 * 1. 建立一個命名管道 * int mkfifo(const char*pathname,mod_t mod); * pathname:管道的檔案路徑名字 * mod:管道檔案的許可權 * 成功返回0, 失敗返回-1 * 2.開啟管道open * 3.往管道中寫入資料 * 4.關閉管道檔案close */ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<fcntl.h>//檔案操作的標頭檔案 int main() { umask(0); //為了防止因為管道檔案存在,建立失敗 //unlink("./test.fifo")-----刪除檔案 //1.建立命名管道 if(mkfifo("./test.fifo",0664)<0){ if(errno==EEXIST){ //檔案存在 } else{ perror("mkfifo error"); return -1; } } //2.開啟管道檔案 //開啟特性:如果以只讀開啟命名管道,那麼open函式將阻塞等待,直到有其他程序以寫的方式開啟這個命名管道 //只寫反之亦然 //如果檔案以讀寫的方式發開,則不會阻塞 int fd=open("./test.fifo",O_WRONLY);//以只寫的方式開啟管道 if(fd<0){//根據開啟管道的返回值,來判斷是否成功開啟 perror("open fifo error"); return -1; } printf("open fifo file success!!read start!\n"); while(1){ char buff[1024]={0}; scanf("%s",buff);//從鍵盤輸入資料 write(fd,buff,strlen(buff)); sleep(1); } close(fd); return 0; }
建立一個fifo來接收列印資料
/*這是一個命名管道的實現,從命名管道中讀取資料列印 * 1. 建立一個命名管道 * int mkfifo(const char*pathname,mod_t mod); * pathname:管道的檔案路徑名字 * mod:管道檔案的許可權 * 成功返回0, 失敗返回-1 * 2.開啟管道open * 3.從管道中讀取資料 * 4.關閉管道檔案close */ #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<errno.h> #include<string.h> #include<fcntl.h>//檔案操作的標頭檔案 int main() { umask(0); //為了防止因為管道檔案存在,建立失敗 //unlink("./test.fifo")-----刪除檔案 //1.建立命名管道 if(mkfifo("./test.fifo",0664)<0){ if(errno==EEXIST){ //檔案存在 } else{ perror("mkfifo error"); return -1; } } //2.開啟管道檔案 //開啟特性:如果以只讀開啟命名管道,那麼open函式將阻塞等待,直到有其他程序以寫的方式開啟這個命名管道 //只寫反之亦然 // //如果檔案以讀寫的方式發開,則不會阻塞 int fd=open("./test.fifo",O_RDONLY); if(fd<0){ perror("open fifo error"); return -1; } printf("open fifo file success!!read start!\n"); while(1){ char buff[1024]={0}; int ret=read(fd,buff,1023); if(ret>0){//如果讀取成功列印 printf("client say[%s] \n",buff); }else if(ret==0){//如果所有寫端被關閉,那麼讀取時返回0; printf("all write point is close\n"); sleep(1); } } close(fd); return 0; }
執行,fifo_c和fifo兩個程序,給fifo_c輸入"你好啊! ! !"
fifo接收到