(C) Windows 句柄和 Createprocess

Posted

技术标签:

【中文标题】(C) Windows 句柄和 Createprocess【英文标题】:(C) Windows Handles and Createprocess 【发布时间】:2013-09-11 20:51:37 【问题描述】:

我一直在尝试掌握句柄继承的概念,与 unix 相比,Windows 上共享应用程序内存。

由于 windows 不提供 fork() 或任何类似的东西,我一直在阅读 createprocess 和句柄。

我仍然无法理解新进程如何读取从他们的父母那里传递给他们的句柄。我查看了 msdn 文档,似乎 ReadFile 是这里的答案,但不知道如何阅读它。

我想要做的是客户端/服务器,服务器通过套接字传递。我正在使用 Winsock1,所以 WSAduplicate 不是一个选项。我读到套接字不能被传递,但它们可以被复制。 (http://tangentsoft.net/wskfaq/articles/passing-sockets.html)

长话短说,假设我将句柄值(例如 0x0000070)作为命令行参数传递,我如何将其转换为有效的句柄(即 Socket)。

干杯,

**更新 我知道这种方法并不理想,线程是解决这个问题的更好方法。但是我们明确要求创建子进程而不是线程。

【问题讨论】:

【参考方案1】:

根据您的应用程序的确切性质,典型的设计是在一个进程中使用多个线程。然后像socket 这样的项目可以存储在全局中或传递套接字的地址,而不必担心继承问题。

请记住,服务器通常作为单独的进程运行,服务器代码通常与客户端代码完全不同。

最后,冒着被否决的风险,fork 没有什么特别之处。实际上,创建第二个过程是一种低级方式。如果您阅读了分叉模块的代码,它只是看起来很奇怪!

【讨论】:

更新了问题 -> 我不是在寻找最好的处理方法,我必须使用 fork 和 createprocess..【参考方案2】:

继承句柄的整数值与父进程中的相同。所以你所做的就是将整数转换为句柄:

HANDLE h = (HANDLE) handle_value;

【讨论】:

以上是关于(C) Windows 句柄和 Createprocess的主要内容,如果未能解决你的问题,请参考以下文章

C Windows API - 在 UnmapViewOfFile 之前关闭文件句柄

内核对象&句柄&泄漏&检测

句柄详解

.NET对象与Windows句柄:句柄分类和.NET句柄泄露的例子

windoes任务管理器中的“句柄数”是啥意思!

文件句柄