《Linux进程管理(补充).ppt》由会员分享,可在线阅读,更多相关《Linux进程管理(补充).ppt(84页珍藏版)》请在三一办公上搜索。
1、Linux进程管理,1 进程和作业的概念2 进程控制块3 进程状态4 进程的控制5 有关进程控制系统调用,1 进程和作业的概念,Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。,什么是进程?,Linux系统上所有运行的东西都可以称之为一个进程。每个用户任务、每个系统管理守护进程,都可以称之为进程。进程的一个比较正式的定义是:在自身的虚拟地址空间运行的一个单独的程序。Linux用分时管理方法使所有的任务共同分享系统资源。我们讨论进程的时候,不会去关心这些进程究竟是如何分
2、配的,或者是内核如何管理分配时间片的,我们所关心的是如何去控制这些进程,让它们能够很好地为用户服务。,作业、作业控制的概念,进程和作业的概念也有区别,作业可以包含一个或多个进程,尤其是当使用了管道和重定向命令。例如“man ps.1|grep kill|more”这个作业就同时启动了三个进程。作业控制指的是控制正在运行的进程的行为。比如,用户可以挂起一个进程,等一会儿再继续执行该进程。shell将记录所有启动的进程情况,在每个进程过程中,用户可以任意地挂起进程或重新启动进程。作业控制是许多shell(包括bash和tcsh)的一个特性,使用户能在多个独立作业间进行切换。,一般而言,进程与作业控
3、制相关联时,才被称为作业。在大多数情况下,用户在同一时间只运行一个作业,即它们最后向shell键入的命令。但是使用作业控制,用户可以同时运行多个作业,并在需要时在这些作业间进行切换。这会有什么用途呢?例如,当用户编辑一个文本文件,并需要中止编辑做其他事情时,利用作业控制,用户可以让编辑器暂时挂起,返回shell提示符开始做其他的事情。其他事情做完以后,用户可以重新启动挂起的编辑器,返回到刚才中止的地方,就象用户从来没有离开编辑器一样。这只是一个例子,作业控制还有许多其他实际的用途。,进程的类型,Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。三种进程各有各的作用,使用场
4、合也有所不同。交互进程由一个shell启动的进程。交互进程既可以在前台运行,也可以在后台运行。批处理进程这种进程和终端没有联系,是一个进程序列。监控进程(也称守护进程daemon)Linux系统启动时启动的进程,并在后台运行。,2 进程控制块,进程组成正文段 存放进程要运行的程序,描述了进程要完成的功能用户数据段 存放正文段在执行时所需要的数据和工作区系统数据段进程控制块 存放了进程的控制信息,其中最重要的数据结构是task_struct。,进程控制块,进程控制块是Linux系统最复杂的数据结构之一。Linux在内存空间中开辟了一个专门区域存 放所有进程的进程控制块。系统初始化后,建立第一个t
5、ask_struct数据结构INIT_TASK。新进程创建时,系统从内存分配新 task_struct,占据1680个字节。,进程状态和标志,进程标识,进程控制块,进程的族亲关系,进程控制块,进程间链接信息,进程调度信息,进程控制块,进程的时间信息,进程的虚存信息,进程控制块,进程的文件信息,与进程间通信有关的信息,进程控制块,其它信息,进程控制块,3 进程状态,R:处于可运行状态;S:处于休眠状态;T:处于终止运行状态;D:设备 IO;Z:处于僵尸状态;,进程状态R 运行态,该状态实际包含了执行和就绪两种状态。进程到底是正在运行还是处于就绪状态准备运行,要靠当前是否占有CPU资源来区分。每一
6、个CPU都有一个current指针,指向当前运行于这个CPU的进程,系统就依靠这个指针来区分进程的正在运行和运行就绪状态。所有处于运行状态的进程组成可运行队列,调度程序每次选择适当的时机,按照某种规则,从这个队列中选中一个进程投入执行。这个队列中的进程总是动态变化的,在其中的进程会由于某种原因(比如等待某种事件的发生)而退出可运行队列,而其他进程也会在拥有除CPU之外的全部资源之后进入这个队列。,进程状态S 休眠态(等待态),linux系统把休眠态进一步细化为:可中断的等待态、不可中断的等待态、独占态。可中断的等待态可以被某个信息唤醒而进入就绪状态等待调度;不可中断等待状态的进程是因为硬件资源
7、无法满足,不能被信号唤醒,必须等待所等待的资源得到之后由特定的方式唤醒;独占状态位于等待队列中,当等待的事件发生时,只有处于这种状态的进程被唤醒,其他处于可中断或不可中断等待状态的进程则继续等待。,进程状态T 暂停态,处于暂停态的进程一般都是由运行状态转换而来,等待某种特殊的处理。比如处于调试跟踪的程序,每执行到一个断点,就转入暂停状态,等待新的输入信号。,进程状态Z 僵尸态,由于某种原因进程被终止,这个进程所拥有的内存、文件等资源全部释放之后,还保存着PCB信息,这种占有PCB但已无法运行的进程就处于僵尸态。一个处于执行状态的进程调用退出函数exit之后,进程就会进入僵尸状态。僵态进程的父进
8、程通过PCB了解到该进程所处的状态后,采取相应的处理措施,回收PCB,这个进程就完成了它的使命,从僵死走向彻底消亡。一直处于僵态的进程通常是由挂起或出现故障的父进程引起的。我们应尽量通过发送SIGHUP信号或其他信号确保不挂起任何父进程。如果父进程已被挂起,应尽量终止它。如果父进程在清理完子进程之前即被终止的话,init程序将成为其父进程,并将对其进行适当的处理,以便将其从进程表中清除。,进程状态D 不可中断的休眠状态,常用于设备I/O,内核程序正忙于该进程的某些I/O操作,不能被中断。唯一出现该状态的情况也许是运行NFS mount命令时出现网络故障时。,进程状态之间的转换,4 进程的控制,
9、4.1 进程的创建4.2 进程的启动4.3 进程的监视4.4 进程优先级设置4.5 进程挂起和激活4.6 信号控制进程4.7 终止进程,4.1 进程的创建,初始进程创建系统启动时创建第一个进程(0号进程),此时,系统只有这一个进程:初始化进程,运行在核心态 初始化结束时,初始进程启动一个核心进程:init进程,也称为1号进程,然后执行空闲循环。系统空闲时,调度程序运行这个空闲进程。这个空闲进程的task_struct是唯一一个不是动态分配而是在核心连接时静态定义的,为了不至于混淆,叫做init_task。,子进程创建过程为新进程分配任务结构体内存空间把父进程任务结构体拷贝到子进程任务结构体为新
10、进程在其虚拟内存建立内核堆栈对子进程任务结构体中部分进行初始化设置把父进程有关信息拷贝给子进程,建立共享关系把子进程的counter设为父进程counter值的一半把子进程加入到可运行队列中结束do_fork()函数返回PID值,进程由do_fork()函数创建 int do_fork(unsigned long clone_flags,unsigned long usp,struct pt_regs*regs)为新进程申请PCB空间;if(申请不到)返回错误,退出;为新进程申请核心堆栈;if(核心堆栈申请不到)返回错误,退出;为新进程在Task向量表中找到空闲位置;/*复制父进程curren
11、t PCB中的信息,继承资源*/;p=current;,/*为防止信号、定时中断误唤醒未创建完毕的进程,将子进程的状态设成不可中断的*/p-state=TASK_UNINTERRUPTIBLE;/*跟踪状态和超级用户特权是没有继承性的,因为在root用户为普通用户创建进程时,出于安全考虑这个普通用户的进程不允许拥有超级用户特权。*/p-flags,开始Task_struct的初始化工作,如初始化进程时钟、信号、时间等数据;继承父进程所有资源:拷贝父进程当前打开的文件;拷贝父进程在VFS的位置;拷贝父进程的信号量;拷贝父进程运行的内存;拷贝父进程的线程;初始化工作结束,父进程将其将其唤醒,挂入r
12、unning队列中,返回子进程的pid;,4.2 进程的启动,键入需要运行的程序的程序名,执行一个程序,其实也就是启动了一个进程。在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程。启动一个进程有两个主要途径:手工启动调度启动:事先进行设置,根据用户要求自行启动。主要介绍手工启动。,手工启动前台启动,这是手工启动一个进程的常用方式。例如:用户键入一个命令“ls l”,这就已经启动了一个进程,而且是一个前台的进程。这时候系统其实已经处于一个多进程状态。问题1:用户在键入“ls l”命令以后,使用“ps x”查看,能不能看到ls进程?问题2:如何才能看到一个前台进程?,手工启动后台
13、启动,直接从后台手工启动一个进程用得比较少一些,除非是该进程甚为耗时,且用户也不急着需要结果的时候。假设用户要启动一个需要长时间运行的格式化文本文件的进程。为了不使整个shell在格式化过程中都处于“瘫痪”状态,从后台启动这个进程是明智的选择。例1$find/-name fox.jpg&1 4513$键入命令以后,出现一个数字,这个数字就是该进程的编号,也称为PID,然后就出现了提示符。用户可以继续其他工作。,多个进程同时启动的例子,例如:man ps.1|grep kill|more这时候实际上是同时启动了三个进程。请注意是同时启动的,所有放在管道两边的进程都将被同时启动,它们都是当前she
14、ll的子程序,互相之间可以称为兄弟进程。,4.3 进程的监视,如果我们能够在任何给定时间查看系统正在干什么,我们就能够判断出自己运行的进程对系统性能产生的影响,也能发现其它用户是否给系统造成了严重的负担。Linux系统具有高度的透明性,是一个多进程系统,系统管理员能操控每个进程。如果某个进程占用了过多的系统资源,可将其杀死,如果系统的负荷状态看上去很好,就可以启动更多的进程。经常需要对这些进程进行一些调配和管理;而要进行管理,首先就要知道现在的进程情况:究竟有哪些进程?进程情况如何?等等。所以需要进程查看方面的工作。对任何一位系统管理员,在其日常使用的所有命令中,ps可能是其中功能使用最广的命
15、令。,ps命令,ps简介要对进程进行监测和控制,首先必须了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之,该命令的输出结果相当于在发出命令的那一刻对系统所作的快照,大部分信息都是可以通过执行该命令得到的。,ps命令及其参数,ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了。该命令语法格式如下:ps-选项,ps 的参数说明,ps 提供
16、了很多的选项参数,常用的有以下几个:l:长格式输出;u:按用户名和启动时间的顺序来显示进程;j:用任务格式来显示进程;f:用树形格式来显示进程;a:显示所有用户的所有进程(包括其它用户);x:显示无控制终端的进程;r:显示运行中的进程;我们常用的选项是组合是aux 或lax,还有参数f的应用;,常用ps命令参数,一般的用户只需掌握一些最常用的命令参数就可以了。最常用的三个参数是u、a、x,下面将通过例子来说明其具体用法。,例 以root身份登录系统,查看当前进程状况,$ps PID TTY TIME COMMAND 5800 ttyp0 00:00:00 bash 5835 ttyp0 00:
17、00:00 ps可以看到,显示的项目共分为四项,依次为PID(进程ID)、TTY(终端名称)、TIME(进程执行时间)、COMMAND(该进程的命令行输入)。PID(进程ID):是用来跟踪进程的唯一整型数,按数字次序分配,系统最先执行的进程是init,它的PID总是1。PID的上限是32767,之后的进程PID为1。,u选项来查看所有控制终端进程的所有者及其他一些详细信息,$ps uUSER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMANDroot 5000 0.0 0.0 1148 0 tty1 S Aug17 0:00 logintest 58
18、00 0.0 0.4 1892 1040 tty1 S 14:13 0:00-bashtest 5836 0.0 0.3 2528 856 pts/7 R 14:14 0:00 ps u,输出的解释,USER:进程的属主;PID:进程的ID;%CPU:进程占用的CPU百分比;%MEM:占用内存的百分比;VSZ:进程虚拟大小;RSS:驻留中页的数量;TTY:终端ID,STAT:进程状态R:处于可运行状态;S:处于休眠状态;T:处于终止运行状态;D:设备 IO;Z:处于僵尸状态;START:启动进程的时间;TIME:进程消耗CPU的时间;COMMAND:命令的名称和参数;,test 5800 0.
19、0 0.4 1892 1040 tty1 S 14:13 0:00-bash解释,在bash进程前面有条横线,意味着该进程便是用户的登录shell,所以对于一个登录用户来说带短横线的进程只有一个。,test 5836 0.0 0.3 2528 856 pts/7 R 14:14 0:00 ps u解释,最后一行最后一个字段上可以见到命令:“ps u”,正是该命令请求的进程产生的输出。从中可以看出:该进程由用户test执行,PID号为5836,占用的CPU时间百分比为0,物理内存百分比为0.3%,虚拟大小是2528千字节,驻留集大小(或使用的物理内存数量)为856;该命令是从另一台计算机上的伪终
20、端处发出的,该伪终端的标识符为pts/7;该进程的开始时间是14:14(一旦某个进程的存活时间超过24小时,该输出将简单的列出进程启动的日期)。在快照截取时,该进程占用的CPU时间为0,显然,在此之前已经使用了一些CPU时间,但在“ps u”命令执行时,进程已经完成了。,x选项,使用选项u看到了所有控制终端的进程;但是对于其他那些没有控制终端的进程还是没有观察到,所以这时就需要使用x选项。使用x选项可以观察到所有的进程情况。,例 使用x选项的例子,$ps xPID TTY STAT TIME COMMAND5800?S 0:00-bash5813?S 0:00 bash可以发现突然一下子就多出
21、了许多进程。这些多出来的进程就是没有控制终端(?)的进程。,a选项,前面看到的所有进程都是用户自己的。其实还有许多其他用户在使用着系统,自然也就对应着其他的很多进程。如果想对这些进程有所了解,可以使用a选项来查看当前系统所有用户的所有进程。经常使用的是aux组合选项,这可以显示最详细的进程情况。,例,$ps auxUSER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMANDroot 1 0.0 0.0 1136 64?S Nov25 0:02 init 3root 2 0.0 0.0 0 0?SW Nov25 0:00 kflushdroot 3 0
22、.0 0.0 0 0?SW Nov25 0:03 kupdateroot 173 0.0 0.0 1324 200?S Nov25 0:00 syslogdroot 181 0.0 0.0 1420 0?SW Nov25 0:00 klogddaemon 191 0.0 0.1 1160 312?S Nov25 0:00/usr/sbin/atdroot 201 0.0 0.1 1348 492?S Nov25 0:00 crondroot 212 0.0 0.0 1292 68?S Nov25 0:00 inetd,在显示的最前面是其他用户的进程情况,可以看到有root、daemon等用户以
23、及他们所启动的进程。主要系统进程的PID均小于10。W指的是没有驻留页面的进程。,ps 应用举例,实例一:ps aux 最常用$ps-aux|more可以用|管道和 more 连接起来分页查看;$ps-aux ps001.txt$more ps001.txt这里是把所有进程显示出来,并输出到ps001.txt文件,然后再通过more 来分页查看;,实例二:和grep 结合,提取指定程序的进程,rootlocalhost#ps aux|grep httpdroot 4187 0.0 1.3 24236 10272?Ss 11:55 0:00/usr/sbin/httpdapache 4189 0
24、.0 0.6 24368 4940?S 11:55 0:00/usr/sbin/httpdapache 4190 0.0 0.6 24368 4932?S 11:55 0:00/usr/sbin/httpdapache 4191 0.0 0.6 24368 4932?S 11:55 0:00/usr/sbin/httpdapache 4192 0.0 0.6 24368 4932?S 11:55 0:00/usr/sbin/httpdapache 4193 0.0 0.6 24368 4932?S 11:55 0:00/usr/sbin/httpd,4.4 进程优先级设置,优先级如果您还记得
25、ps 这个指令的话,那么来看一看加入 ps-l 这个功能所显示出来的信息:root test/root#ps lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD100 S 0 5624 5606 0 70 0-608 wait4 pts/0 00:00:00 bash000 R 0 6944 5624 0 76 0-769-pts/0 00:00:00 ps,F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD,注意看到上面那些信息:PRI 代表这个程序“可被执行的优先级”,越小越早被执
26、行!NI 代表这个程序的 nice 值。NI 就是 nice 值,什么是 nice 值呢?就是“系统可被执行的修正数值”,如前面所说的,由于PRI是越小越快被执行,而由于我们加入 nice 值之后,将使得 PRI 变为:PRI(new)=PRI(old)+nice 当 nice 值为负值的时候,那么该程序将会提前被执行!就是变的优先处理!,另外,需要注意的是:“只有具有 root 权限的身份者,可以将程序的 nice 调为负值”一般而言,我们可以这样说:一般使用者可用 nice 值:0 19 root 管理员可用 nice 值:-20 19,nice命令改变优先级,nice命令用于指定命令的优
27、先级。nice值是-20到20之间的数,大部分进程的nice值为0。默认情况下,nice命令会使niceness值增加10,但可以指定增量值,只有超级用户有权通过该命令减少进程的niceness。其使用格式是:nice-$nice xload&$nice 5 top$nice 12 find/-name“abc”print123#nice 5/usr/local/sbin/checksystem,renice,利用renice命令可以在命令执行时调整其优先权。其格式如下:renice 注:(1)用户只能对自己所有的进程使用renice命令。(2)root用户可以在任何进程上使用renice命令
28、。(3)只有root用户才能提高进程的优先权。,nice和renice的区别,nice命令要求指定优先级的变化量,而renice命令要求指定进程最终的优先级。nice要求在数值之前用短横连接,负数需要两短横,而renice命令不用短横,除非是负数。,4.5 进程挂起和激活,请输入以下命令:$mandate&1586 其中,1表示作业号,586是后台进程的PID号。,进程挂起,bash超过其它shell的一个特性就是为你提供了更强的控制进程的能力。这种作业控制特性允许你挂起正在运行的进程,可以把进程从后台移到前台或者反过来从前台移到后台。一个特殊的字符(Ctrlz),它可以将当前正在运行的子进程
29、挂起,并且告诉shell不用等待子进程终止。当一个子进程被挂起时,屏幕上就显示出该子进程的作业号和命令名,形式如下所示:1+Stopped command 其中,command表示被挂起进程所对应的命令。,例如,你当前正在运行命令:$man ls|more在没有全部显示完之前,按下Ctrlz键,你在屏幕上会看到:1+Stopped man ls|more,后台激活进程,一旦你挂起一个进程,你就可以用bg命令在后台运行这个进程:$bg job_ID.其中,jod_ID是被挂起进程的作业号。例如:$bg 1,前台激活进程,用fg命令,你可以把一个在后台运行的进程调度到前台运行:$fg job_ID
30、.例如:$fg 大多数情况下,只有一项任务在后台运行,所以fg后可以不带任务号。$fg 1$fg%1 某些shell要求在任务号前加,在bash中,这是可选的。,$fg%grep 用户也可指定命令名,但这种方法只在运行的多个任务命令名各不相同时才可使用。$fg%?dmesg 有多个相同命令名的任务运行时,可以使用?,jobs命令、sleep命令,jobs命令可以让你看到正在运行的所有子进程的状态:$jobs job_ID例如:$jobs 1+stopped man ls|more你可以使用sleep命令让当前进程睡眠若干秒,该秒数由参数指定。,例 用户正在使用Emacs,突然需要查看系统进程情
31、况。首先使用组合键(Ctrlz),将Emacs进程挂起,然后使用bg命令将其在后台启动,这样就得到了前台的操作控制权,$bg emacs接着键入“ps x”查看进程情况。$ps x查看完毕后,使用fg命令将Emacs带回前台运行即可。$fg emacs,练习,有三个锁定的程序,运行ps ux显示如下信息:USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMANDcbuchek 692 0.0 1.2 3908 1636?S 08:59 0:04 smbd Dcbuchek 728 0.0 0.7 1760 996 pts/1 S 09:58 0:0
32、0 bashcbuchek 893 0.0 0.7 2664 952 pts/1 R 13:16 0:00 ps uxbooch 14463 99.9 0.7 720 220 p2 R 19:23 8:41./a.outbooch 14464 0.0 0.0 0 0 p2 Z 19:23 0:00(a.out)这些进程的PID分别是什么?这些进程的状态如何?,4.6 信号控制进程,信号的作用使用信号,可以对系统上正在运行的进程或处于睡眠状态的进程进行控制。使用信号,用户可以通知进程放弃当前从事的任务该作其它事,或重新读取当前正在运行的文件或进程。,信号的产生,信号是进程之间通讯的一种方式,使某
33、个进程挂起或唤醒某个进程。信号可以发给一个或多个进程,可以是:由某个进程发出,并不是系统中每个进程都可以向所有其他进程发送信号,只有核心和超级用户具有此权限。普通进程只能向具有相同uid和gid的进程或者在同一进程组中的进程发送信号。可以由键盘中断产生。可以是由shell程序向其子进程发送任务控制命令时产生。进程在某些系统错误(如对虚拟内存的非法存取、被0除等)环境下也会有信号产生。,常用的信号及用途,可以用命令kill l来获得信号的名称和序号的完整列表。kill-l1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL5)SIGTRAP 6)SIGABRT 7)SIGBU
34、S 8)SIGFPE9)SIGKILL 10)SIGUSR1 11)SIGSEGV 12)SIGUSR213)SIGPIPE 14)SIGALRM 15)SIGTERM 17)SIGCHLD18)SIGCONT 19)SIGSTOP 20)SIGTSTP 21)SIGTTIN22)SIGTTOU 23)SIGURG 24)SIGXCPU 25)SIGXFSZ26)SIGVTALRM 27)SIGPROF 28)SIGWINCH 29)SIGIO30)SIGPWR 31)SIGSYS 32)SIGRTMIN,信号的个数受处理器字长的限制。因为内核用一个字代表所有的信号,因此字的位数就是信号种类的
35、数目。32位的平台最多信号种类为32种,64位平台就是64种。,常见的信号及用途,SIGHUP(信号1):挂起信号。当你退出系统时,操作系统就发送hangup(挂起)信号给shell的各子进程;向daemon进程发送SIGHUP将使之重新初始化,例向init发送SIGHUP信号可使其重新读取inittab文件,向internet超级服务进程(inetd)发送SIGHUP信号会使其重新扫描控制器文件/etc/inetd.conf)。SIGINT(信号2):键盘中断信号。Del或Ctrl+C键通常被配置为发送中断信号,它终止当前进程。SIGQUIT(信号3):键盘退出信号。Ctrl+组合键向进程发
36、送quit(退出)信号,通常它导致进程的终止,并创建一个转储文件。SIGFPE(信号8):浮点溢出信号。,SIGKILL(信号9):杀死进程信号。SIGALRM(信号14):进程定时器到期,发送的信号。SIGTERM(信号15):终止信号(kill命令默认发出的信号)SIGCHLD(信号17):子进程停止或结束信号。SIGSTOP(信号19):来自键盘或调试程序停止执行的信号。SIGTSTP(信号20):使进程信号挂起,并返回到父shell中。Ctrl+Z组合键向进程发送挂起信号,发送信号,可以用kill命令向进程发送信号。当接收到特定的信号时,程序可设定一个要执行的处理器。该处理器也称信号陷
37、阱。实际处理过程也称信号捕捉。程序也可以通知内核程序它将忽略某个特定信号。如果某个信号未被捕获或忽略,则该进程接收到它时执行默认操作。,kill命令的语法格式,kill命令的语法格式很简单,大致有以下两种方式:kill-s 信号|-p-a 进程号.kill-l 信号-s 指定需要送出的信号。既可以是信号名也可以对应数字。-p 指定kill命令只是显示进程的pid,并不真正送出信号。-l 显示信号名称列表,这也可以在/usr/include/linux/signal.h文件中找到。,4.7 终止进程,终止进程的原因很多,或许是该进程占用的CPU时间过多;或许是该进程已经挂死。总之这种情况是经常发
38、生的。当需要中断一个前台进程的时候,通常是使用组合键;但是对于一个后台进程恐怕就不是一个组合键所能解决的了,这时就必须求助于kill命令。该命令可以终止后台进程。kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送信号,那么默认值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用kill(9)信号了,该信号是不能被捕捉的。,kill命令的使用,例 在执行一条find指令时由于时间过长,决定终止该进程。首先应该使用ps命令来查看该进程对应的PID,键入ps,显示如下:PID TTY TIME COMMAND285 1 00:00
39、:00-bash287 3 00:00:00-bash312 3 00:00:00 telnet bbs3341 4 00:00:00/sbin/mingetty tty4345 1 00:00:00 find/-name foxy.jpg348 1 00:00:00 ps,可以看到该进程对应的PID是345,现在使用kill命令来终止该进程。键入:#kill 345再用ps命令查看,就可以看到,find进程已经被杀掉了。,例 强行杀掉进程,#ps fu trapperUID PID PPID STIME TTY TIME CMD trapper 92 1 10:02:04 tty1 0:03
40、-ksh trapper 97 92 10:18:00 tty1 0:02 myprog#kill 97(kill s SIGTERM 97)#ps fu trapper|grep myprogtrapper 97 92 10:18:00 tty1 0:02 myprog#kill-9 97(kill s SIGKILL 97),发送信号9,强行关闭此进程。当然这种“野蛮”的方法很可能会导致打开的文件出现错误或者数据丢失之类的错误。所以不到万不得已不要使用强制结束的办法。如果连信号9都不响应,那恐怕就只有重新启动计算机了。僵态进程已消亡,因而不能删除。要使这些进程从系统中消失必须将其父进程退出
41、。在某些极端情况下,只能重启系统。,6 有关进程控制的系统调用,fork()execl()wait()exit(),fork()函数,调用格式 int fork()例:pid=fork();功能:创建一个新进程,fork()返回值意义如下:0:在子进程中,pid变量保存的fork()返回值为0,表示当前进程是子进程。0:在父进程中,pid变量保存的fork()返回值为子进程的id值(进程唯一标识符)。-1:创建失败。,execl()函数,调用格式 int execl(新程序名,0);功能:重新加载进程,用新程序替换原进程。如execl(bin/ls,0);用bin/ls替换原进程。,wait()函数,调用格式 int wait(int status)例:wait();功能:等待子进程运行结束。如果子进程没有完成,父进程一直等待。wait()将调用进程挂起,直至其子进程因暂停或终止而发来软中断信号为止。如果在wait()前已有子进程暂停或终止,则调用进程做适当处理后便返回。,exit()函数,调用格式 void exit(int status)功能:终止进程的执行,