Windows内核之进程的终止和子进程

时间:2014-05-26 03:42:59   收藏:0   阅读:352

1 进程终止的方法:

<1>主线程的进入点函数返回(最好使用这个方法)

<2>进程中的一个线程调用ExitProcesss函数(应该避免使用这种方法)。 

<3>另一个进程中的线程调用TerminateProcess函数(应该避免使用这种方法)。 

<4>进程中的所有线程自行终止运行(这种情况几乎从未发生)。 

 

1.1  主线程进入点函数返回

       始终都应该这样来设计应用程序,即只有当主线程的进入点函数返回时,它的进程才终止运行。这是保证所有线程资源能够得到正确清除的唯一办法。

<1>  C++对象将能够使用它们的析构函数得以释放

<2> 操作系统能够正确的释放该线程使用的堆栈内存

<3> 系统将进程的退出代码设置为进入点函数的返回值

<4> 系统将内核对象的计数值减去1

1.2 调用ExitProcess函数

         voidExitProcess(uExitCode)

跟主线程的进入点函数返回相比,它就不那么安全,不能保证资源被清理。

通过调用ExitProcess函数,C++/C运行期启动代码能够确保主线程从它的进入点函数返回时,进程便终止运行,而不管进程中是否还有其他线程在运行。

         如果在进入点函数中调用ExitThread,那么主线程就会停止运行,但是如果进程中如果还有其他线程的话,进程便不会终止。

         ExitProcess以及ExitThread能保证操作系统资源在函数调用时被清除,但是不能保证C/C++运行时资源被正确的清除,所以最好还是不要调用这些资源。

         在前面也介绍过当主线程的进入点函数返回的时候,C/C++运行时会调用运行时的exit函数,exit函数会完成下面操作

<1>调用_onexit函数的调用而注册的人任何函数

<2>为所有的全局和静态的C++对象调用析构函数

<3>调用系统的ExitProcess函数,将nMainRetVal传递给它。使得操作系统能够撤销进程并设置它的exit代码。

1.3 调用TerminateProcess 函数

    BOOL TerminateProcess(HANDLE hProcess,UINTnExitCode)

这个函数通知进程内所有线程终止,当所有线程终止时,进程也会终止了,但是它不会告诉进程内相关联的DLL这个进程将要被终止。它做的事情:

<1>所有打开的句柄被关闭

<2>所有的线程会被终止

<3>进程对象的状态变为终止的,满足所有等待进程结束的线程

<4>进程中所有线程对象的状态变为终止,满足所有等待线程结束的线程

<5>进程的终止状态由STILL_ACTIVE变为了进程的返回代码

    这个函数是异步的,它告诉操作系统,你要终止某个进程,但是当函数返回的时候,你无法保证进程是否已经被杀死,如果想要确切知道进程是否被杀死,可以使用WaitForSingleObject函数。

 

2   进程终止时的情况

<1>进程中所有剩余线程将被终止

<2>进程中指定的用户对象,GDI对象被释放,内核对象被关闭

<3>内核对象的状态编程收到通知的状态

<4>进程的退出代码由STILL_ACTIVE 变为ExitProcess或者TerminateProcess传递的的退出代码

<5>进程内核对象计数减去1

可以通过函数 BOOLGetExitCodeProcess(HANDLE handle,LPDWORD lpExitCode)来查找进程的退出代码,如果代码是STILL_ACTIVE表示的是进程还没终止,如果不是这个,就说明进程已经被终止。

 

3   子进程

    程序中要实现一段功能一共有3种方法:

<1>调用函数

<2>开辟新线程

<3>开辟新进程

3.1 调用函数

         调用函数时非常常见的,但是它的缺点是因为在同一个线程中,所以必须等待此函数执行完毕,才能执行后面的代码

3.2 开辟新线程

         这样能够在新线程执行的时候,同时执行其他线程的代码,但是这样的缺点是不同线程之间需要交流数据时候,会产生同步的问题。

3.3 开辟子进程

         这样有点是既可以保护数据,可以同步执行,也可以等待新进程执行完毕再去执行其他进程的代码。缺点是开辟新进程,会造成地址空间的浪费。

Windows内核之进程的终止和子进程,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!