無名管道的缺點是無法在非親屬之間進行通信,由于無名管道的缺點,對其進行改進後形成了有名管道。
所謂有名,即在檔案系統中存在一個這樣的檔案節點,每一個檔案節點都有一個inode号,而且這是一個特殊的檔案類型:p管道類型。
管道檔案隻有inode号,不占有磁盤空間。
如何建立管道檔案?
運用mkfifo函數建立管道檔案。
函數名 | mkfifo |
---|---|
頭檔案 | #include<sys/types.h> , #include<sys/stat.h> |
函數形式 | int mkfifo (const char* filename ,mode_t mode) |
參數 | 管道檔案建立的檔案名(需要包含路徑)和權限,建立的檔案權限和umask有關 |
傳回值 | 成功傳回:0 失敗傳回:-1 |
注意 | mkfifo函數隻建立了管道檔案,并沒有在核心建立管道,隻有通過open函數打開檔案時,管道才會建立 |
程式執行個體:
在目前目錄先建立管道檔案:
int main(){
int fiforet;
fiforet = mkfifo("./myfifo",0777); //在目前目錄下建立管道檔案 權限與umask有關
if(fiforet < 0){
printf("Creat fifo failure\n");
}
printf("Creat fifo success\n");
printf("fiforet=%d\n",fiforet);
return 0;
}
不同的(非親緣關系)程序間通信:
int main(){ //發送端
int fiforet;
int fd,i;
char inter = 0;
fiforet = mkfifo("./fifo",0777); //建立管道檔案
if(fiforet < 0){
printf("Creat fifo failure\n");
}
printf("Creat fifo success\n");
printf("fiforet=%d\n",fiforet);
fd = open("./fifo",O_WRONLY); //打開管道檔案
if(fd < 0){
printf("open fifo failure\n");
}
printf("open fifo success\n");
inter = 1;
write(fd,&inter,1); //寫入
sleep(3);
for(i = 0;i <5;i++){
printf("Have send message\n");
}
return 0;
}
int main(){ //接收端
int fiforet;
int fd;
char inter;
fd = open("./fifo",O_RDONLY);
if(fd < 0){
printf("open fifo failure\n");
}
printf("open fifo success\n");
read(fd,&inter,1);
printf("inter = %d",inter);
if(inter == 1){
printf("Have received message\n");
}
return 0;
}
程式運作結果:
發送端:
接收端: