-
命名管道
鎖定
- 中文名
- 命名管道
- 外文名
- Named Pipes
- 支持平台
- Windows,Linux,Unix等
命名管道簡介
命名管道(NamedPipe)是服務器進程和一個或多個客户進程之間通信的單向或雙向管道。不同於匿名管道的是:命名管道可以在不相關的進程之間和不同計算機之間使用,服務器建立命名管道時給它指定一個名字,任何進程都可以通過該名字打開管道的另一端,根據給定的權限和服務器進程通信。命名管道提供了相對簡單的編程接口,使通過網絡傳輸數據並不比同一計算機上兩進程之間通信更困難,不過如果要同時和多個進程通信它就力不從心了。
[1]
命名管道作用
在計算機編程裏,命名管道是一種從一個進程到另一個進程用內核對象來進行信息傳輸。和一般的管道不同,命名管道可以被不同進程以不同的方式方法調用(可以跨權限、跨語言、跨平台)。只要程序知道命名管道的名字,發送到命名管道里的信息可以被一切擁有指定授權的程序讀取,但對不具有制定授權的。命名管道是一種FIFO(先進先出,First-In First-Out)對象。
[2]
命名管道應用方向與學習方法
假定有一台服務器保存着公司的秘密,我們要求只有公司的管理人員才能訪問或編輯這些秘密(高權限信息)。而在自己的工作網絡,公司內的每名員工都可看到網絡上的這台計算機(低權限訪問)。然而,我們並不希望普通員工(低權限組)取得對機密材料的訪問權。公司要求我們開發一個數據管理系統,此係統只允許一個指定的用户組(高權限組)進行操作。
在這種情況下,命名管道等包含ACL的數據通信系統可發揮作用。因為我們可利用ACL,使只有擁有特別權限的用户(高權限組)與指定服務器發送控制信息,以此對公司的秘密進行操作。在此要記住的一個重點是:將命名管道作為一種網絡編程方案使用時,它實際上建立一個簡單的客户機/服務器數據通信體系(通常是TCP/IP,TCP協議具有良好的穩定性與數據安全性)。
要學習開發一組命名管道應用(可能是一個進程的不同線程、同一個可執行性文件的不同實例或完全不同的程序),首先要了解命名管道的命名規範(命名協議),然後瞭解基本的管道類型,接着實現一組簡單的服務器應用與一個客户端應用。然後再以它為基礎,深入研究高級的服務器編程技術,瞭解更復雜的通信系統與簡單的通信協議。
命名管道Linux實例
命名管道實例1
在一個程序中實現命名管道的創建與使用。
#include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int main( void) { char buf[80]; int fd; unlink("zieckey_fifo"); mkfifo("zieckey_fifo",0777); if ( fork()>0) { chars[]="Hello!\n"; fd=open("zieckey_fifo",O_WRONLY); write(fd,s,sizeof(s)); //close(fd); } else { fd=open("zieckey_fifo",O_RDONLY); read(fd,buf,sizeof(buf)); printf("The message from the pipes:%s\n",buf); //close(fd); } return0; } /*執行結果為 The message from the pipes:Hello! 並且可以在程序執行目錄生成管道文件zieckey_fifo */
命名管道實例2
此示例代碼意在體現出命名管道與普通管道的區別,命名管道是以一個普通文件的形式出現的,包括三個文件操作:創建命名管道、寫管道、讀管道。
1. 創建命名管道
#include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int main(void) { char buf[80]; int fd; unlink("zieckey_fifo"); mkfifo("zieckey_fifo",0777); }
寫命名管道代碼
#include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int main(void) { int fd; chars[]="Hello!\n"; fd=open("zieckey_fifo",O_WRONLY); while (1) { write(fd,s,sizeof(s)); sleep(1); } return 0; }
讀命名管道代碼
#include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> int main(void) { int fd; char buf[80]; fd=open("zieckey_fifo",O_RDONLY); while(1) { read(fd,buf,sizeof(buf)); printf("%s\n",buf); sleep(1); } return0; }
- 參考資料
-
- 1. 《命名管道與郵件槽機制的比較》百度文庫
- 2. 命名管道 .TechTarget信息化[引用日期2015-06-09]