【发布时间】:2017-04-12 05:01:56
【问题描述】:
我的进程(服务器)通过CreateProcess 创建了一个子进程(客户端),我正在这些进程之间进行 IPC。我从匿名管道开始,但很快我发现它不支持重叠操作,正如here 所解释的那样。
所以,命名管道是我的第二选择。我的困惑是:如果我创建了一个命名管道,是否可以将此管道的访问权限限制为仅访问由先前调用 CreateProcess 创建的子进程?因此,即使另一个进程获得了管道的名称,它仍然无法读取或写入管道。
我的 IPC 使用仅限于本地机器和单一平台 (Windows)。
顺便说一句,我可以更改这些进程的两个代码。
【问题讨论】:
-
调用
CreateNamedPipe时,将指向SECURITY_ATTRIBUTES结构的指针作为最后一个参数传递。这允许您完全根据需要限制访问。通过查看CreateNamedPipe的文档很容易弄清楚这一点:lpSecurityAttributes参数的功能与CreatePipe的功能相同... -
异步(重叠)操作当然完全由匿名管道支持。是否支持异步操作 - 仅取决于调用 ZwCreateNamedPipeFile 和 ZwOpenFile 中使用的 FILE_SYNCHRONOUS_IO_[NO]NALERT,但不取决于哪个名称(或空)具有管道。 CreatePipe 使用
FILE_SYNCHRONOUS_IO_NONALERT选项创建管道对 - 仅因为此 api 返回的此句柄不能用于异步操作。不幸的是 CreatePipe 没有参数来改变这种行为,但我们可以自己做这个任务 -
@CodyGray - 当然我们可以设置一些非默认的安全描述符,但是任何 SD 都不能限制只有子进程的访问。拥有
SE_TAKE_OWNERSHIP_PRIVILEGE的人也可以更改管道上的 SD。从另一面来看存在意义,所以担心只有子进程可以访问管道
标签: windows ipc named-pipes nonblocking