程序間通信:是指多個程序之間資料互相轉換。
程序間通訊的方式:
單機通訊:信号、管道(有名管道、無名管道)、信号量、消息隊列、共享存儲
多機通訊:套接字(socket)
管道通訊的原理
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPVhVZuVzVhhHZtJGasNDW1YEWlZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM1gDM0IjMyITOxATM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
有名管道:應用于任意兩個程序之間資料的單向傳遞
管道操作:建立 指令方式:mkfifo 函數方式:mkfifo();
打開 open
讀資料 read
寫資料 write
關閉 close
因為管道檔案建立之後,之後的操作就和普通檔案操作一樣,那我在此就不再進行具體的說明了。
在此說明一下,有名管道隻是在檔案目錄樹中有一個檔案标示,它實際上并不占據磁盤空間,而是将資料緩存在記憶體上。
有名管道特性:阻塞運作
阻塞運作函數:函數調用以後并不會立即傳回,需要等待某些條件的發生才會傳回。
open操作管道檔案
(1)如果一個程序是以隻寫的方式打開一個管道檔案,那麼open函數會阻塞運作,直到另一個程序以讀的方式(不管是隻讀還是讀寫)打開管道檔案。open函數才會傳回,程序才會接着運作。
(2)如果一個程序是以隻讀的方式打開一個管道檔案,那麼open函數會阻塞運作,直到另一個程序以寫的方式(不管是隻寫還是讀寫)打開管道檔案。open函數才會傳回,程序才會接着運作。
read函數操作管道檔案----read函數操作管道檔案時也會阻塞運作,直到寫端寫入資料或者所有的寫端全都關閉。read函數讀取資料并且會将記憶體上的已讀資料清空。
下面請看兩個代碼
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd=open("FIFO",O_WRONLY);
assert(fd!=-1);
if(fd==-1)
{
exit(0);
}
printf("FIFO open success\n");
write(fd,"hello world",10);
printf("write success\n");
}
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
int fd=open("FIFO",O_RDONLY);
assert(fd!=-1);
if(fd==-1)
{
exit(0);
}
printf("FIFO open success\n");
char buff[128]={0};
read(fd,buff,127);
printf("read data:%s\n",buff);
}
如上面兩個代碼所示,如果單獨執行其中一個代碼,那麼将會沒有結果。要想代碼2中順利輸出代碼1中輸入到管道檔案中的資料,那麼在運作代碼1的同時運作代碼2.
測試檔案如下:
單獨執行代碼1:
,程序a會阻塞運作,等待另一個程序b以讀方式打開
補充執行代碼2:
後的結果
程序a
程序b
上面的結果顯示程序a成功寫入資料,程序b也成功讀取了資料。兩個程序成功通過管道進行了通訊。