4-进程
2016-03-09 20:30
211 查看
1. 可以用CreateProcess函数创建一个进程
2. 终止进程的运行:
若要终止进程的运行,可以使用下面四种方法:
1). 主线程的进入点函数返回(最好使用这个方法) 。
始终都应该这样来设计应用程序,即只有当主线程的进入点函数返回时,它的进程才终止运行。这是保证所有线程资源能够得到正确清除的唯一办法。让主线程的进入点函数返回,可以确保下列操作的实现:
a. 该线程创建的任何C + +对象将能使用它们的析构函数正确地撤消。
b. 操作系统将能正确地释放该线程的堆栈使用的内存。
c. 系统将进程的退出代码(在进程的内核对象中维护)设置为进入点函数的返回值。
d. 系统将进程内核对象的返回值递减1。
2). 进程中的一个线程调用E x i t P r o c e s s函数(应该避免使用这种方法) 。
3). 另一个进程中的线程调用Te r m i n a t e P r o c e s s函数(应该避免使用这种方法) 。
该函数与E x i t P r o c e s s有一个很大的差别,那就是任何线程都可以调用 Te r m i n a t e P r o c e s s来终止另一个进程或它自己的进程的运行。
4). 进程中的所有线程自行终止运行(这种情况几乎从未发生) 。
3. 如果进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和 G D I对象均被撤消。一旦进程终止运行(无论采用何种方法) ,系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。希望这是很清楚的。
(我觉得这段话可以理解为:当你有new(malloc)出新的对象,但是却没有delete(free)掉,进程“意外”的终止后,操作系统也会保证回收此进程的所有资源。不会造成所谓的内存泄漏。而实际上,内存泄漏这一概念只在进程的运行期才存在、有意义。)
4. 当进程终止运行时,下列操作将启动运行:
1) . 进程中剩余的所有线程全部终止运行。
2) . 进程指定的所有用户对象和G D I对象均被释放,所有内核对象均被关闭(如果没有其他
进程打开它们的句柄,那么这些内核对象将被撤消。但是,如果其他进程打开了它们的句柄,
内核对象将不会撤消) 。
3) . 进程的退出代码将从S T I L L _ A C T I V E改为传递给E x i t P r o c e s s或Te r m i n a t e P r o c e s s的代码。
4) . 进程内核对象的状态变成收到通知的状态(关于传送通知的详细说明,参见第 9章) 。系
统中的其他线程可以挂起,直到进程终止运行。
5) . 进程内核对象的使用计数递减1。
2. 终止进程的运行:
若要终止进程的运行,可以使用下面四种方法:
1). 主线程的进入点函数返回(最好使用这个方法) 。
始终都应该这样来设计应用程序,即只有当主线程的进入点函数返回时,它的进程才终止运行。这是保证所有线程资源能够得到正确清除的唯一办法。让主线程的进入点函数返回,可以确保下列操作的实现:
a. 该线程创建的任何C + +对象将能使用它们的析构函数正确地撤消。
b. 操作系统将能正确地释放该线程的堆栈使用的内存。
c. 系统将进程的退出代码(在进程的内核对象中维护)设置为进入点函数的返回值。
d. 系统将进程内核对象的返回值递减1。
2). 进程中的一个线程调用E x i t P r o c e s s函数(应该避免使用这种方法) 。
3). 另一个进程中的线程调用Te r m i n a t e P r o c e s s函数(应该避免使用这种方法) 。
该函数与E x i t P r o c e s s有一个很大的差别,那就是任何线程都可以调用 Te r m i n a t e P r o c e s s来终止另一个进程或它自己的进程的运行。
4). 进程中的所有线程自行终止运行(这种情况几乎从未发生) 。
3. 如果进程确实没有机会执行自己的清除操作,但是操作系统可以在进程之后进行全面的清除,使得所有操作系统资源都不会保留下来。这意味着进程使用的所有内存均被释放,所有打开的文件全部关闭,所有内核对象的使用计数均被递减,同时所有的用户对象和 G D I对象均被撤消。一旦进程终止运行(无论采用何种方法) ,系统将确保该进程不会将它的任何部分遗留下来。绝对没有办法知道该进程是否曾经运行过。进程一旦终止运行,它绝对不会留下任何蛛丝马迹。希望这是很清楚的。
(我觉得这段话可以理解为:当你有new(malloc)出新的对象,但是却没有delete(free)掉,进程“意外”的终止后,操作系统也会保证回收此进程的所有资源。不会造成所谓的内存泄漏。而实际上,内存泄漏这一概念只在进程的运行期才存在、有意义。)
4. 当进程终止运行时,下列操作将启动运行:
1) . 进程中剩余的所有线程全部终止运行。
2) . 进程指定的所有用户对象和G D I对象均被释放,所有内核对象均被关闭(如果没有其他
进程打开它们的句柄,那么这些内核对象将被撤消。但是,如果其他进程打开了它们的句柄,
内核对象将不会撤消) 。
3) . 进程的退出代码将从S T I L L _ A C T I V E改为传递给E x i t P r o c e s s或Te r m i n a t e P r o c e s s的代码。
4) . 进程内核对象的状态变成收到通知的状态(关于传送通知的详细说明,参见第 9章) 。系
统中的其他线程可以挂起,直到进程终止运行。
5) . 进程内核对象的使用计数递减1。
相关文章推荐
- C++对象作为函数参数 http://blog.csdn.net/tms_li/article/details/7765626
- C++: 16.03.04实验课总结
- Android新手入门2016(4)--Android SDK下载代理设置
- Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
- 动画相关
- 学习——分组交换网的性能指标认识
- OnePlus安装Kali-NetHunter
- HDU 1272 小希的迷宫 [并查集+回路判定]
- BZOJ3781小B的询问
- Hadoop2.6完全分布式多节点集群安装配置
- kafka学习教程
- 【计算机视觉】TPAMI的Editors
- C++愤恨者札记1——类对象作为函数参数的数据传递过程 http://blog.csdn.net/tms_li/article/details/7765626
- Java中的序列化Serialable高级详解
- git总结 -- 远程仓库篇
- 古代赌局
- 20160309 SOHU实习面试
- POJ-3187(Backward Digit Sums)(全排列+dfs())
- 自动复制文本到剪贴版(Auto Copy to clipboard)
- 一个iOS开发者的修真之路