《linux软件工程师(c语言)实用教程》第6章

上传人:kms****20 文档编号:51270001 上传时间:2018-08-13 格式:PPT 页数:53 大小:1.46MB
返回 下载 相关 举报
《linux软件工程师(c语言)实用教程》第6章_第1页
第1页 / 共53页
《linux软件工程师(c语言)实用教程》第6章_第2页
第2页 / 共53页
《linux软件工程师(c语言)实用教程》第6章_第3页
第3页 / 共53页
《linux软件工程师(c语言)实用教程》第6章_第4页
第4页 / 共53页
《linux软件工程师(c语言)实用教程》第6章_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《《linux软件工程师(c语言)实用教程》第6章》由会员分享,可在线阅读,更多相关《《linux软件工程师(c语言)实用教程》第6章(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后台启动:往往是在该进程非常耗时,且用户也不 急着需要结果的时候启动。一般地,当用户输入一 个命令结尾加上一个“ 函数的使用为: execv(“/bin/ps“,arg); 参考程序: #incl

3、ude /*文件预处理,包含标准输入输出库*/ #include /*文件预处理,包含getpid、getppid函数 库*/ int main () /*C程序的主函数,开始入口*/ char *arg=“ls“,“-al“,NULL;execv(“/bin/ls“,arg);return 1; 146.2.2 进程创建q 思考题2:execlp 函数的应用,要在程序中执行命令:ps -ef,命令ps在“/bin“目录下。在这一函数中,参数l表示命 令或参数逐个列举,参数p为文件查找方式(不需要给 出路径)。因而此函数的调用形式为: execlp(“ps“,“ps“,“-ef“,NULL);

4、 请编写一程序进行调试。q 思考题3:execl 函数的应用,要在程序中执行命令:ps - ef,命令ps在“/bin“目录下。在这一函数中,参数l表示命 令或参数逐个列举,文件需给定路径。因而此函数的调 用形式为:execl(“/bin/ps“,“ps“,“-ef“,NULL);请编写一程序进行调试。156.2.2 进程创建2. system函数 qsystem函数是一个和操作系统紧密相关的函数。 用户可以使用它在自己的程序中调用系统提供的 各种命令。 q使用时不需要预处理头文件“unistd.h”。q例6-3:设计一个程序,要求测试到LUPA社区的 网络连通状况。 q编辑源程序代码:166

5、.2.2 进程创建q编译、运行程序,系统会出现运行结果,先显示 Linux系统分配的进程号(PID),接着运行ping 程序,创建新的进程 。 q再打开一个终端,用ps查看原进程和新创建进程 的进程号(PID) 。 q可以看到,原来6-3的进程 (PID)值和新进程的父 进程号(PPID)值相同,在新进程创建后,原来的 进程并没有终止。注意:在第二个终端的时候,第一个终端中的ping不 能结束。176.2.2 进程创建qsystem函数说明思考题:如何使用前面的exec函数族中的函数,调用此例 中的系统命令“ping ”?186.2.2 进程创建3. fork函数 q使用fork函数创建进程时

6、,新的进程叫子进程, 原来调用fork函数的进程则称为父进程。 q子进程会复制父进程的数据和堆栈空间,并继承 父进程的用户代码、组代码、环境变量、已经打 开的文件代码、工作目录及资源限制等,但是子 进程和父进程使用不同的内存空间。196.2.2 进程创建q例6-4:设计一个程序,要求先显示当前目录下的 文件信息,然后测试到LUPA社区的网络连通状况 。 q 编辑源程序代码206.2.2 进程创建q编译、运行程序,观察结果。 q可以看到,使用fork函数创建了一个子进程,子 进程的返回值是0,父进程的返回值是子进程的 进程号(PID) 。而子进程的父进程号(PPID)和父 进程的进程号(PID)

7、相同。 q可见,子进程由父进程派生出来。注意:fork函数使用一次就创建一个进程,所以若把fork 函数放在if else判断语句或for循环语句中则要小心,不 能多次使用fork函数。 如: void 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),其中有 定义:

8、char *envp=“PATH=/tmp“,“USER=liu“,NULL; 请编写并进行调试。236.2.3 进程终止q滥用fork函数会占满系统进程,而且子进程与父 进程使用不同的内存空间,不断产生子进程,也 可能让系统资源消耗殆尽。 qLinux环境下c终止进程主要用exit和_exit函数。 q例6-5:设计一个程序,要求子进程和父进程都 在显示输出一些文字后分别用exit和_exit函数终 止进程。 q编辑源程序代码:观察结果可以看出,调 用exit函数时,缓冲区 中的记录能正常输出; 而调用_exit时,缓冲区 中的记录无法输出。246.2.3 进程终止q_exit()函数作用:

9、直接使进程停止运行,清除其使用 的内存空间,并清除其在内核中的各种数据结构;qexit()函数则在执行退出之前加了若干道工序,exit 函数在调用exit系统之前要查看文件的打开情况, 把文件缓冲区中的内容写回文件。256.2.3 进程终止qexit函数说明q_exit函数说明266.2.4 僵尸进程q 一个僵尸进程(zombie),是指已终止运行,但尚末被清除 的进程,又称为过渡进程。 q 当使用fork函数创建子进程时,由于子进程有可能比父进 程晚终止,父进程终止后,子进程还没终止,子进程就成 了僵尸进程。为避免这种情况,可以在父进程中调用wait 或waitpid函数。 q wait函数

10、是用于使父进程阻塞,直到一个子进程终止或者 该进程接到了一个指定的信号为止。 q waitpid的作用和wait一样,但它并不一定要等待第一个终 止的子进程,它还有若干选项,也能支持作业控制。 q 实际上wait函数只是waitpid函数的一个特例,在Linux内 部实现wait函数时直接调用的就是waitpid函数。276.2.4 僵尸进程q例6-6:设计一个程序,要求复制进程,子进程 显示自己的进程号(PID)后暂停一段时间,父进 程等待子进程正常结束,打印显示等待的进程 号(PID)和等待的进程退出状态。 q流程图:286.2.4 僵尸进程q编辑源程序代码: 此例中的子进程运行时间,明显

11、 比父进程时间长。为了避免子进 程成为僵尸进程,父进程调用 wait,阻塞父进程的运行,等待 子进程正常结束,父进程才继续 运行,直到正常结束。296.2.4 僵尸进程qwait函数说明306.2.4 僵尸进程q例6-7:设计一个程序,要求用户可以选择是否 复制进程,子进程模仿思科(Cisco)1912交换机 的开机界面,以命令行的方式让用户选择进入 ,父进程判断子进程是否正常终止。 q流程图:316.2.4 僵尸进程q编辑源程序代码: 326.2.4 僵尸进程q 编译、运行程序,提示是否复制进程,先选择“2.不复 制进程”,此时没有产生子进程,返回值为“0” 。 q 再次运行程序后,选择“1

12、.复制进程”,此时产生子进程 ,子进程的功能是模拟交换机的开机界面,提示选择画 面,这儿选择0,进入子程序display0,等待子程序运 行终止后,返回值为“1”,父进程才终止。 q 修改程序:不用waitpid函数。 q 再次运行程序后,选择“1.复制进程”,这时候父进程没 有等待子进程,也就是在模拟显示完交换机的开机界面 后,根本没来得及输入选择,父进程就终止了,子进程 就变成了僵尸进程。此例可以看出,在没有语法、语义等错误 的情况下,程序还是没有完成设计要求。 可见,在多进程程序设计时,除了养成使 用完后就终止的良好习惯,还要让子进程 工作完成后再终止,这个时候父进程就得 灵活使用wai

13、t函数和waitpid函数。336.2.4 僵尸进程qwaitpid函数说明346.3 Linux守护进程q守护进程(Daemon)是运行在后台的一种特 殊进程。 q守护进程独立于控制终端并且周期性地执行某 种任务或等待处理某些发生的事件。 q守护进程是一种很有用的进程。Linux的大多数 服务器就是用守护进程实现的。 q同时,守护进程完成许多系统任务。356.3.1 守护进程及其特性q守护进程最重要的特性是后台运行。 q其次,守护进程必须与其运行前的环境隔离开 来。这些环境包括未关闭的文件描述符,控制 终端,会话和进程组,工作目录以及文件创建 掩码等。这些环境通常是守护进程从执行它的 父进程

14、(特别是shell)中继承下来的。 q最后,守护进程的启动方式有其特殊之处。它 可以在Linux系统启动时从启动脚本/etc/rc.d中 启动,也可以由作业规划进程crond启动,还可 以由用户终端(通常是shell)执行。 366.3.1 守护进程及其特性q 通过ps aux命令可查看Linux环境下的守护进程: q Init系统守护进程:它是进程1,负责启动各运行层次特定的 系统服务。 q Keventd守护进程:为在内核中运行计划执行的函数提供进 程上下文。 q Kswapd守护进程:也称为页面调出守护进程。它通过将脏 页面以低速写到磁盘上从而使这些页面在需要时仍可回收使 用,这种方式支

15、持虚存子系统。 q bdflush和kupdated守护进程:Linux内核使用两个守护进程 bdflush和kupdated将调整缓存中的数据冲洗到磁盘上。当 可用内存达到下限时,bdflush守护进程将脏缓冲区从缓冲 池中冲洗到磁盘上,每隔一定时间间隔,kupdated守护进程 将脏页面冲洗到磁盘上,以便在系统失效时减少丢失的数据 。376.3.1 守护进程及其特性q portmap端口映射守护进程:提供将RPC(远程过程调用 )程序号映射为网络端口号的服务。 q syslogd守护进程:可由帮助操作人员把系统消息记入日 志的任何程序使用。 q inetd守护进程(xinetd):它侦听系

16、统网络接口,以便取 得来自网络的对各种网络服务进程的请求。 q nfsd、lockd、rpciod守护进程:提供对网络文件系统( NFS) 的支持。 q cron守护进程:在指定的日期和时间执行指定的命令。许 多系统管理任务是由cron定期地执行相关程序而实现的。 q cupsd守护进程:是打印假脱机进程,它处理对系统提出 的所有打印请求。 注意:大多数守护进程都以超级用户(用 户ID为0)特权运行。没有一个守护进程 具有控制终端,其终端名设置为问号(? )。386.3.2 编写守护进程的要点396.3.2 编写守护进程的要点(1)创建子进程,终止父进程 pid=fork(); if(pid0) exit(0); /*终止父进程*/ (2)在子进程中创建新会话 qsetsid函数用于创建一个新的会话,并担任该会话组 的组长,其作用: q让进程摆脱原会话的控制; q让进程摆脱原进程组的控制; q让进程摆脱原控制终端的控制。 q而sets

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号