随笔 - 64, 文章 - 11, 评论 - 12, 引用 - 0
数据加载中……

进程初探之<3> 进程死亡

      人这一生都会经过出生、生长、死亡这几个阶段,出生就意味着必须面对死亡。故佛学经典中常有空即是色、色即是空,生就是死、死就是生这些深奥的佛义。纵观这世间的一切又何尝不是这样。海龟可以说是长寿的动物了,经常可以看到报说某只海龟活了几千年,但地球自从诞生生物以来又何止几千年了。在前面,进程已经被启动起来了,也已经在跑了,现在还有一个过程它也是必须经历的了那就是死亡了。本人觉得写这个进程死亡这个题目有点沉重,人总是希望听到生长有关的,而不愿听到诸如一些灰色的词语。至少对于我来说是这样的了,本想起标题为进程的退出,或者进程的隐藏但觉总不得体。退出含有一种自愿性的离开之意,但有时的情况却往往不会是这样的,比如我们通过任务管理器来终止一个应用程序,这时我想它就是非自愿的动作了。还有一促极端的情况,电脑掉电了。隐藏这个词语就有更不贴切的地方,还有隐藏这个词对进程来说是它确实存在的一种状态,这将更为复杂。故起名为进程死亡一题,前也说过死亡有正常死亡,寿终正寝、及意外死亡这两种。
      正常死亡,寿终正寝指的是进程完成了它的工作,它走到了它生命的尽头。于是穿过一个花括号,好似穿过一片淡薄的白云而登仙乐。
如下的一个简单的例子。
#include <iostream.h>

int main()
{
    
int i=2;
    
if(2==i)
    
{
        i
++;
    }

    
return i;
}
上面这个例子就会在执行完return i;之后的"{"寿终正寝。没有执行完这个花括号就不能算作寿终正寝。比如说这时有一个高优先级的线程取得了CPU的使用权,并用将这个进程杀死掉。
      进程的意外死亡可以有自己来操纵也可以是外部使力而使它突然终止。进程要杀死自己很简单,只要调用ExitProcess就行了。这个函数功能是很强,以致有些霸道。会使进程来不及释放有关的资源比如用new操作符申请的一段内存,调用了第三组件而不能再去为第三方的组件执行一个Release 这样的通知。这样引起的问题似乎相当不妙。幸好这个进程的内核对象会随着它的死亡而减少引用计数或者被收回。所以使用这个函数时还是三思而行,应尽量避免。那么外部的一个线程又该如何终止进程呢?这得用TerminateProcess这个函数了,想说的是这个函数象前面的函数一样也是立即终止一个进程,而不会给被终止的进程留一口气。上述这两种方法用起来还是三思为好。对于有窗口的应用程序有更漂亮的方法来让它退出,找到这个进程的窗口,然后对着这个窗口发一个退出的消息。这样就比较文明了,因为有机会给程序做一些善后的工作。如下的程序就可以终止你已经开启的计算器程序。
#include "stdafx.h"
#include 
<windows.h>
#include 
<iostream.h>

int main(int argc, char* argv[])
{
    DWORD dwCurrentId,dwControlId;
    dwCurrentId
=GetCurrentProcessId();
    cout
<<"Current process Id: "<<dwCurrentId<<endl;
    HWND hwnd
=FindWindow("SciCalc",NULL);    
    GetWindowThreadProcessId(hwnd,
&dwControlId);
    HANDLE controlHandle
=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwControlId);
    cout
<<"Calc Process Id :"<<dwControlId<<endl;
    
//PostMessage(hwnd,WM_QUIT,0,0);
    TerminateProcess(controlHandle,0);
    
return 0;
}

我注释掉的post方法就是文明终止进程的例子。

      当我玩游戏过了通关时,只能自豪地看着我操控的角色穿着金色的战衣,神采飞扬地面对着东方徐徐升起的太阳几分钟。而后机器又恢复到了启动的状态,这一切也就过去了。我也得赶快返回学校去上晚自习。但是这里的并不是我玩游戏的所有乐趣,真的乐趣还是在战斗的过程中。进程的吸引人也不会只这么一点,还有更精采的将要上演........。

posted on 2008-03-22 16:05 Robertxiao 阅读(356) 评论(0)  编辑 收藏 引用 所属分类: Windows/MFC探索


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理