5
  1. 我多久可以破坏lpSecurityAttributes传递给指向的结构CreateNamedPipe()
  2. 每个管道实例都需要一个单独的实例吗?

CreateNamedPipe()的 MSDN 文档说:

lpSecurityAttributes [输入,可选]

指向 SECURITY_ATTRIBUTES 结构的指针,该结构指定命名管道的安全描述符...

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

评论

要使用 CreateNamedPipe 创建命名管道的实例,用户必须具有对命名管道对象的 FILE_CREATE_PIPE_INSTANCE 访问权限。如果正在创建新的命名管道,则安全属性参数中的访问控制列表 (ACL) 定义命名管道的自主访问控制。

(再次强调我的。)人们可以将此理解为lpSecurityAttributes仅在创建命名管道的第一个实例(命名管道)时使用的含义,并且在创建相同命名管道的进一步实例时被忽略。如果是这样,则只lpSecurityAttributes需要该结构的一个实例。

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

或者您可能必须为每个管道实例分配一个新的 SECURITY_ATTRIBUTES 结构?

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

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

4

2 回答 2

4

您需要将有效的 SECURITY_ATTRIBUTES 结构或 NULL 传递给对 CreateNamedPipe 的每次调用。您可以将相同的结构重用于其他调用,也可以使用单独的结构,以更方便者为准。在来自不同线程的多个同时调用中使用相同的结构可能不安全 - 我怀疑它会没问题,但我还是会避免它。

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

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

于 2011-11-01T20:03:13.540 回答
2

调用完成时复制结构。这适用于创建内核对象时的所有安全描述符调用。

因此:通话后您可以丢弃它的内容。

于 2011-11-01T10:41:23.830 回答