• 我要多久才能破坏传递给lpSecurityAttributesCreateNamedPipe()指向的结构?
  • 每个管道实例是否需要一个单独的管道?

  • CreateNamedPipe()的MSDN文档说:



    强调我的。 “new”是指新的命名管道还是命名管道的新实例?它继续说:



    (再次强调,我的意思。)这可以理解为lpSecurityAttributes仅在创建命名管道的第一个实例(新命名管道)时使用,而在创建同一命名管道的其他实例时将被忽略。如果是这样,则仅需要lpSecurityAttributes结构的一个实例。

    或者,也许您必须为每个实例传递一个有效的lpSecurityAttributes,但是它可以(应该吗?)是相同的吗?

    还是您必须为每个管道实例分配一个新的SECURITY_ATTRIBUTES结构?

    我的相关问题-对CreateNamedPipe()的调用返回后,是否可以立即销毁SECURITY_ATTRIBUTES结构,还是必须保持有效,直到关闭最后一个句柄(至管道或仅那个管道实例?)为止-甚至没有解决。

    有人对这两个问题有明确的答案吗?

    最佳答案

    您需要将有效的SECURITY_ATTRIBUTES结构或NULL传递给对CreateNamedPipe的每次调用。您可以将同一结构重用于其他调用,也可以使用单独的结构,以较方便的为准。在来自不同线程的多个同时调用中使用相同结构可能并不安全-我怀疑这样做是可以的,但是无论如何我都会避免使用它。

    "new"表示“新管道”而不是“新实例”。如果命名管道已经存在,则不使用lpSecurityDescriptor成员中的ACL。因此,如果您知道要创建现有管道的新实例,并且不需要设置bInheritHandle,则只需为lpSecurityAttributes传递NULL。如果确实需要设置bInheritHandle,请确保lpSecurityDescriptor为NULL或指向有效的安全描述符。

    如前所述,可以在调用返回时立即丢弃lpSecurityAttributes中的内容(除非您打算在另一个调用中重用它!),是的,其中包括分配给安全描述符的内存。

    关于windows - CreateNamedPipe()中的lpSecurityAttributes需要什么生存期?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7964896/

    10-10 01:01