![]() |
1
11
简短回答不,SOCKET不应标记为可继承。当安装了某些分层服务提供商(LSP)时,继承的句柄根本无法在子级中使用。 作为额外的刺激,请参阅相关问题 "Can TCP SOCKETS be marked non-inheritable?" 。简单地说,你不能依赖于能够继承套接字,但也不能阻止套接字被继承! 解释遗憾的是,这与微软自己的一些例子和文档(例如 KB150523 )。简单地说,分层服务提供商是微软为第三方软件提供的一种方式,它可以在您的应用程序和微软的WinSock DLL中的TCP/UDP堆栈之间插入自己。由于某些LSP的工作方式,它们使得很难在进程之间传输套接字,因为LSP将一些本地信息与它需要存在的每个套接字相关联。
LSP只能挂接到WinSock函数中;例如,调用
类似地,试图将SOCKET句柄设置为可继承的将在不通知LSP的情况下复制该句柄,结果相同:Winsock可能无法在子进程中识别重复的句柄。典型的错误是WSAENOTSOCK(10038,“非套接字上的套接字操作”),甚至ERROR_INVALID_HANDLE(6,“句柄无效”)。 实例假设您想编写一个Windows程序,该程序使用重定向的stdin和stdout启动子级,向其发送一些数据,在子级的stdin上发出EOF信号,以便它知道如何处理数据,然后等待子级返回。 让我们进一步假设,执行了一些富有想象力的启动形式,这意味着你这个孩子可能根本不是孩子(例如,gksu/runas启动一个必须立即退出的包装器,只剩下与客户端的套接字连接)。因此,您没有要等待的孩子的PID。 行为将类似于此:
变通办法
在没有分层服务提供程序的机器上,创建一对连接的TCP套接字,并在子代中继承一个作为stdin/stdout,行为确实正确。将此作为
遗憾的是,SOCKET根本无法可靠地继承。要在Windows上编写几乎具有同等功能的东西,您需要使用命名管道。打电话前
完成将数据管道传输到客户端后,调用
进一步的问题
|
|
vini · 安装wfp内核驱动程序后,devcon状态返回39 3 年前 |
![]() |
I101I · 如何镜像HBITMAP 3 年前 |
![]() |
E235 · 如何查看谁创建了Windows NamedPipe 3 年前 |
![]() |
Pizza Ãcke · 创建带有内存映像的Windows托盘图标 3 年前 |
![]() |
Jabu · 如何获取列表框滚动条“拇指”的高度? 3 年前 |
![]() |
tree1234 · 对可执行文件进行代码设计,并允许修改某些字节 3 年前 |
![]() |
Penachia · PDF FontDescriptor标志 7 年前 |