[英]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.