终止流程

【勇芳软件工作室】汉化HomePreviousNext

一个进程执行,直到发生以下事件之一:

*进程的任何线程调用ExitProcess函数。这将终止进程的所有线程。

*进程的主线程返回。主线程可以通过在返回之前明确调用ExitThread来避免终止其他线程。其余一个线程仍然可以调用ExitProcess来确保所有线程都被终止。

*进程的最后一个线程终止。

*任何线程使用处理的句柄调用TerminateProcess函数。这将终止进程的所有线程,而不允许它们清理或保存数据。

*对于控制台进程,当控制台收到CTRL + C或CTRL + BREAK信号时,默认处理函数调用ExitProcess.连接到控制台的所有控制台进程都会收到这些信号。分离的进程和GUI进程不受CTRL + C或CTRL + BREAK信号的影响。有关详细信息,请参阅SetConsoleCtrlHandler.

*用户关闭系统或注销。使用SetProcessShutdownParameters函数来指定关闭参数,例如当进程应该相对于系统中的其他进程终止时。GetProcessShutdownParameters函数检索进程的当前关闭优先级和其他关闭标志。

当进程终止时,进程的所有线程都立即终止,没有机会运行其他代码。这意味着该过程不会在终止处理程序块中执行代码。有关详细信息,请参阅结构化异常处理.

GetExitCodeProcess函数返回进程的终止状态。当进程正在执行时,其终止状态为STILL_ACTIVE。当进程终止时,其终止状态从STILL_ACTIVE更改为进程的退出代码。退出代码是调用ExitProcessTerminateProcess中指定的值或由进程的main或WinMain函数返回的值。如果进程由于致命异常终止,则退出代码是导致终止的异常的值。此外,该值用作发生异常时正在执行的所有线程的退出代码。

当进程终止时,进程对象的状态变为信号,释放一直等待进程终止的任何线程。有关同步的更多信息,请参阅同步执行多个线程.

当进程终止时,打开文件或其他资源的句柄会自动关闭。但是,对象本身存在,直到它们的所有打开的句柄都关闭。这意味着一个对象在进程关闭后保持有效,如果另一个进程有一个句柄。

如果进程由ExitProcess终止,系统将调用每个附加的DLL的入口点函数,其值指示进程正在从DLL中分离。流程终止时TerminateProcess不会通知DLL。有关DLL的更多信息,请参阅动态链接库.

警告 TerminateProcess函数只能在极端情况下使用,因为它不允许线程清理或保存数据,并且不通知附加的DLL。如果您需要一个进程终止另一个进程,则以下步骤提供更好的解决方案:

*这两个进程都调用RegisterWindowMessage函数来创建私人消息。

*一个进程可以通过使用BroadcastSystemMessage功能广播私人消息来终止其他进程,如下所示:

BroadcastSystemMessage(

BSF_IGNORECURRENTTASK, //不要向此过程发送消息

BSM_APPLICATIONS, //只播放给应用程序

【私人信息,】 //上一步中注册的消息

wParam, //消息特定值

lParam ); //消息特定值

*接收私人消息呼叫ExitProcess以终止其执行的过程。

注意当系统终止进程时,它不会终止进程已创建的任何子进程。