关于使用CreateFile在Windows中打开管道:

时间:2010-08-19 04:52:30

标签: c++ windows pipe

引用here

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

上述代码如何确保它实际打开管道而不是现有的硬盘文件?

顺便说一句,如何打开持久管道以便多次使用?

2 个答案:

答案 0 :(得分:4)

管道名称必须以\\.\pipe\开头(或更一般地,\\servername\pipe\)。硬盘驱动器上的文件永远不会有该前缀,因此您只需要确保该名称具有该前缀。或者,您可以使用CallNamedPipe,如果传递的名称不是命名管道,那么(我很确定)会失败。

我不确定您的第二个问题是什么意思 - 您可以根据需要通过管道发送尽可能多的消息/数据。如果您打算在服务器上打开一个可供多个客户端使用的命名管道,则在调用CreateNamedPipe时,最后一个参数指定允许的最大并发实例数(客户端)。

答案 1 :(得分:4)

它打开管道的方式是文件名中的前缀。它必须是\\\\.\\pipe\\pipename,这不是合法的文件名(对于实际文件,您通常以相对路径或驱动器号,冒号和斜线开头,除非在极少数情况下使用设备打开ID或某些此类)。看到它无法打开文件,它必须打开一个管道。

要打开持久性管道,我不确定您是否要同时从多个应用程序中使用它(如果是这样,您可以从每个应用程序中打开它,但要注意不要阻止它)或者让它在两者之间保持不变会话。如果是后者,我不完全确定,但是我从来没有听说过没有程序打开时保持管道打开的方法(在某种程度上类似于保持文件打开,我猜)。 可能,只要你没有CloseHandle,它就会保持打开状态直到下次重启。值得测试,至少。

如果您需要在应用程序或会话之间进行持久数据传输,您可能希望找到更可靠(更灵活)的方法。如果出现意外情况(在多个线程/进程协同工作时应始终预期),管道很容易被阻塞,这可能会冻结一个或两个连接的应用程序(通常甚至在调试器中甚至杀死它们的程度很困难)。