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

引用:

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道而不是现有的硬盘文件?

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

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

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

打开管道的方式是文件名中的前缀。 它必须是\\\\.\\pipe\\pipename ,它不是一个合法的文件名(对于一个实际的文件,你通常会以一个相对路径或一个驱动器号,冒号和斜杠开始,打开使用设备ID等的情况)。 鉴于它不能打开一个文件,它必须打开一个管道。

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

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