【问题标题】:About using CreateFile to open a pipe in windows:关于使用 CreateFile 在 windows 中打开管道:
【发布时间】:2010-08-19 04:52:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ windows pipe


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      要打开一个持久性管道,我不确定您是要同时从多个应用程序中使用它(如果是,您可以从每个应用程序中打开它,但注意不要阻塞它)还是让它在会议。如果是后者,我不完全确定,但我从未听说过在没有程序打开管道时保持管道打开的方法(在某些方面类似于保持文件打开,我想)。 可能只要您不CloseHandle 它,它就会一直保持打开状态,直到下次重新启动。至少值得测试。

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

      【讨论】:

        猜你喜欢
        • 2019-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-09
        相关资源
        最近更新 更多