2.1.3 进程的终止

进程在创建之后,它开始运行,完成其工作。但永恒是不存在的,进程也一样。迟早这个新的进程会终止,通常由下列条件引起:

1)正常退出(自愿的)。

2)出错退出(自愿的)。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

3)严重错误(非自愿)。

4)被其他进程杀死(非自愿)。

多数进程是由于完成了它们的工作而终止。当编译器完成了所给定程序的编译之后,编译器执行一个系统调用,通知操作系统它的工作已经完成。在UNIX中该调用是exit,而在Windows中,相关的调用是ExitProcess。面向屏幕的程序也支持自愿终止。字处理软件、Internet浏览器和类似的程序中总有一个供用户点击的图标或菜单项,用来通知进程删除它所打开的任何临时文件,然后终止。

进程终止的第二个原因是进程发现了严重错误。例如,如果用户键入命令


cc foo.c


要编译程序foo.c,但是该文件并不存在,于是编译器就会退出。在给出了错误参数时,面向屏幕的交互式进程通常并不退出。相反,这些程序会弹出一个对话框,并要求用户再试一次。

进程终止的第三个原因是由进程引起的错误,通常是由于程序中的错误所致。例如,执行了一条非法指令、引用不存在的内存,或除数是零等。有些系统中(如UNIX),进程可以通知操作系统,它希望自行处理某些类型的错误,在这类错误中,进程会收到信号(被中断),而不是在这类错误出现时终止。

第四种终止进程的原因是,某个进程执行一个系统调用通知操作系统杀死某个其他进程。在UNIX中,这个系统调用是kill。在Win32中对应的函数是TerminateProcess。在这两种情形中,“杀手”都必须获得确定的授权以便进行动作。在有些系统中,当一个进程终止时,不论是自愿的还是其他原因,由该进程所创建的所有进程也一律立即被杀死。不过,UNIX和Windows都不是这种工作方式。