2010-08-19 117 views
1

引用here关于使用的CreateFile在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); 

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

顺便说一句,我怎样才能打开一个持久管道,以便可以多次使用?

回答

4

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

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

4

它打开管道的方式是文件名中的前缀。它必须是\\\\.\\pipe\\pipename,这不是合法的文件名(对于实际文件,通常以相对路径或驱动器盘符,冒号和斜杠开头,但在极少数情况下打开使用设备ID或类似)。由于无法打开文件,因此必须打开管道。

要打开持久性管道,我不确定是否要一次使用多个应用程序(如果是这样,可以从每个应用程序打开它,但要小心不要阻止它)或使其保持不变会议之间。如果是后者,我并不完全确定,但是我从来没有听说过有一种方法可以在没有程序打开的情况下保持打开状态(在某些方面类似于保持文件打开,我假设)。这是可能,只要你不CloseHandle它,它将保持开放,直到下一次重新启动。值得测试,至少。

但是,如果您需要在应用程序或会话之间进行持久数据传输,则可能需要查找更可靠(更灵活)的方法。如果发生意外事件(当多个线程/进程一起工作时总是应该预料到的),管道可以很容易地被阻塞,这可以冻结一个或两个连接的应用程序(通常甚至在调试器中很难将它们杀死)。