Windows via C/C++: 子进程

当你编写程序时,可能想让一段代码独立运行,比如调用函数或子例程,此时调用者必须等待函数或子例程返回,在大多数情况下,我们需要这种单任务的同步。另一种可选的方法将这段独立作业封装到新的线程中执行,此时我们就可以获得多任务的特性 ,这项技术非常有用,但是当你要获得新线程的执行结果时会引发同步问题。

另一种方法是创建一个子进程完成任务。当任务比较复杂时,如果使用多线程,可能会不小心破坏进程空间的数据,此时需要良 好的同步机制确保数据完整性。使用子进程则完全不用担心这种情况,不同进程的地址空间是相互独立的。然而,有些情况子进程需要读 写父进程地址空间的数据,Windows提供了几种进程间通信的方法:动态数据交换(Dynamic Data Exchange-DDE)、OLE、管道、 邮件槽等等,其中最常见的方式是内存映射文件,我们会在第十七章讨论内存映射。

创建子进程以后,如果你需要等待它的执行结果,可以使用类似下面的代码:
上面的代码中,我们使用WaitForSingleObject函数等待进程执行完毕:
第九章会讲到WaitForSingleObject的详细用法,现在你只需要知道该函数会一直阻塞直到hObject定义的对象状态变为“激发” (signaled),线程/进程对象在终止时变为“激发”状态。WaitForSingleObject返回后,你可以调用GetExitCodeProcess获得其退出 码。最后的CloseHandle调用会使进程对象引用计数减1,在上面的代码中,操作系统会销毁内核对象。

你可能会注意到示例中的CreateProcess函数返回时我们就关闭了新进程主线程的句柄,这不会导致对应的线程终止,只是其主线 程内核对象的引用计数减1。这样做的好处在于操作系统可以在适当的时候销毁该对象,否则除非进程终止,子进程主线程对象引用计数数永远不会清0,这样操作系统也无法回收其占用的内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值