版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章进程控制本章重点进程的基本概念及进程的结构Linux环境下进程的相关函数的应用守护进程的概念、启动和建立进程控制程序的编写26.1进程简介进程是一个程序的一次执行的过程。在Linux环境下,每个正在运行的程序都称为进程。每个进程包含进程标识符及数据,这些数据包含进程变量、外部变量及进程堆栈等。1.进程与程序由于一个进程对应一个程序的执行,但进程不等同于程序。因为程序是静态的概念,进程是动态的概念。进程是程序执行的过程,包括了动态创建、调度和消亡的整个过程。进程是程序执行和资源管理的最小单位。对系统而言,当用户在各级系统中键入命令执行一个程序的时候,它将启动一个进程,因此,一个程序可以对应多个进程。36.1进程简介2.Linux环境下的进程管理Linux环境下的进程管理包括启动进程和调度进程。启动进程有两种主要途径:手工启动和调度启动。(1)手工启动又可分为前台启动和后台启动。前台启动:是手工启动一个进程的最常用方式。一般地,当用户输入一个命令时,就已经启动了一个进程,并且是一个前台的进程。后台启动:往往是在该进程非常耗时,且用户也不急着需要结果的时候启动。一般地,当用户输入一个命令结尾加上一个“&”号,就是后台启动一个进程。46.1进程简介(2)调度启动有时系统需要进行一些比较费时而且占用资源的维护工作,并且这些工作适合在深夜无人职守的时候进行,这时用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统就会自动完成这一切工作。56.1进程简介调度进程包括对进程的中断操作、改变优先级、查看进程状态等。Linux环境下常见的进程调用命令66.2Liunx进程控制Linux环境下在进程启动时,系统会分配一个唯一的数值给每个进程,这个数值就称为进程标识符。在Linux中最主要的进程标识有进程号(PID)和它的父进程号(PPID)。PID惟一地标识一个进程。PID和PPID都是非零的正整数。在Linux中获得当前进程的PID和PPID的系统调用函数为getpid和getppid函数。76.2Liunx进程控制例6-1:设计一个程序,要求显示Linux系统分配给此程序的进程号(PID)和它的父进程号(PPID)。源程序代码:多次运行例6.1的程序,每一次运行的结果PID值都是不一样的,所以说PID是惟一地标识一个进程。86.2Liunx进程控制getpid函数说明getppid函数说明96.2.1进程的相关函数Linuxc与进程相关的主要函数106.2.2进进程创建建1.exec函数例6-2:设计一个个程序,,程序在在运行时时,能执执行vim程序序,即创创建一个个新的进进程,并并用ps命令查查看程序序的进程程号与vim的的进程号号。源程序代码::116.2.2进进程创建编译、运行程程序,系统会会出现运行结结果,先显示示Linux系统分配的的进程号(PID),接接着运行vim程序,创创建新的进程程。再打开一个终终端,用ps查看原进程程和新创建进进程的进程号号(PID)。可以看到,在在新进程创建建后,原来的的进程已经终终止了。在用execve函数创创建新进程后后,会以新的的程序取代原原来的进程,,然后系统会会从新进程运运行,但是新新进程的PID值会与原原来进程的PID值相同同。一般情况况下,在运行行execve函数后是是不会返回原原进程的,只只有在错误时时才会返回-1,所以在在原进程中的的execve函数下方方,加入perror函函数,输出错错误信息,并并返回1,表表示有错误发发生。注意:在使用用exec族族时,一定要要加上错误判判断语句,因因为exec很容易执行行失败。126.2.2进进程创建实际上,在Linux中中并没有exec函数,,而是有6个个以exec开头的函数数族。exec函数数族的6个成成员函数的语语法事实上,这6个函数中真真正的系统调调用只有execve,,其他5个都都是库函数,,它们最终都都会调用execve这这个系统调用用。136.2.2进进程创建思考题1:execv函函数的应用,,要在程序中中执行命令:ps-ef,命令ps在"/bin"目录录下。在这一一函数中,参参数v表示参参数传递(含含命令)为构构造指针数组组方式:char*arg[]={"ps","-ef",NULL};函数的使用为为:execv("/bin/ps",arg);参考程序:#include<stdio.h>/*文件件预处理,包包含标准输入入输出库*/#include<unistd.h>/*文件件预处理,包包含getpid、getppid函数库*/intmain()/*C程程序的主函数数,开始入口口*/{char*arg[]={"ls","-al",NULL};execv("/bin/ls",arg);return1;}146.2.2进进程创建思考题2:execlp函数的应应用,要在程程序中执行命命令:ps-ef,命命令ps在"/bin"目录下。在在这一函数中中,参数l表表示命令或参参数逐个列举举,参数p为为文件查找方方式(不需要要给出路径))。因而此函函数的调用形形式为:execlp("ps","ps","-ef",NULL);请编写一程序序进行调试。。思考题3:execl函函数的应用用,要在程序序中执行命令令:ps-ef,命令令ps在"/bin"目目录下。在这这一函数中,,参数l表示示命令或参数数逐个列举,,文件需给定定路径。因而而此函数的调调用形式为::execl("/bin/ps","ps","-ef",NULL);请编写一程序序进行调试。。156.2.2进进程创建2.system函数数system函数是一个个和操作系统统紧密相关的的函数。用户户可以使用它它在自己的程程序中调用系系统提供的各各种命令。使用时不需要要预处理头文文件“unistd.h”。例6-3:设计一个程序序,要求测试试到LUPA社区的网络络连通状况。。编辑源程序代代码:166.2.2进进程创建编译、运行程程序,系统会会出现运行结结果,先显示示Linux系统分配的的进程号(PID),接接着运行ping程序,,创建新的进进程。再打开一个终终端,用ps查看原进程程和新创建进进程的进程号号(PID)。可以看到,原原来6-3的的进程(PID)值和和新进程的父父进程号(PPID)值值相同,在新新进程创建后后,原来的进进程并没有终终止。注意:在第二二个终端的时时候,第一个个终端中的ping不能能结束。176.2.2进进程创建system函数说明186.2.2进进程创建3.fork函数使用fork函数创建进进程时,新的的进程叫子进进程,原来调调用fork函数的进程程则称为父进进程。子进程会复制制父进程的数数据和堆栈空空间,并继承承父进程的用用户代码、组组代码、环境境变量、已经经打开的文件件代码、工作作目录及资源源限制等,但但是子进程和和父进程使用用不同的内存存空间。196.2.2进进程创建例6-4:设计一个程序序,要求先显显示当前目录录下的文件信信息,然后测测试到LUPA社区的网网络连通状况况。编辑源程序序代码206.2.2进程创创建编译、运行行程序,观观察结果。。可以看到,,使用fork函数数创建了一一个子进程程,子进程程的返回值值是0,父父进程的返返回值是子子进程的进进程号(PID)。。而子进进程的父进进程号(PPID)和父进程程的进程号号(PID)相同。。可见,子进进程由父进进程派生出出来。注意:fork函数数使用一次次就创建一一个进程,,所以若把把fork函数放在在ifelse判断语句句或for循环语句句中则要小小心,不能能多次使用用fork函数。如:voidmain(){for(;;)fork();}216.2.2进程创创建sleep函数说明明fork函函数说明226.2.2进程创创建思考题:此此例中,为为什么用sleep等待10秒钟?思考题:设设计一个程程序,在子子进程中调调用函数execl("/bin/ps","ps","-ef",NULL),,而在父进进程中调用用函数execle("/bin/env","env",NULL,envp),其中有有定义:char*envp[]={"PATH=/tmp","USER=liu",NULL};请编写并进进行调试。。236.2.3进程终终止滥用fork函数会会占满系统统进程,而而且子进程程与父进程程使用不同同的内存空空间,不断断产生子进进程,也可可能让系统统资源消耗耗殆尽。Linux环境下c终止进程程主要用exit和和_exit函数。。例6-5::设计一个程程序,要求求子进程和和父进程都都在显示输输出一些文文字后分别别用exit和_exit函函数终止进进程。编辑源程序序代码:观察结果可可以看出,,调用exit函数数时,缓冲冲区中的记记录能正常常输出;而而调用_exit时时,缓冲区区中的记录录无法输出出。246.2.3进程终终止_exit()函数数作用:直直接使进程程停止运行行,清除其其使用的内内存空间,并清除其其在内核中中的各种数数据结构;;exit()函数则则在执行退退出之前加加了若干道道工序,exit函函数在调用用exit系统之前前要查看文文件的打开开情况,把把文件缓冲冲区中的内内容写回文文件。256.2.3进程终终止exit函函数说明_exit函数说明明266.2.4僵尸进进程一个僵尸进进程(zombie),是指指已终止运运行,但尚尚末被清除除的进程,,又称为过过渡进程。。当使用fork函数数创建子进进程时,由由于子进程程有可能比比父进程晚晚终止,父父进程终止止后,子进进程还没终终止,子进进程就成了了僵尸进程程。为避免免这种情况况,可以在在父进程中中调用wait或waitpid函数数。wait函函数是用于于使父进程程阻塞,直直到一个子子进程终止止或者该进进程接到了了一个指定定的信号为为止。waitpid的作作用和wait一样样,但它并并不一定要要等待第一一个终止的的子进程,,它还有若若干选项,,也能支持持作业控制制。实际上wait函数数只是waitpid函数的的一个特例例,在Linux内内部实现wait函函数时直接接调用的就就是waitpid函数。276.2.4僵尸进进程例6-6::设计一个程程序,要求求复制进程程,子进程程显示自己己的进程号号(PID)后暂停停一段时间间,父进程程等待子进进程正常结结束,打印印显示等待待的进程号号(PID)和等待待的进程退退出状态。。流程图:286.2.4僵尸进进程编辑源程序序代码:此例中的子子进程运行行时间,明明显比父进进程时间长长。为了避避免子进程程成为僵尸尸进程,父父进程调用用wait,阻塞父父进程的运运行,等待待子进程正正常结束,,父进程才才继续运行行,直到正正常结束。。296.2.4僵尸进进程wait函函数说明306.2.4僵尸进进程例6-7::设计一个程程序,要求求用户可以以选择是否否复制进程程,子进程程模仿思科科(Cisco)1912交交换机的开开机界面,,以命令行行的方式让让用户选择择进入,父父进程判断断子进程是是否正常终终止。流程图:316.2.4僵尸进进程编辑源程序序代码:326.2.4僵尸进进程编译、运行行程序,提提示是否复复制进程,,先选择““2.不复复制进程””,此时没没有产生子子进程,返返回值为““0”。。再次运行程程序后,选选择“1.复制进程程”,此时时产生子进进程,子进进程的功能能是模拟交交换机的开开机界面,,提示选择择画面,这这儿选择0,进入子子程序display0,等等待子程序序运行终止止后,返回回值为“1”,父进进程才终止止。修改程序::不用waitpid函数。。再次运行程程序后,选选择“1.复制进程程”,这时时候父进程程没有等待待子进程,,也就是在在模拟显示示完交换机机的开机界界面后,根根本没来得得及输入选选择,父进进程就终止止了,子进进程就变成成了僵尸进进程。此例可以看看出,在没没有语法、、语义等错错误的情况况下,程序序还是没有有完成设计计要求。可可见,在多多进程程序序设计时,,除了养成成使用完后后就终止的的良好习惯惯,还要让让子进程工工作完成后后再终止,,这个时候候父进程就就得灵活使使用wait函数和和waitpid函函数。336.2.4僵尸进进程waitpid函数数说明346.3Linux守护进程程守护进程((Daemon)是是运行在后后台的一种种特殊进程程。守护进程独独立于控制制终端并且且周期性地地执行某种种任务或等等待处理某某些发生的的事件。守护进程是是一种很有有用的进程程。Linux的大大多数服务务器就是用用守护进程程实现的。。同时时,,守守护护进进程程完完成成许许多多系系统统任任务务。。356.3.1守守护护进进程程及及其其特特性性守护护进进程程最最重重要要的的特特性性是是后后台台运运行行。。其次次,,守守护护进进程程必必须须与与其其运运行行前前的的环环境境隔隔离离开开来来。。这这些些环环境境包包括括未未关关闭闭的的文文件件描描述述符符,,控控制制终终端端,,会会话话和和进进程程组组,,工工作作目目录录以以及及文文件件创创建建掩掩码码等等。。这这些些环环境境通通常常是是守守护护进进程程从从执执行行它它的的父父进进程程((特特别别是是shell))中中继继承承下下来来的的。。最后后,,守守护护进进程程的的启启动动方方式式有有其其特特殊殊之之处处。。它它可可以以在在Linux系系统统启启动动时时从从启启动动脚脚本本/etc/rc.d中中启启动动,,也也可可以以由由作作业业规规划划进进程程crond启启动动,,还还可可以以由由用用户户终终端端((通通常常是是shell))执执行行。。366.3.1守守护护进进程程及及其其特特性性通过过ps––aux命命令令可可查查看看Linux环环境境下下的的守守护护进进程程::Init系系统统守守护护进进程程::它它是是进进程程1,,负负责责启启动动各各运运行行层层次次特特定定的的系系统统服服务务。。Keventd守守护护进进程程::为为在在内内核核中中运运行行计计划划执执行行的的函函数数提提供供进进程程上上下下文文。。Kswapd守守护护进进程程::也也称称为为页页面面调调出出守守护护进进程程。。它它通通过过将将脏脏页页面面以以低低速速写写到到磁磁盘盘上上从从而而使使这这些些页页面面在在需需要要时时仍仍可可回回收收使使用用,,这这种种方方式式支支持持虚虚存存子子系系统统。。bdflush和和kupdated守守护护进进程程::Linux内内核核使使用用两两个个守守护护进进程程bdflush和和kupdated将将调调整整缓缓存存中中的的数数据据冲冲洗洗到到磁磁盘盘上上。。当当可可用用内内存存达达到到下下限限时时,,bdflush守守护护进进程程将将脏脏缓缓冲冲区区从从缓缓冲冲池池中中冲冲洗洗到到磁磁盘盘上上,,每每隔隔一一定定时时间间间间隔隔,,kupdated守守护护进进程程将将脏脏页页面面冲冲洗洗到到磁磁盘盘上上,,以以便便在在系系统统失失效效时时减减少少丢丢失失的的数数据据。。376.3.1守守护护进进程程及及其其特特性性portmap端端口口映映射射守守护护进进程程::提提供供将将RPC((远远程程过过程程调调用用))程程序序号号映映射射为为网网络络端端口口号号的的服服务务。。syslogd守护进进程:可可由帮助助操作人人员把系系统消息息记入日日志的任任何程序序使用。。inetd守护护进程((xinetd):它它侦听系系统网络络接口,,以便取取得来自自网络的的对各种种网络服服务进程程的请求求。nfsd、lockd、rpciod守护护进程::提供对对网络文文件系统统(NFS)的的支持持。cron守护进进程:在在指定的的日期和和时间执执行指定定的命令令。许多多系统管管理任务务是由cron定期地地执行相相关程序序而实现现的。cupsd守护护进程::是打印印假脱机机进程,,它处理理对系统统提出的的所有打打印请求求。注意:大大多数守守护进程程都以超超级用户户(用户户ID为为0)特特权运行行。没有有一个守守护进程程具有控控制终端端,其终终端名设设置为问问号(??)。386.3.2编编写守护护进程的的要点396.3.2编编写守护护进程的的要点(1)创创建子进进程,终终止父进进程pid=fork();if(pid>0){exit(0);}/*终止父父进程*/(2)在在子进程程中创建建新会话话setsid函函数用于于创建一一个新的的会话,,并担任任该会话话组的组组长,其其作用::让进程摆摆脱原会会话的控控制;让进程摆摆脱原进进程组的的控制;;让进程摆摆脱原控控制终端端的控制制。而setsid函数能能够使进进程完全全独立出出来,从从而脱离离所有其其他进程程的控制制。406.3.2编编写守护护进程的的要点(3)改改变工作作目录改变工作作目录的的常见函函数是chdir。(4)重重设文件件创建掩掩码文件创建建掩码是是指屏蔽蔽掉文件件创建时时的对应应位。把文件创创建掩码码设置为为0,可可以大大大增强该该守护进进程的灵灵活性。。设置文件件创建掩掩码的函函数是umask。416.3.2编编写守护护进程的的要点(5)关关闭文件件描述符符通常按如如下方式式关闭文文件描述述符:for(i=0;i<NOFILE;i++)close(i);或者也可可以用如如下方式式:for(i=0;i<MAXFILE;i++)close(i);426.3.3守守护进程程的编写写例6-8:设计两个个程序,,主程序序6-8.c和和初始化化程序init.c。。要求主主程序每每隔十秒秒钟向/tmp目录中中的日志志6-8.log报告告运行状状态。初初始化程程序中的的init_daemon函函数负责责生成守守护进程程。436.3.3守守护进程程的编写写编辑源程程序代码码:注意:这这里的fopen函数数必须具具有root权权限。如如果没有有root权限限,可以以看到守守护进程程的运行行,但不不会在文文件里写写入任何何字符。。446.3.3守守护进程程的编写写编译、运运行文件件后,没没有任何何提示,,等待一一段时间间后,查查看一下下6-8.log文文件中有有没有文文字写入入,输入入“tail-f/tmp/6-8.log””,显示示多条文文字,从从时间上上看,说说明守护护进程在在暗地里里每隔10秒写写入一串串字符。。用ps命命令查看看进程。。可见,6-8确确实一直直在运行行,而且且看到““?”结结合Linux环境下下进程的的知识,,知道确确实有了了一个守守护进程程。注意:父父进程创创建了子子进程,,而父进进程又退退出之后后,此时时该子进进程就变变成了““孤儿进进程”。。在Linux中,每每当系统统发现一一个孤儿儿进程,,就会自自动由1号进程程(也就就是init进进程)收收养它,,原先的的子进程程就会变变成init进进程的子子进程了了。456.3.3守守护进进程的的编写写setsid函函数说说明:思考题题:此例中中如果果不先先终止止父进进程,,就调调用setsid函函数会会发生生什么么?守守护进进程运运行后后,注注消当当前用用户后后再登登录进进去,,守护护进程程还在在运行行吗??编写一一程序序,要要求运运行后后成为为守护护进程程,每每隔5分钟钟修改改一次次本机机的IP地地址。。466.3.3守守护进进程的的编写写例6-9::设计两两个程程序,,要求求运行行后成成为守守护进进程,,守护护进程程又复复制出出一个个子进进程,,守护护进程程和它它的子子进程程都调调用syslog函函数,,把结结束前前的状状态写写入系系统日日志文文件。。流程图图:476.3.3守守护进进程的的编写写编辑源源程序序代码码:注意::调用用openlog、、syslog函数数,操操作的的系统统日志志文件件“/var/log/message””,必必须具具有root权权限。。486.3.3守守护进进程的的编写写编译、、运行行程序序后,,没有有任何何提示示,等等待一一段时时间后后,查查看一一下/var/log/messages文件件中有有没有有文字字写入入,输输入““tail-f/var/log/messages””,此此时时,显显示多多条文文字,,说明明守护护进程程通过过系统统日志志管理理服务务,在在暗地地里写写入一一串字字符,,而且且从时时间上上看出出,第第二子子进程程确实实是在在暂停停5秒秒钟后后退出出的。。用ps命令令查看看进程程。。可见,,6-9确确实一一直在在运行行,而而且看看到““?””结合合Linux环环境下下进程程的知知识,,知道道确实实有了了一个个守护护进程程。496.3.3守守护进进程的的编写写openlog函数数说明明syslog函函数说说明思考题题:编编写一一程序序,要要求运运行后后成为为守护护进程程,复复制守守护进进程的的子进进程,,子进进程往往某个个文件件里写写入字字符串串“测测试守守护进进程””,守守护进进程的的错误误信息息输出出到系系统日日志文文件““/var/log/messages””,程程序以以普通通用户户权限限编译译后运运行调调试会会有什什么结结果??请把把产生生守护护进程程的部部分分分割成成独立立的程程序文文件。。50思考与与实验验什么是是进程程?进进程与与作业业有何何区别别?进程启启动
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年高危安全培训内容记录核心要点
- 2026年安全事故后培训内容重点
- 2026年瓷砖厂釉线安全培训内容实战案例
- 固原地区西吉县2025-2026学年第二学期五年级语文期中考试卷(部编版含答案)
- 甘南藏族自治州卓尼县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 崇左市龙州县2025-2026学年第二学期四年级语文第六单元测试卷(部编版含答案)
- 2026年-银行安全保卫培训内容实操要点
- 枣庄市市中区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 喀什地区泽普县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 百色市靖西县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 2026湖北宜昌夷陵区小溪塔街道办事处招聘民政助理1人笔试备考试题及答案解析
- 2026新疆兵团第七师胡杨河市公安机关社会招聘辅警358人考试参考试题及答案解析
- 2026陕西榆林市旅游投资集团有限公司招聘7人考试备考试题及答案解析
- 2024版前列腺癌药物去势治疗随访管理中国专家共识课件
- 2026年基于责任区的幼儿园联片教研活动设计方案
- 《油气管道地质灾害风险管理技术规范》SYT 6828-2024
- 2026新疆喀什正信建设工程检测有限公司招聘12人考试参考试题及答案解析
- 2026年宁夏工业职业学院单招职业技能考试题库含答案详解(完整版)
- 会计内部监督制度
- 2026春冀人版(2024)二年级下册小学科学教案(附目录)
- 09鉴赏诗歌语言之炼字炼句
评论
0/150
提交评论