命名管道

"命名管道"或"命名管線"(Named Pipes)是一種簡單的進程間通信(I P C)機制,

基本描述

簡介

"命名管道"或"命名管線"(Named Pipes)是一種簡單的進程間通信(I P C)機制,
Microsoft Windows NT,Windows 2000,Windows 95以及Windows 98均提供了對它的支持
(但不包括Windows CE).命名管道可在同一台計算機的不同進程之間,或在跨越一個網路的
不同計算機的不同進程之間,支持可靠的,單向或雙向的數據通信.用命名管道來設計套用
程式實際非常簡單,並不需要事先深入掌握基層網路傳送協定(如T C P / I P或I P X)的知識.這
是由於命名管道利用了微軟網路提供者(M S N P)重定向器,通過一個網路,在各進程間建立
通信.這樣一來,應用程式便不必關心網路協定的細節.之所以要用命名管道作為自己的網
絡通信方案,一項重要的原因是它們充分利用了Windows NT及Windows 2000內建的安全特
性.

作用

這裡有一個可采納命令管道的例子.假定我們要開發一個數據管理系統,只允許一個指
定的用戶組進行操作.想像在自己的辦公室中,有一部計算機,其中保存著公司的秘密.我
們要求只有公司的管理人員,才能訪問及處理這些秘密.假定在自己的工作站機器上,公司
內的每名員工都可看到網路上的這台計算機.然而,我們並不希望普通員工取得對機密材料
的訪問權.在這種情況下,命名管道可發揮出很好的作用,因為我們可開發一個伺服器套用
程式,令其以來自客戶機的請求為準,對公司的秘密進行安全操作.伺服器可將客戶訪問限
制在管理人員身上,用Windows NT或新版Windows 2000自帶的安全機制,便可非常輕鬆地做
到這一點.
在此要記住的一個重點是,將命名管道作為一種網路編程方案使用時,它實際上建立一
個簡單的客戶機/伺服器數據通信體系,可在其中可靠地傳輸數據.本章將介紹如何來開發
一個命名管道客戶機及伺服器套用.首先要解釋的是命名管道的命名規範(約定),然後介紹
基本的管道類型.隨後,將向大家展示如何實現一個簡單的伺服器套用.然後以它為基礎,
深入探討高級的伺服器編程技術.接下來,講解如何開發一個簡單的客戶機套用.到本章末,

問題總結

我們會對命名管道已知的所有問題及限制進行總結.

實例1

在一個程式中實現命名管道的創建與使用
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main(void)
{
char buf&#91;80&#93;;
int fd;
unlink( "zieckey_fifo" );
mkfifo( "zieckey_fifo", 0777 );
if ( fork() > 0 )
{
char s&#91;&#93; = "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 pipe is:%s\n", buf );
//close( fd );
}
return 0;
}
執行
hello!

實例2

此示例代碼意在體現出命名管道與普通管道的區別,命名管道是以一個普通檔案的形式出現的,包括三個檔案,創建命名管道、寫管道、讀管道
1. 創建命名管道
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main(void)
{
char buf&#91;80&#93;;
int fd;
unlink( "zieckey_fifo" );
mkfifo( "zieckey_fifo", 0777 );
}

2. 寫命名管道代碼

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main(void){
int fd;
char s&#91;&#93; = "Hello!\n";
fd = open( "zieckey_fifo", O_WRONLY );
while(1) {
write( fd, s, sizeof(s) );
sleep(1);
}
return 0;
}

3. 讀命名管道代碼

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>
int main(void){
int fd;
char buf&#91;80&#93;;
fd = open( "zieckey_fifo", O_RDONLY );
while(1) {
read( fd, buf, sizeof(buf) );
printf("%s\n", buf);
sleep(1);
}
return 0;
}

相關搜尋

熱門詞條

聯絡我們