假定有一臺(tái)服務(wù)器保存著公司的秘密,我們要求只有公司的管理人員才能訪問或編輯這些秘密(高權(quán)限信息)。而在自己的工作網(wǎng)絡(luò),公司內(nèi)的每名員工都可看到網(wǎng)絡(luò)上的這臺(tái)計(jì)算機(jī)(低權(quán)限訪問)。然而,我們并不希望普通員工(低權(quán)限組)取得對機(jī)密材料的訪問權(quán)。公司要求我們開發(fā)一個(gè)數(shù)據(jù)管理系統(tǒng),此系統(tǒng)只允許一個(gè)指定的用戶組(高權(quán)限組)進(jìn)行操作。

在這種情況下,命名管道等包含ACL的數(shù)據(jù)通信系統(tǒng)可發(fā)揮作用。因?yàn)槲覀兛衫肁CL,使只有擁有特別權(quán)限的用戶(高權(quán)限組)與指定服務(wù)器發(fā)送控制信息,以此對公司的秘密進(jìn)行操作。在此要記住的一個(gè)重點(diǎn)是:將命名管道作為一種網(wǎng)絡(luò)編程方案使用時(shí),它實(shí)際上建立一個(gè)簡單的客戶機(jī)/服務(wù)器數(shù)據(jù)通信體系(通常是TCP/IP,TCP協(xié)議具有良好的穩(wěn)定性與數(shù)據(jù)安全性)。

要學(xué)習(xí)開發(fā)一組命名管道應(yīng)用(可能是一個(gè)進(jìn)程的不同線程、同一個(gè)可執(zhí)行性文件的不同實(shí)例或完全不同的程序),首先要了解命名管道的命名規(guī)范(命名協(xié)議),然后了解基本的管道類型,接著實(shí)現(xiàn)一組簡單的服務(wù)器應(yīng)用與一個(gè)客戶端應(yīng)用。然后再以它為基礎(chǔ),深入研究高級的服務(wù)器編程技術(shù),了解更復(fù)雜的通信系統(tǒng)與簡單的通信協(xié)議。

命名管道造價(jià)信息

市場價(jià) 信息價(jià) 詢價(jià)
材料名稱 規(guī)格/型號 市場價(jià)
(除稅)
工程建議價(jià)
(除稅)
行情 品牌 單位 稅率 供應(yīng)商 報(bào)價(jià)日期
管道 公稱直徑DN(mm):50,規(guī)格型號:24 查看價(jià)格 查看價(jià)格

卓奧

m 13% 江蘇卓奧節(jié)能設(shè)備安裝工程有限公司浙江辦事處
管道式換氣扇 DPT20-54B 風(fēng)量:770m3/H;功率:0.145KW;噪聲:35DB(A),風(fēng)壓:200PA 查看價(jià)格 查看價(jià)格

雄吉通風(fēng)

臺(tái) 13% 重慶市雄吉通風(fēng)設(shè)備股份有限公司
給水用鋼絲網(wǎng)增強(qiáng)聚乙烯復(fù)合管道1.6MPA Ф160 查看價(jià)格 查看價(jià)格

顧地

m 13% 重慶顧地塑膠電器有限公司
給水用鋼絲網(wǎng)增強(qiáng)聚乙烯復(fù)合管道1.6MPA Ф200 查看價(jià)格 查看價(jià)格

顧地

m 13% 重慶顧地塑膠電器有限公司
管道及附件 包含系統(tǒng)內(nèi)所含的管道、彎頭、三通、法蘭等 查看價(jià)格 查看價(jià)格

13% 上海熊貓機(jī)械(集團(tuán))有限公司
鋼纖增強(qiáng)聚乙烯復(fù)合壓力管道(含聚氨酯保溫層及PE外護(hù)套) DN200×8.5 1.6MPa 查看價(jià)格 查看價(jià)格

粵星管道

m 13% 廣東建通管道制品有限公司
鋼纖增強(qiáng)聚乙烯復(fù)合壓力管道(含聚氨酯保溫層及PE外護(hù)套) DN350×13 1.6MPa 查看價(jià)格 查看價(jià)格

粵星管道

m 13% 廣東建通管道制品有限公司
鋼纖增強(qiáng)聚乙烯復(fù)合壓力管道(含聚氨酯保溫層及PE外護(hù)套) DN63×5 1.6MPa 查看價(jià)格 查看價(jià)格

粵星管道

m 13% 廣東建通管道制品有限公司
材料名稱 規(guī)格/型號 除稅
信息價(jià)
含稅
信息價(jià)
行情 品牌 單位 稅率 地區(qū)/時(shí)間
環(huán)衛(wèi)管道疏通機(jī) 功率1.5(kW) 查看價(jià)格 查看價(jià)格

臺(tái)班 韶關(guān)市2010年8月信息價(jià)
機(jī) 9A151 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年4季度信息價(jià)
機(jī) 功率120kW 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年4季度信息價(jià)
機(jī) 功率160kW 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年4季度信息價(jià)
機(jī) 9A151 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年3季度信息價(jià)
機(jī) 功率240kW 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年3季度信息價(jià)
機(jī) 功率120kW 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年3季度信息價(jià)
機(jī) 9A151 查看價(jià)格 查看價(jià)格

臺(tái)班 汕頭市2012年1季度信息價(jià)
材料名稱 規(guī)格/需求量 報(bào)價(jià)數(shù) 最新報(bào)價(jià)
(元)
供應(yīng)商 報(bào)價(jià)地區(qū) 最新報(bào)價(jià)時(shí)間
變壓器命名 變壓器命名牌|1臺(tái) 1 查看價(jià)格 廣西  來賓市 2012-12-04
管道系統(tǒng) 包括進(jìn)出水管道、藥劑輸送管道、污泥管道、自來水管道、壓縮空氣|1項(xiàng) 1 查看價(jià)格 廣東岑安機(jī)電有限公司 全國   2022-08-02
命名 命名牌 型號規(guī)格:方通龍骨+木紋鋁板 仿木紋色+深褐色 500x200xH2100|9個(gè) 3 查看價(jià)格 廣東雙子標(biāo)識科技有限公司 廣東   2020-11-17
管道支架 管道支架|1000kg 1 查看價(jià)格 廣州珠江管業(yè)科技有限公司 廣東  廣州市 2019-07-05
管道支架 管道支架|100kg 1 查看價(jià)格 廣州珠江管業(yè)科技有限公司 廣東  廣州市 2019-07-05
命名 2400×200×200機(jī)切面淺灰麻,60高幼圓字體(陰刻);方向箭頭(陰刻)|10m2 3 查看價(jià)格 云浮市城池石業(yè)有限公司 全國   2018-11-28
管道 系統(tǒng)配套,滿足設(shè)計(jì)和使用需求|1.0批 3 查看價(jià)格 東莞綠光新能源科技有限公司    2017-01-10
管道清理疏通 含吸污車吸取、運(yùn)輸,管道沖洗|12000m 1 查看價(jià)格 成都美妙一環(huán)保工程有限公司 四川   2022-07-12

序言

我們會(huì)對命名管道已知的所有問題及限制進(jìn)行總結(jié).

實(shí)例1

在一個(gè)程序中實(shí)現(xiàn)命名管道的創(chuàng)建與使用

實(shí)例2

此示例代碼意在體現(xiàn)出命名管道與普通管道的區(qū)別,命名管道是以一個(gè)普通文件的形式出現(xiàn)的,包括三個(gè)文件,創(chuàng)建命名管道、寫管道、讀管道

1. 創(chuàng)建命名管道

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

char s[]="Hello!\n";

fd=open("zieckey_fifo",O_WRONLY);

while(1){

write(fd,s,sizeof(s));

sleep(1);}

return0;

}

讀命名管道代碼

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

}

命名管道(NamedPipe)是服務(wù)器進(jìn)程和一個(gè)或多個(gè)客戶進(jìn)程之間通信的單向或雙向管道。不同于匿名管道的是:命名管道可以在不相關(guān)的進(jìn)程之間和不同計(jì)算機(jī)之間使用,服務(wù)器建立命名管道時(shí)給它指定一個(gè)名字,任何進(jìn)程都可以通過該名字打開管道的另一端,根據(jù)給定的權(quán)限和服務(wù)器進(jìn)程通信。命名管道提供了相對簡單的編程接口,使通過網(wǎng)絡(luò)傳輸數(shù)據(jù)并不比同一計(jì)算機(jī)上兩進(jìn)程之間通信更困難,不過如果要同時(shí)和多個(gè)進(jìn)程通信它就力不從心了。

命名管道應(yīng)用方向與學(xué)習(xí)方法常見問題

  • 學(xué)習(xí)方法

    個(gè)人覺得,初學(xué)造價(jià)首先要學(xué)會(huì)識圖,所以先看圖集;看懂圖后才開始學(xué)習(xí)軟件算量,算量中就要對定額和計(jì)算規(guī)則熟悉,可以減少很多不必要的工作內(nèi)容;最后就計(jì)價(jià),你覺得計(jì)價(jià)征有很多到底應(yīng)該套那些定額子目,所以你就...

  • 學(xué)習(xí)方法。

    在我看來,最簡單直接的學(xué)習(xí)不是看,而是做 就拿一套圖紙,從頭開始做 只有在做的過程中才會(huì)發(fā)現(xiàn)問題,然后想法解決問題

  • 廣聯(lián)達(dá)的學(xué)習(xí)方法

    答:當(dāng)拿到一套圖紙后先做GGJ2009鋼筋軟件較好,然后再做GCL2008圖形算量(當(dāng)然也可以先做GCL2008圖形算量軟件再做GGJ2009鋼筋軟件),最后做計(jì)價(jià)軟件。 要學(xué)習(xí)廣聯(lián)達(dá)軟件快可以與當(dāng)?shù)?..

在計(jì)算機(jī)編程里,命名管道是一種從一個(gè)進(jìn)程到另一個(gè)進(jìn)程用內(nèi)核對象來進(jìn)行信息傳輸。和一般的管道不同,命名管道可以被不同進(jìn)程以不同的方式方法調(diào)用(可以跨權(quán)限、跨語言、跨平臺(tái))。只要程序知道命名管道的名字,發(fā)送到命名管道里的信息可以被一切擁有指定授權(quán)的程序讀取,但對不具有制定授權(quán)的。命名管道是一種FIFO(先進(jìn)先出,F(xiàn)irst-In First-Out)對象。

命名管道實(shí)例1

在一個(gè)程序中實(shí)現(xiàn)命名管道的創(chuàng)建與使用。

#include
 
  
#include
  
    #include
   
     #include
    
      intmain( void) { charbuf[80]; intfd; unlink("zieckey_fifo");mkfifo("zieckey_fifo",0777); if( fork()>0) { chars[]="Hello! "; 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("Themessagefromthepipes:%s ",buf); //close(fd); } return0; } /*執(zhí)行結(jié)果為 Themessagefromthepipes:Hello! 并且可以在程序執(zhí)行目錄生成管道文件zieckey_fifo */
    
   
  
 

命名管道實(shí)例2

此示例代碼意在體現(xiàn)出命名管道與普通管道的區(qū)別,命名管道是以一個(gè)普通文件的形式出現(xiàn)的,包括三個(gè)文件操作:創(chuàng)建命名管道、寫管道、讀管道。

1. 創(chuàng)建命名管道

#include
 
  #include
  
   #include
   
    #include
    
     intmain(void){charbuf[80];intfd;unlink("zieckey_fifo");mkfifo("zieckey_fifo",0777);} 
    
   
  
 

寫命名管道代碼

#include
 
  #include
  
   #include
   
    #include
    
     intmain(void){intfd;chars[]="Hello! ";fd=open("zieckey_fifo",O_WRONLY); while (1){ write(fd,s,sizeof(s)); sleep(1); }return0;} 
    
   
  
 

讀命名管道代碼

#include
 
  #include
  
   #include
   
    #include
    
     intmain(void){intfd;charbuf[80];fd=open("zieckey_fifo",O_RDONLY);while(1){read(fd,buf,sizeof(buf));printf("%s ",buf);sleep(1);}return0;}
    
   
  
 

命名管道應(yīng)用方向與學(xué)習(xí)方法文獻(xiàn)

預(yù)算學(xué)習(xí)方法 預(yù)算學(xué)習(xí)方法

格式:pdf

大?。?span id="zdjt5gg" class="single-tag-height">24KB

頁數(shù): 10頁

評分: 4.6

一步一步跟我學(xué)預(yù)算 第 1 章: 施工圖預(yù)算編制依據(jù)和方法 5.1.1 施工圖預(yù)算的概念和作用 1.施工圖預(yù)算的概念 施工圖預(yù)算即單位工程預(yù)算書, 是在施工圖設(shè)計(jì)完成后, 工程開工前, 根據(jù)已批準(zhǔn)的施工圖 紙,在施工方案或施工組織設(shè)計(jì)已確定的前提下, 按照國家或省市頒發(fā)的現(xiàn)行預(yù)算定額、 費(fèi) 用標(biāo)準(zhǔn)、材料預(yù)算價(jià)格等有關(guān)規(guī)定,進(jìn)行逐項(xiàng)計(jì)算工程量、套用相應(yīng)定額、進(jìn)行工料分析、 計(jì)算直接費(fèi)、并計(jì)取間接費(fèi)、計(jì)劃利潤、稅金等費(fèi)用,確定單位工程造價(jià)的技術(shù)經(jīng)濟(jì)文件。 建筑安裝工程預(yù)算包括建筑工程預(yù)算和設(shè)備及安裝工程預(yù)算。 建筑工程預(yù)算又可分為一般土建工程預(yù)算、 給排水工程預(yù)算、 暖通工程預(yù)算、 電氣照明工程 預(yù)算、構(gòu)筑物工程預(yù)算及工業(yè)管道、 電力、電信工程預(yù)算;設(shè)備及安裝工程預(yù)算又可分為機(jī) 械設(shè)備及安裝工程預(yù)算和電氣設(shè)備及安裝工程預(yù)算。 本章只討論 “一般土建工程施工圖預(yù)算 ”的編制。 2. 施工圖預(yù)算的

立即下載
造價(jià)系統(tǒng)學(xué)習(xí)方法 造價(jià)系統(tǒng)學(xué)習(xí)方法

格式:pdf

大?。?span id="yqt4y5h" class="single-tag-height">24KB

頁數(shù): 2頁

評分: 4.8

造價(jià)系統(tǒng)學(xué)習(xí)方法 新手到底如何才能快速上手學(xué)會(huì)安裝造價(jià)呢? 安裝造價(jià)員的學(xué)習(xí),包含三個(gè)步驟: 1、首先要學(xué)會(huì)識圖 :水、電、暖通、消防工程的圖紙識圖; 2、學(xué)習(xí)算量 ,軟件算量 +手算; 3、學(xué)習(xí)計(jì)價(jià) ,列清單、套定額。 需要學(xué)習(xí)的內(nèi)容包括 從事安裝造價(jià)工作,需要具備如下技能: 4 大專業(yè): 第 1 個(gè)專業(yè):給排水 第 2 個(gè)專業(yè):強(qiáng)電(照明、插座、配電)、弱電(電視、電話、網(wǎng)絡(luò)、門禁、監(jiān) 控) 第 3 個(gè)專業(yè):消防(消火栓、噴淋) 第 4 個(gè)專業(yè):暖通(供暖、通風(fēng)空調(diào)) 4 個(gè)模塊: 第 1 個(gè)模塊:識圖、構(gòu)造 第 2 個(gè)模塊:清單、定額、手算 第 3 個(gè)模塊:廣聯(lián)達(dá)算量、計(jì)價(jià) 第 4 個(gè)模塊:編制招標(biāo)、投標(biāo)文件 安裝造價(jià)學(xué)習(xí)方法建議 ?安裝專業(yè)涉及的科目比較繁雜 其中最簡單的就是給排水和采暖,其次是電氣、通風(fēng)和空調(diào)專業(yè)。造價(jià)簡單說就 是量和價(jià)的問題。下面主要著重說下量。 ?識圖算量是基

立即下載

命名管道程序設(shè)計(jì)的實(shí)現(xiàn)

1.命名管道Server和Client間通信的實(shí)現(xiàn)流程

(1)建立連接:服務(wù)端通過函數(shù)CreateNamedPipe創(chuàng)建一個(gè)命名管道的實(shí)例并返回用于今后操作的句柄,或?yàn)橐汛嬖诘墓艿绖?chuàng)建新的實(shí)例。如果在已定義超時(shí)值變?yōu)榱阋郧埃幸粋€(gè)實(shí)例管道可以使用,則創(chuàng)建成功并返回管道句柄,并用以偵聽來自客戶端的連接請求,該功能通過ConnectNamedPipe函數(shù)實(shí)現(xiàn)。

另一方面,客戶端通過函數(shù)WaitNamedPipe使服務(wù)進(jìn)程等待來自客戶的實(shí)例連接,如果在超時(shí)值變?yōu)榱阋郧?,有一個(gè)管道可以為連接使用,則WaitNamedPipe將返回True,并通過調(diào)用CreateFile或CallNamedPipe來呼叫對服務(wù)端的連接。此時(shí)服務(wù)端將接受客戶端的連接請求,成功建立連接,服務(wù)端ConnectNamedPipe返回True,客戶端CreateFile將返回一指向管道文件的句柄。

從時(shí)序上講,首先是客戶端通過WaitNamedPipe使服務(wù)端的CreateFile在限時(shí)時(shí)間內(nèi)創(chuàng)建實(shí)例成功,然后雙方通過ConnectNamedPipe和CreateFile成功連接,并返回用以通信的文件句柄,此時(shí)雙方即可進(jìn)行通信。

(2)通信實(shí)現(xiàn):建立連接之后,客戶端與服務(wù)器端即可通過ReadFile和WriteFile,利用得到的管道文件句柄,彼此間進(jìn)行信息交換。

(3)連接終止:當(dāng)客戶端與服務(wù)端的通信結(jié)束,或由于某種原因一方需要斷開時(shí),客戶端應(yīng)調(diào)用CloseFile,而服務(wù)端應(yīng)接著調(diào)用DisconnectNamedPipe。當(dāng)然服務(wù)端亦可通過單方面調(diào)用DisconnectNamedPipe終止連接。最后應(yīng)調(diào)用函數(shù)CloseHandle來關(guān)閉該管道。

命名管道服務(wù)器端和客戶端代碼實(shí)現(xiàn)

客戶端

HANDLE CltHandle;

char pipenamestr[30];

sprintf(pipenamestr,″\\servername\pipe\pipename″)

if (WaitNamedPipe( pipenamestr, NMPWAIT—WAIT—FOREVER)==FALSE

// 管道名要遵循UNC,格式為\ \.\pipe\pipname,名字不分大小寫。

AfxMessageBox(″操作失敗,請確定服務(wù)端正確建立管道實(shí)例!″);

Else

CltHandle=CreateFile(pipenamestr, GENERIC—READ|GENERIC—WRITE, FILE—SHARE—READ| FILE—SHARE—WRITE,NULL, OPEN—EXISTING,

//為了與命名管道連接,此參數(shù)應(yīng)一直為OPEN—EXISTING

FILE—ATTRIBUTE—ARCHIVE|FILE—FLAG—WRITE—THROUGH,

// FILE—FLAG—WRITE—THROUGH會(huì)使管道WriteFile調(diào)用處于阻塞狀態(tài),直到數(shù)據(jù)傳送成功。

NULL);

If (CltHandle== INVALID—HANDLE—VALUE)

AfxMessageBox(″管道連接失敗″);

Else

DoUsertTransactInfo();

//執(zhí)行用戶自定義信息交換函數(shù)——從管道讀、寫信息。

……

服務(wù)端

HANDLE SvrHandle;

char pipenamestr[30];

sprintf(pipenamestr,″\\.\pipe\pipename″)

SvrHandle=CreateNamedPipe(pipenamestr,

PIPE—ACCESS—DUPLEX|FILE—FLAG—WRITE—THROUGH,

//阻塞模式,這種模式僅對″字節(jié)傳輸管道″操作有效。

FILE—WAIT|PIPE—TYPE—BYTE,

//字節(jié)模式

PIPE—UNLIMITED—INSTANCES,

128,128,

NULL,NULL);

// SECURITY—ATTRIBUTES結(jié)構(gòu)指針,描述一個(gè)新管道,確定子進(jìn)程的繼承權(quán),如果為NULL則該命名管道不能被繼承。

If (SvrHandle==INVALID—HANDLE—VALUE)

AfxMessageBox(″管道創(chuàng)建失敗,請確定客戶端提供連接可能!″);

Else

If (ConnectNamedPipe(SvrHandle,NULL)==FALSE)

AfxMessageBox(″建立連接失敗!″);

Else

DoUsertTransactInfo();

//用戶自定義信息交換函數(shù)

……

使用靈活性

命名管道具有很好的使用靈活性,表現(xiàn)在:

1) 既可用于本地,又可用于網(wǎng)絡(luò)。

2) 可以通過它的名稱而被引用。

3) 支持多客戶機(jī)連接。

4) 支持雙向通信。

5) 支持異步重疊I/O操作。

不過,當(dāng)前只有Windows NT支持服務(wù)端的命名管道技術(shù)。

命名管道是由服務(wù)器端的進(jìn)程建立的,管道的命名必須遵循特定的命名方法,就是 "\\.\pipe\管道名",當(dāng)作為客戶端的進(jìn)程要使用時(shí),使用"\\計(jì)算機(jī)名\\pipe\管道名" 來打開使用,具體步驟如下:

服務(wù)端通過函數(shù) CreateNamedPipe 創(chuàng)建一個(gè)命名管道的實(shí)例并返回用于今后操作的句柄,或?yàn)橐汛嬖诘墓艿绖?chuàng)建新的實(shí)例。 服務(wù)端偵聽來自客戶端的連接請求,該功能通過 ConnectNamedPipe 函數(shù)實(shí)現(xiàn)。 客戶端通過函數(shù) WaitNamedPipe 來等待管道的出現(xiàn),如果在超時(shí)值變?yōu)榱阋郧埃幸粋€(gè)管道可以使用,則 WaitNamedPipe 將返回 True,并通過調(diào)用 CreateFile 或 CallNamedPipe 來呼叫對服務(wù)端的連接。 此時(shí)服務(wù)端將接受客戶端的連接請求,成功建立連接,服務(wù)端 ConnectNamedPipe 返回 True 建立連接之后,客戶端與服務(wù)器端即可通過 ReadFile 和 WriteFile,利用得到的管道文件句柄,彼此間進(jìn)行信息交換。 當(dāng)客戶端與服務(wù)端的通信結(jié)束,客戶端調(diào)用 CloseFile,服務(wù)端接著調(diào)用 DisconnectNamedPipe。最后調(diào)用函數(shù)CloseHandle來關(guān)閉該管道。 由于命名管道使用時(shí)作為客戶端的程序必須知道管道的名稱,所以更多的用在同一"作者"編寫的服務(wù)器/工作站程序中,你不可能隨便找出一個(gè)程序來要求它和你寫的程序來通過命名管道通信。而匿名管道的使用則完全不同,它允許你和完全不相干的進(jìn)程通信,條件是這個(gè)進(jìn)程通過控制臺(tái)"console"來輸入輸出,典型的例子是老的 Dos 應(yīng)用程序,它們在運(yùn)行時(shí) Windows 為它們開了個(gè) Dos 窗口,它們的輸入輸出就是 console 方式的。還有一些標(biāo)準(zhǔn)的 Win32 程序也使用控制臺(tái)輸入輸出,如果在 Win32 編程中不想使用圖形界面,你照樣可以使用 AllocConsole 得到一個(gè)控制臺(tái),然后通過 GetStdHandle 得到輸入或輸出句柄,再通過 WriteConsole 或 WriteFile 把結(jié)果輸出到控制臺(tái)(通常是一個(gè)象 Dos 窗口)的屏幕上。雖然這些程序看起來象 Dos 程序,但它們是不折不扣的 Win32 程序,如果你在純 Dos 下使用,就會(huì)顯示"The program must run under Windows!"。

一個(gè)控制臺(tái)有三個(gè)句柄:標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出和和標(biāo)準(zhǔn)錯(cuò)誤句柄,標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出句柄是可以重新定向的,你可以用匿名管道來代替它,這樣一來,你可以在管道的另一端用別的進(jìn)程來接收或輸入,而控制臺(tái)一方并沒有感到什么不同,就象 Dos 下的 > 或者 < 可以重新定向輸出或輸入一樣。通??刂婆_(tái)程序的輸入輸出如下:

(控制臺(tái)進(jìn)程output) write ----> 標(biāo)準(zhǔn)輸出設(shè)備(一般是屏幕)

(控制臺(tái)進(jìn)程input) read <---- 標(biāo)準(zhǔn)輸入設(shè)備(一般是鍵盤)

而用管道代替后:

(作為子進(jìn)程的控制臺(tái)進(jìn)程output) write ----> 管道1 ----> read (父進(jìn)程)

(作為子進(jìn)程的控制臺(tái)進(jìn)程input) read <----> 管道2 <---- write (父進(jìn)程)

使用匿名管道的步驟如下:

使用 CreatePipe 建立兩個(gè)管道,得到管道句柄,一個(gè)用來輸入,一個(gè)用來輸出 準(zhǔn)備執(zhí)行控制臺(tái)子進(jìn)程,首先使用 GetStartupInfo 得到 StartupInfo 使用第一個(gè)管道句柄代替 StartupInfo 中的 hStdInput,第二個(gè)代替 hStdOutput、hStdError,即標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤句柄 使用 CreateProcess 執(zhí)行子進(jìn)程,這樣建立的子進(jìn)程輸入和輸出就被定向到管道中 父進(jìn)程通過 ReadFile 讀第二個(gè)管道來獲得子進(jìn)程的輸出,通過 WriteFile 寫第一個(gè)管道來將輸入寫到子進(jìn)程 父進(jìn)程可以通過 PeekNamedPipe 來查詢子進(jìn)程有沒有輸出 子進(jìn)程結(jié)束后,要通過 CloseHandle 來關(guān)閉兩個(gè)管道。 下面是具體的說明和定義:

1. 建立匿名管道使用 CreatePipe 原形如下:

BOOL CreatePipe(

PHANDLE hReadPipe, // address of variable for read handle

PHANDLE hWritePipe, // address of variable for write handle

LPSECURITY_ATTRIBUTES lpPipeAttributes, // pointer to security attributes

DWORD nSize // number of bytes reserved for pipe

);

當(dāng)管道建立后,結(jié)構(gòu)中指向的 hReadPipe 和 hWritePipe 可用來讀寫管道,當(dāng)然由于匿名管道是單向的,你只能使用其中的一個(gè)句柄,參數(shù)中的 SECURITY_ATTRIBUTES 的結(jié)構(gòu)必須填寫,定義如下:

typedef struct_SECURITY_ATTRIBUTES{

DWORD nLength: //定義以字節(jié)為單位的此結(jié)構(gòu)的長度

LPVOID lpSecurityDescriptor; //指向控制這個(gè)對象共享的安全描述符,如果為NULL這個(gè)對象將被分配一個(gè)缺省的安全描述

BOOL bInheritHandle; //當(dāng)一個(gè)新過程被創(chuàng)建時(shí),定義其返回是否是繼承的.供系統(tǒng)API函數(shù)使用.

}SECURITY_ATTRIBUTES;

2. 填寫創(chuàng)建子進(jìn)程用的 STARTUPINFO 結(jié)構(gòu),一般我們可以先用 GetStartupInfo 來填寫一個(gè)缺省的結(jié)構(gòu),然后改動(dòng)我們用得到的地方,它們是:

hStdInput -- 用其中一個(gè)管道的 hWritePipe 代替 hStdOutput、hStdError -- 用另一個(gè)管道的 hReadPipe 代替 dwFlags -- 設(shè)置為 STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW 表示輸入輸出句柄及 wShowWindow 字段有效 wShowWindow -- 設(shè)置為 SW_HIDE,這樣子進(jìn)程執(zhí)行時(shí)不顯示窗口。 填寫好以后,就可以用 CreateProcess 來執(zhí)行子進(jìn)程了,具體有關(guān)執(zhí)行子進(jìn)程的操作可以參考上一篇教程《進(jìn)程控制》

3. 在程序中可以用 PeekNamedPipe 查詢子進(jìn)程有沒有輸出,原形如下:

BOOL PeekNamedPipe(

HANDLE hNamedPipe, // handle to pipe to copy from

LPVOID lpBuffer, // pointer to data buffer

DWORD nBufferSize, // size, in bytes, of data buffer

LPDWORD lpBytesRead, // pointer to number of bytes read

LPDWORD lpTotalBytesAvail, // pointer to total number of bytes available

LPDWORD lpBytesLeftThisMessage // pointer to unread bytes in this message

);

我們可以將嘗試讀取 nBuffersize 大小的數(shù)據(jù),然后可以通過返回的 BytesRead 得到管道中有多少數(shù)據(jù),如果不等于零,則表示有數(shù)據(jù)可以讀取。

4. 用 ReadFile 和 WriteFile 來讀寫管道,它們的參數(shù)是完全一樣的,原形如下:

ReadFile or WriteFile(

HANDLE hFile, // handle of file to read 在這里使用管道句柄

LPVOID lpBuffer, // address of buffer that receives data 緩沖區(qū)地址

DWORD nNumberOfBytesToRead, // number of bytes to read 準(zhǔn)備讀寫的字節(jié)數(shù)

LPDWORD lpNumberOfBytesRead, // address of number of bytes read,實(shí)際讀到的或?qū)懭氲淖止?jié)數(shù)

LPOVERLAPPED lpOverlapped // address of structure for data 在這里用 NULL

);

5. 用 CloseHandle 關(guān)閉管道一和管道二的 hReadPipe和 hWritePipe 這四個(gè)句柄。

下面給出了一個(gè)例子程序,這個(gè)程序是上篇教程《進(jìn)程控制》的例子的擴(kuò)充,如果你對有的 api 感到陌生的話,請先閱讀上一篇教程。

命名管道相關(guān)推薦
  • 相關(guān)百科
  • 相關(guān)知識
  • 相關(guān)專欄

最新詞條

安徽省政采項(xiàng)目管理咨詢有限公司 數(shù)字景楓科技發(fā)展(南京)有限公司 懷化市人民政府電子政務(wù)管理辦公室 河北省高速公路京德臨時(shí)籌建處 中石化華東石油工程有限公司工程技術(shù)分公司 手持無線POS機(jī) 廣東合正采購招標(biāo)有限公司 上海城建信息科技有限公司 甘肅鑫禾國際招標(biāo)有限公司 燒結(jié)金屬材料 齒輪計(jì)量泵 廣州采陽招標(biāo)代理有限公司河源分公司 高鋁碳化硅磚 博洛尼智能科技(青島)有限公司 燒結(jié)剛玉磚 深圳市東海國際招標(biāo)有限公司 搭建香蕉育苗大棚 SF計(jì)量單位 福建省中億通招標(biāo)咨詢有限公司 泛海三江 威海鼠尾草 廣東國咨招標(biāo)有限公司 Excel 數(shù)據(jù)處理與分析應(yīng)用大全 甘肅中泰博瑞工程項(xiàng)目管理咨詢有限公司 山東創(chuàng)盈項(xiàng)目管理有限公司 當(dāng)代建筑大師 廣西北纜電纜有限公司 拆邊機(jī) 大山檳榔 上海地鐵維護(hù)保障有限公司通號分公司 甘肅中維國際招標(biāo)有限公司 舌花雛菊 華潤燃?xì)猓ㄉ虾#┯邢薰? 湖北鑫宇陽光工程咨詢有限公司 GB8163標(biāo)準(zhǔn)無縫鋼管 中國石油煉化工程建設(shè)項(xiàng)目部 韶關(guān)市優(yōu)采招標(biāo)代理有限公司 莎草目 建設(shè)部關(guān)于開展城市規(guī)劃動(dòng)態(tài)監(jiān)測工作的通知 電梯平層準(zhǔn)確度 廣州利好來電氣有限公司 蘇州弘創(chuàng)招投標(biāo)代理有限公司