经典linux系统编程(值得收藏)第6章.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《经典linux系统编程(值得收藏)第6章.ppt》由会员分享,可在线阅读,更多相关《经典linux系统编程(值得收藏)第6章.ppt(53页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第 6 章章进程控制进程控制本章重点q进程的基本概念及进程的结构qLinux环境下进程的相关函数的应用q守护进程的概念、启动和建立q进程控制程序的编写26.1 进程简介进程简介q进程是一个程序的一次执行的过程。q在Linux环境下,每个正在运行的程序都称为进程。q每个进程包含进程标识符及数据,这些数据包含进程变量、外部变量及进程堆栈等。1.进程与程序进程与程序q由于一个进程对应一个程序的执行,但进程不等同于程序。因为程序是静态的概念,进程是动态的概念。q进程是程序执行的过程,包括了动态创建、调度和消亡的整个过程。进程是程序执行和资源管理的最小单位。q对系统而言,当用户在各级系统中键入命令执行
2、一个程序的时候,它将启动一个进程,因此,一个程序可以对应多个进程。36.1 进程简介进程简介2.Linux环境下的进程管理环境下的进程管理qLinux环境下的进程管理包括启动进程和调度进程。q启动进程有两种主要途径:手工启动和调度启动。(1)手工启动又可分为前台启动和后台启动。q前台启动:是手工启动一个进程的最常用方式。一般地,当用户输入一个命令时,就已经启动了一个进程,并且是一个前台的进程。q后台启动:往往是在该进程非常耗时,且用户也不急着需要结果的时候启动。一般地,当用户输入一个命令结尾加上一个“&”号,就是后台启动一个进程。46.1 进程简介进程简介(2)调度启动q有时系统需要进行一些比
3、较费时而且占用资源的维护工作,并且这些工作适合在深夜无人职守的时候进行,这时用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统就会自动完成这一切工作。56.1 进程简介进程简介q调度进程包括对进程的中断操作、改变优先级、查看进程状态等。qLinux环境下常见的进程调用命令66.2 Liunx进程控制进程控制qLinux环境下在进程启动时,系统会分配一个唯一的数值给每个进程,这个数值就称为进程标识符。q在Linux中最主要的进程标识有进程号(PID)和它的父进程号(PPID)。PID惟一地标识一个进程。PID和PPID都是非零的正整数。在Linux中获得当前进程的PID和PPID
4、的系统调用函数为getpid和getppid函数。76.2 Liunx进程控制进程控制q例例6-1:设计一个程序,要求显示Linux系统分配给此程序的进程号(PID)和它的父进程号(PPID)。q源程序代码:多次运行例多次运行例6.1的程序,每一次运行的的程序,每一次运行的结果结果PID值都是不一样的,所以说值都是不一样的,所以说PID是惟一地标识一个进程。是惟一地标识一个进程。86.2 Liunx进程控制进程控制qgetpid函数说明qgetppid函数说明96.2.1 进程的相关函数进程的相关函数qLinuxc与进程相关的主要函数106.2.2 进程创建进程创建1.exec函数函数q例例6
5、-2:设计一个程序,程序在运行时,能执行vim程序,即创建一个新的进程,并用ps命令查看程序的进程号与vim的进程号。q源程序代码:116.2.2 进程创建进程创建q编译、运行程序,系统会出现运行结果,先显示Linux系统分配的进程号(PID),接着运行vim程序,创建新的进程。q再打开一个终端,用ps查看原进程和新创建进程的进程号(PID)。q可以看到,在新进程创建后,原来的进程已经终止了。q在用execve函数创建新进程后,会以新的程序取代原来的进程,然后系统会从新进程运行,但是新进程的PID值会与原来进程的PID值相同。一般情况下,在运行execve函数后是不会返回原进程的,只有在错误时
6、才会返回-1,所以在原进程中的execve函数下方,加入perror函数,输出错误信息,并返回1,表示有错误发生。注意:在使用注意:在使用exec族时,一定要加上错误判断语句,族时,一定要加上错误判断语句,因为因为exec很容易执行失败。很容易执行失败。126.2.2 进程创建进程创建q实际上,在Linux中并没有exec函数,而是有6个以exec开头的函数族。qexec函数族的6个成员函数的语法事实上,这事实上,这6个函数中真正的系个函数中真正的系统调用只有统调用只有execve,其他,其他5个都个都是库函数,它们最终都会调用是库函数,它们最终都会调用execve这个系统调用。这个系统调用。
7、136.2.2 进程创建进程创建q思考题1:execv函数的应用,要在程序中执行命令:ps-ef,命令ps在/bin目录下。在这一函数中,参数v表示参数传递(含命令)为构造指针数组方式:char*arg=ps,-ef,NULL;函数的使用为:execv(/bin/ps,arg);参考程序:#include/*文件预处理,包含标准输入输出库*/#include/*文件预处理,包含getpid、getppid函数库*/intmain()/*C程序的主函数,开始入口*/char*arg=ls,-al,NULL;execv(/bin/ls,arg);return1;146.2.2 进程创建进程创建q思
8、考题2:execlp函数的应用,要在程序中执行命令:ps-ef,命令ps在/bin目录下。在这一函数中,参数l表示命令或参数逐个列举,参数p为文件查找方式(不需要给出路径)。因而此函数的调用形式为:execlp(ps,ps,-ef,NULL);请编写一程序进行调试。q思考题3:execl函数的应用,要在程序中执行命令:ps-ef,命令ps在/bin目录下。在这一函数中,参数l表示命令或参数逐个列举,文件需给定路径。因而此函数的调用形式为:execl(/bin/ps,ps,-ef,NULL);请编写一程序进行调试。156.2.2 进程创建进程创建2.system函数函数qsystem函数是一个和
9、操作系统紧密相关的函数。用户可以使用它在自己的程序中调用系统提供的各种命令。q使用时不需要预处理头文件“unistd.h”。q例例6-3:设计一个程序,要求测试到LUPA社区的网络连通状况。q编辑源程序代码:166.2.2 进程创建进程创建q编译、运行程序,系统会出现运行结果,先显示Linux系统分配的进程号(PID),接着运行ping程序,创建新的进程。q再打开一个终端,用ps查看原进程和新创建进程的进程号(PID)。q可以看到,原来6-3的进程(PID)值和新进程的父进程号(PPID)值相同,在新进程创建后,原来的进程并没有终止。注意:在第二个终端的时候,第一个终端中的注意:在第二个终端的
10、时候,第一个终端中的ping不不能结束。能结束。176.2.2 进程创建进程创建qsystem函数说明思考题:如何使用前面的思考题:如何使用前面的exec函数族中的函数,调用此例函数族中的函数,调用此例中的系统命令中的系统命令“ping ”?186.2.2 进程创建进程创建3.fork函数函数q使用fork函数创建进程时,新的进程叫子进程,原来调用fork函数的进程则称为父进程。q子进程会复制父进程的数据和堆栈空间,并继承父进程的用户代码、组代码、环境变量、已经打开的文件代码、工作目录及资源限制等,但是子进程和父进程使用不同的内存空间。196.2.2 进程创建进程创建q例例6-4:设计一个程序
11、,要求先显示当前目录下的文件信息,然后测试到LUPA社区的网络连通状况。q编辑源程序代码206.2.2 进程创建进程创建q编译、运行程序,观察结果。q可以看到,使用fork函数创建了一个子进程,子进程的返回值是0,父进程的返回值是子进程的进程号(PID)。而子进程的父进程号(PPID)和父进程的进程号(PID)相同。q可见,子进程由父进程派生出来。注意:注意:fork函数使用一次就创建一个进程,所以若把函数使用一次就创建一个进程,所以若把fork函数放在函数放在if else判断语句或判断语句或for循环语句中则要小心,不循环语句中则要小心,不能多次使用能多次使用fork函数。函数。如:如:v
12、oid main()for(;)fork();216.2.2 进程创建进程创建qsleep函数说明qfork函数说明226.2.2 进程创建进程创建q思考题:此例中,为什么用sleep等待10秒钟?q思考题:设计一个程序,在子进程中调用函数execl(/bin/ps,ps,-ef,NULL),而在父进程中调用函数execle(/bin/env,env,NULL,envp),其中有定义:char*envp=PATH=/tmp,USER=liu,NULL;请编写并进行调试。236.2.3 进程终止进程终止q滥用fork函数会占满系统进程,而且子进程与父进程使用不同的内存空间,不断产生子进程,也可能
13、让系统资源消耗殆尽。qLinux环境下c终止进程主要用exit和_exit函数。q例例6-5:设计一个程序,要求子进程和父进程都在显示输出一些文字后分别用exit和_exit函数终止进程。q编辑源程序代码:观察结果可以看出,调观察结果可以看出,调用用exit函数时,缓冲区函数时,缓冲区中的记录能正常输出;中的记录能正常输出;而调用而调用_exit时,缓冲区时,缓冲区中的记录无法输出。中的记录无法输出。246.2.3 进程终止进程终止q_exit()函数作用:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;qexit()函数则在执行退出之前加了若干道工序,exit函数在
14、调用exit系统之前要查看文件的打开情况,把文件缓冲区中的内容写回文件。256.2.3 进程终止进程终止qexit函数说明q_exit函数说明266.2.4 僵尸进程僵尸进程q一个僵尸进程(zombie),是指已终止运行,但尚末被清除的进程,又称为过渡进程。q当使用fork函数创建子进程时,由于子进程有可能比父进程晚终止,父进程终止后,子进程还没终止,子进程就成了僵尸进程。为避免这种情况,可以在父进程中调用wait或waitpid函数。qwait函数是用于使父进程阻塞,直到一个子进程终止或者该进程接到了一个指定的信号为止。qwaitpid的作用和wait一样,但它并不一定要等待第一个终止的子进
15、程,它还有若干选项,也能支持作业控制。q实际上wait函数只是waitpid函数的一个特例,在Linux内部实现wait函数时直接调用的就是waitpid函数。276.2.4 僵尸进程僵尸进程q例例6-6:设计一个程序,要求复制进程,子进程显示自己的进程号(PID)后暂停一段时间,父进程等待子进程正常结束,打印显示等待的进程号(PID)和等待的进程退出状态。q流程图:286.2.4 僵尸进程僵尸进程q编辑源程序代码:此例中的子进程运行时间,明显此例中的子进程运行时间,明显比父进程时间长。为了避免子进比父进程时间长。为了避免子进程成为僵尸进程,父进程调用程成为僵尸进程,父进程调用wait,阻塞父
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 经典 linux 系统 编程 值得 收藏
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内