lpSecurityAttributes
的CreateNamedPipe()
指向的结构? 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/