簡體   English   中英

關於使用CreateFile在Windows中打開管道:

[英]About using CreateFile to open a pipe in windows:

在這里引用:

hPipe = CreateFile( 
         lpszPipename,   // pipe name 
         GENERIC_READ |  // read and write access 
         GENERIC_WRITE, 
         0,              // no sharing 
         NULL,           // default security attributes
         OPEN_EXISTING,  // opens existing pipe 
         0,              // default attributes 
         NULL);  

上面的代碼如何確保它實際上打開了管道而不是現有的硬盤文件?

順便說一句,我如何打開一個持久管道,以便可以多次使用?

管道名稱必須以\\\\.\\pipe\\開頭(或更\\\\servername\\pipe\\ )。 硬盤上的文件永遠不會帶有該前綴,因此您只需要確保名稱具有該前綴即可。 另外,您可以使用CallNamedPipe ,如果傳遞的名稱不是命名管道,則它會失敗(我很確定)。

我不確定您要問的第二個問題是什么-您可以通過管道發送任意數量的消息/盡可能多的數據。 如果要在服務器上打開可由多個客戶端使用的單個命名管道,則調用CreateNamedPipe時的最后一個參數指定允許的最大並發實例數(實質上是客戶端)。

它打開管道的方式是文件名中的前綴。 它必須是\\\\\\\\.\\\\pipe\\\\pipename ,這不是合法的文件名(對於實際文件,通常會以相對路徑或驅動器號,冒號和斜杠開頭,但極少數情況除外)使用設備ID等打開的情況)。 鑒於無法打開文件,因此必須打開管道。

要打開一個持久管道,我不確定是要一次在多個應用程序中使用它(如果這樣,您可以從每個應用程序中打開它,但要注意不要阻塞它)還是使其在會話之間持久化。 如果不是后者,我不確定,但是我從未聽說過在沒有程序打開時保持管道打開的方法(我想在某種程度上類似於保持文件打開)。 這是可能的 ,只要你不CloseHandle ,它會繼續開放,直到下次重新啟動。 至少值得測試。

但是,如果需要在應用程序或會話之間進行持久的數據傳輸,則可能希望找到一種更可靠(更靈活)的方法。 如果發生意外情況(當多個線程/進程一起工作時總是應該期望的),管道很容易被阻塞,這可能會凍結一個或兩個連接的應用程序(通常甚至很難在調試器中殺死它們)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM