天天看點

Linux程序間通信之有名管道

無名管道的缺點是無法在非親屬之間進行通信,由于無名管道的缺點,對其進行改進後形成了有名管道。

所謂有名,即在檔案系統中存在一個這樣的檔案節點,每一個檔案節點都有一個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;
}
           
Linux程式間通信之有名管道

不同的(非親緣關系)程序間通信:

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;
    }

           

程式運作結果:

發送端:

Linux程式間通信之有名管道

接收端:

Linux程式間通信之有名管道

繼續閱讀