命名管道

命名管道

“命名管道”又名“命名管線”(Named Pipes),是一種簡單的進程間通信(IPC)機制,Microsoft Windows大都提供了對它的支持(但不包括Windows CE)。命名管道可在同一台計算機的不同進程之間或在跨越一個網路的不同計算機的不同進程之間,支持可靠的、單向或雙向的數據通信。推薦用命名管道作為進程通信方案的一項重要的原因是它們充分利用了Windows內建的安全特性(ACL等)。

用命名管道來設計跨計算機應用程式實際非常簡單,並不需要事先深入掌握底層網路傳送協定(如TCP、UDP、IP、IPX)的知識。這是由於命名管道利用了微軟網路提供者(MSNP)重定向器通過同一個網路在各進程間建立通信,這樣一來,應用程式便不必關心網路協定的細節。

基本介紹

  • 中文名:命名管道
  • 外文名:Named Pipes
  • 支持平台:Windows,Linux,Unix等
簡介,作用,套用方向與學習方法,Linux實例,實例1,實例2,

簡介

命名管道(NamedPipe)是伺服器進程和一個或多個客戶進程之間通信的單向或雙向管道。不同於匿名管道的是:命名管道可以在不相關的進程之間和不同計算機之間使用,伺服器建立命名管道時給它指定一個名字,任何進程都可以通過該名字打開管道的另一端,根據給定的許可權和伺服器進程通信。命名管道提供了相對簡單的編程接口,使通過網路傳輸數據並不比同一計算機上兩進程之間通信更困難,不過如果要同時和多個進程通信它就力不從心了。

作用

在計算機編程里,命名管道是一種從一個進程到另一個進程用核心對象來進行信息傳輸。和一般的管道不同,命名管道可以被不同進程以不同的方式方法調用(可以跨許可權、跨語言、跨平台)。只要程式知道命名管道的名字,傳送到命名管道里的信息可以被一切擁有指定授權的程式讀取,但對不具有制定授權的。命名管道是一種FIFO(先進先出,First-In First-Out)對象。

套用方向與學習方法

假定有一台伺服器保存著公司的秘密,我們要求只有公司的管理人員才能訪問或編輯這些秘密(高許可權信息)。而在自己的工作網路,公司內的每名員工都可看到網路上的這台計算機(低許可權訪問)。然而,我們並不希望普通員工(低許可權組)取得對機密材料的訪問權。公司要求我們開發一個數據管理系統,此系統只允許一個指定的用戶組(高許可權組)進行操作
在這種情況下,命名管道等包含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;}

相關詞條

熱門詞條

聯絡我們