




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第6章章进 程 控 制2本章重点q 进程的基本概念及进程的结构q Linux环境下进程相关函数及应用q 守护进程的概念、启动和建立q 进程操作程序的编写3 6.1 进程简介q 从字面上讲,进程指正在执行中的程序。例如在终端执行命令时,Linux会建立一个进程;当程序执行结束时,该进程被终止。q Linux是多任务操作系统,允许多个用户使用计算机系统,多个进程并发执行。4 6.1 进程简介Linux下启动进程的两种主要途径:p 手工启动前台启动:5 6.1 进程简介Linux下启动进程的两种主要途径:p 手工启动后台启动:6 6.1 进程简介Linux下启动进程的两种主要途径:p 调度启动:绝
2、对时刻用户可以事先指定任务运行的时间或场合,届时让系统自动执行指定的工作。按Ctrl+D退出at编辑状态7 6.1 进程简介Linux下启动进程的两种主要途径:p 调度启动(续):相对时刻8 6.1 进程简介Linux下启动进程的两种主要途径:p 调度启动(续):相对时刻,将不回显的内容以邮件的形式发送给当前用户9 6.1 进程简介Linux环境下常见的进程操作命令命令作用ps查看系统中的进程top动态显示系统中的进程kill终止进程(包括后台进程)Ctrl + z将前台执行的进程转至后台且挂起(暂停执行)bg将挂起的进程放到后台执行fg将后台的进程转到前台执行jobs查看在后台运行的命令10
3、 6.2 Linux进程控制p 进程标识有进程号(PID)、它的父进程号(PPID),均为正整数;PID唯一地标识一个进程;p getpid、getppid函数能够获得当前进程的PID和PPIDp 例:设计一个程序,显示Linux系统分配给此程序的进程号、父进程号注:可用PID值建立进程各自的临时文件,避免混淆。11根据不同进程的PID值,建立由PID所标识的文件名12 6.2 Linux进程控制p getpid函数原型pid_t getpid(void);执行成功则返回当前进程的PID,需#include p getppid函数原型pid_t getppid(void);执行成功则返回当前进
4、程的父进程的PID,需#include 13 6.2 Linux进程控制p查找程序6-1.cp运行时的进程号14 6.2 Linux进程控制6.2.1 与进程相关的主要函数函数名功能getpid取得当前进程的进程号getppid取得当前进程的父进程号exec函数族在进程中启动并执行另一个程序system在进程中开始另一个进程fork从已经存在的进程中创建/复制一个新进程sleep让进程暂停运行一段时间exit终止进程_exit终止进程wait暂停父进程,等待子进程运行完成waitpid暂停父进程,等待子进程运行完成15 6.2 Linux进程控制6.2.2 进程创建1. fork函数第10行:
5、 进程调用fork函数创建一个新进程(子进程),该函数有两次返回的值:子进程的返回值为0;父进程的返回值是子进程的进程PID。 子进程是父进程的复制品,从父进程那里获得数据空间等拷贝,不共享存储空间 这两个进程继续执行fork语句之后的代码(共享代码段)。在父、子进程中,n、message分别被赋予不同的值。一般情况下,内核交替调度父、子进程,因此交替输出结果16 6.2 Linux进程控制6.2.2 进程创建1. fork函数(续)运行结果:运行过程:父进程每打印一条消息就睡眠1秒,此时内核可能调度子进程执行;同理,子进程每打印一条消息也睡眠1秒,此时父进程可能被再次调度执行因此运行结果基本
6、上为父、子进程交替执行(打印),次序取决于系统其它进程的运行状况以及内核调度算法17 6.2 Linux进程控制6.2.2 进程创建1. fork函数(续):通过ps显示fork函数创建子进程(1)18 6.2 Linux进程控制6.2.2 进程创建1. fork函数(续):通过ps显示fork函数创建子进程(2)19 6.2 Linux进程控制6.2.2 进程创建fork函数(续) 变形(1)运行结果:分析:当父进程终止时,shell进程即认为命令执行结束,于是打印shell提示符,因此子进程的消息被打印到提示符之后20 6.2 Linux进程控制6.2.2 进程创建fork函数(续) 变形
7、(2)运行结果:21 6.2 Linux进程控制6.2.2 进程创建fork函数(续) 变形(3)运行结果:22 6.2 Linux进程控制6.2.2 进程创建p sleep函数原型:unsigned int sleep(unsigned int seconds); 使得当前进程暂停(进入睡眠状态),直到达到参数seconds(秒)所指定的时间,或被信号所中断 #include 执行成功则返回0,失败则返回剩余秒数p fork函数原型:pid_t fork(void); 建立一个新进程 执行成功则为子进程返回0,为父进程返回新建子进程的进程ID,失败则返回-1,失败原因存于errno中 子进程
8、与父进程共享代码,但不共享内存空间;若子进程修改从父进程那里继承/复制而来的信息,这并不影响父进程vfork与fork函数的区别:http:/ 6.2 Linux进程控制6.2.2 进程创建2. exec函数族pexec()系统调用有多种形式,被称为exec()族;exec()族只是在参数上不同,功能是相同的。pexec()族有6个函数可用来建立子进程:execlexecvexecleexecveexeclpexecvp含义:函数中的参数使用l: 列表传递方式v: 字符指针数组传递方式e: 可指定环境变量p: 路径自动搜索功能system()函数 与 exec()函数 的区别(http:/ 执
9、行exec()后,老的进程上下文将被exec出来的新的进程上下文覆盖,新进程代替原进程执行。 执行system()后则相当于fork()出一个子进程,并等待此子进程执行完毕。24 6.2 Linux进程控制6.2.2 进程创建2. exec函数族p例如 列表传递方式execl(“/bin/ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL): 字符指针数组传递方式char *const ps_argv=“ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL;execv(“/bin/
10、ps”, ps_argv); 可指定环境变量const char *ps_envp=“PATH=/bin:/usr/bin”, “TERM=console”, NULL;execle(“/bin/ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL, ps_envp);execve(“/bin/ps”, ps_argv, ps_envp); 路径自动搜索功能execlp(“ps”, “ps”, “-o”, “pid,ppid,pgrp,session,tpgid,comm”, NULL);execvp(“ps”, ps_argv);
11、25 6.2 Linux进程控制2. exec函数族(续)p例6-3:设计程序,用fork创建一个子进程,显示子、父进程号;显示当前目录下的文件信息;在父进程中亦显示子进程号与父进程号。26 6.2 Linux进程控制2. exec函数族(续)p例:设计程序,用fork创建一个子进程,显示子、父进程号;显示当前目录下的文件信息;在父进程中亦显示子进程号与父进程号。运行结果:27 6.2 Linux进程控制2. exec函数族(续)结果含义:http:/ 6.2 Linux进程控制2. exec函数族(续)29 6.2 Linux进程控制6.2.3 进程终止正常终止(1)在main函数内执行re
12、turn语句,等效于调用exit(2)调用exit函数。此函数由ANSI C定义,执行终止处理,关闭标准I/O(3)调用_exit系统函数,此函数由exit调用。异常终止(1)调用abort(2)由一个信号终止。30 6.2 Linux进程控制p exit函数与_exit函数的区别进程开始运行调用退出处理函数清理I/O缓冲调用exit系统调用进程结束运行_exit()exit()31 6.2 Linux进程控制pexit函数与_exit函数的区别(续)_exit()函数直接终止进程运行,清除其使用的内存空间,并清除其在内核中的各种数据;可能造成缓冲区中的数据丢失exit()函数则在程序退出之前
13、查看文件的打开情况,把文件缓冲区内容写回文件,能够保证数据的完整性,推荐使用。32 6.2 Linux进程控制p例:设计程序,要求子进程、父进程分别在输出文字后用exit函数、_exit函数终止进程。printf函数使用缓冲I/O方式,遇到”n”换行符时,自动从缓冲区将记录读出。此处无”n”,加之调用的是_exit函数,故无法输出该条语句内容33 6.2 Linux进程控制p例:设计程序,要求子进程、父进程分别在输出文字后用exit、_exit终止进程。(续) 运行结果:34 6.2 Linux进程控制p例(续) 若将源代码改为: 则运行结果为:35 6.2 Linux进程控制6.2.4 僵尸
14、进程(zombie)p 一个已经终止运行、但其父进程尚未对其进行善后处理(获取被终止的子进程的有关信息、释放被它占用的资源)的进程被称为僵尸进程(Zombie)。p ps命令(ps 进程ID)将僵尸进程的状态显示为Zp 例如fork函数创建子进程后,子进程的终止可能晚于父进程的终止,当父进程终止后,子进程还没有终止,子进程就会进入一种无父进程的状态,变成僵尸进程。(该说法不正确,见例6-2.c)p 使用wait或waitpid函数,使得子进程的终止早于父进程的终止,让父进程了解子进程终止时的状态,避免/清除僵尸进程。p wait函数使父进程阻塞,直到子进程终止或者父进程收到一个指定的信号。wa
15、it函数是waitpid函数的特例。36 6.2 Linux进程控制6.2.4 僵尸进程p 例6-5:僵尸进程的产生。僵尸进程产生的原因:子进程运行结束时,父进程在睡眠,父进程无法对子进程进行“善后”处理,因此子进程变为僵尸进程。37 6.2 Linux进程控制6.2.4 僵尸进程p 例6-5:(续)运行结果:程序运行结束时,init进程自动清理它所继承的僵尸进程38 6.2 Linux进程控制6.2.4 僵尸进程p 例6-5:(续)消除僵尸进程的产生:39 6.2 Linux进程控制6.2.4 僵尸进程p 例6-5:(续)消除僵尸进程的产生:运行结果40 6.2 Linux进程控制6.2.4
16、 僵尸进程p wait函数 等待子进程中断或结束,即wait()暂停目前进程的执行,直到有信号到来或子进程终止 函数原型:pid_t wait(int *status); /status是子进程状态值 执行成功则返回子进程的进程号(PID),如有错误则返回-1,失败原因存于errno中 所需头文件:#include #includep waitpid函数 函数原型:pid_t waitpid(pid_t pid, int *status, int options); 其中,pid是子进程号,status是子进程状态值,options可为041 6.2 Linux进程控制6.2.4 僵尸进程p
17、例6-6:设计一个程序,创建一个子进程,子进程显示自己的进程号(PID)后暂停一段时间(5S);父进程等待子进程执行,直至其结束;父进程打印所等待进程的进程号(PID)、所等待进程的退出状态。开始用fork函数创建子进程判断返回值父进程用wait函数等待子进程阻塞父进程捕获子进程终止、后续操作结束出错父进程暂停打印文字,显示自身进程号(PID)等待5S子进程终止子进程=0042 6.2 Linux进程控制6.2.4 僵尸进程p 例6-6(续)43 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-6(续)p 说明: 当子进程退出时,向父进程发送一个SIGCHLD信号 此前,子进程状
18、态一直保留在内存中,直到其父进程调用wait函数收集状态信息,才会清空该进程状态 父进程调用wait,阻塞父进程的运行,等待子进程正常结束,从而避免了子进程成为僵尸进程。 在wpid=wait(&status)语句中,子进程结束后,将结束状态存于status WEXITSTATUS(status),取得子进程中exit()函数返回的代码44 6.2 Linux进程控制6.2.4 僵尸进程(续)p 附:宏是一种规则或模式,或称语法替换。用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串)。这种替换在预编译时进行,称作宏展开。判断子进程结束情况的几个宏
19、:WIFEXITED(status) 如果子进程正常结束则为非0值WEXITSTATUS(status) 取得子进程中exit()返回的结束代码(一般先用WIFEXITED判断是否正常结束)WIFSIGNALED(status) 如果子进程因为信号而结束,此宏值为真WTERMSIG(status) 取得子进程因信号而终止的信号代码(信号编号)WIFSTOPPED(status) 如果子进程处于暂停执行情况,则此宏值为真(一般使用WUNTRACED时才出现此情况)WSTOPSIG(status) 取得引发子进程暂停的信号代码45 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-7
20、在父进程中使用waitpid函数等待子进程,子进程结束时通过调用exit(3)向父进程发送结束信号。父进程通过WIFEXITED(status)取得子进程返回的结束代码。46 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-7 (续)运行结果:思考题1:6-6.new.c思考题2:6-6.new3.c47 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-8:设计程序,由用户选择是否创建子进程,父进程判断子进程是否正常终止。48 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例(续)49 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-8(续)
21、运行结果:50 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-8(续)运行结果:51 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-8(续)在没有语法、语义错误的情况下,有时多进程程序的输出变得不可控例如,去掉waitpid函数的运行结果:52 6.2 Linux进程控制6.2.4 僵尸进程(续)p 例6-8(续)去掉waitpid函数的运行结果(续):因此要养成使用完进程后及时终止的习惯,且要灵活使用wait、waitpid函数,让子进程工作完成后再终止当前进程。53 6.2 Linux进程控制守护进程(daemon)是运行在后台,且一直在运行的一种特殊进程。
22、它独立于控制终端,且周期性地执行某种任务或等待处理某些发生的事件。6.3.1 守护进程及其特性守护进程在后台运行(最重要的特性)守护进程必须与其运行前的环境隔离开来(这些环境通常是守护进程从它的父进程(特别是shell)中继承下来的),具体环境包括l未关闭的文件描述符l控制终端l会话和进程组l工作目录以及文件创建掩码等守护进程的启动方式有其特殊之处:l可以从启动脚本/etc/rc.d中启动l可以由作业控制进程crond启动l可以由用户终端(通常是shell)执行启动54 6.2 Linux进程控制6.3.2 编写守护进程的要点(1)创建子进程,终止父进程 该步骤使得程序在shell终端造成已经
23、运行完毕的假象,之后的工作都在子进程中完成,使程序以僵尸进程形式运行(有问题),在形式上与控制终端脱离。代码如下:pid=fork();if (pid0) exit(0); /终止父进程(2)在子进程中创建新会话(此为最重要的一步) 调用setsid函数创建一个新的会话,使进程摆脱原会话、原进程组、原控制终端的控制。(3)改变工作目录 调用chdir函数改变当前工作目录,如”/”或”/tmp” .55 6.2 Linux进程控制6.3.2 编写守护进程的要点(续)(4)重设文件创建掩码 调用umask函数,把文件创建掩码设置为0,例如umask(0),从而免去子进程使用文件时所产生的诸多麻烦,
24、大大增强该守护进程的灵活性。(5)关闭文件描述符 子进程从父进程那里继承的一些已经打开的文件,可能消耗系统资源。可采用如下方式关闭文件描述符。for (i=0; iNOFILE; i+) close(i);for (i=0; iMAXFILE; i+) close(i);附:dup2函数的使用:http:/ 6.2 Linux进程控制6.3.3 守护进程的编写p 例6-9:设计6-9.c以及init.c. 其中init.c负责生成守护进程;主程序每隔10秒向/tmp目录中的日志6-9.log报告运行状态57 6.2 Linux进程控制6.3.3 守护进程的编写p 例6-9(续)调用该函数后,主
25、程序变成了守护进程/参考P195页fopen函数58 6.2 Linux进程控制6.3.3 守护进程的编写p 例6-9:运行结果59 6.2 Linux进程控制6.3.3 守护进程的编写p Linux系统中,编写调试守护进程,一般利用系统的日志服务。通过调用syslog函数控制所编写的守护进程的警告信息。例如将出错信息写入系统日志文件/var/log/syslogp 例6-10 设计一个程序,要求运行后成为守护进程,守护进程又创建一个子进程;守护进程(第一子进程)和子进程(第二子进程)都调用syslog函数,把结束前的状态写入系统日志文件。6061 6.2 Linux进程控制6.3.3 守护进
26、程的编写 例6-10(续)注:setsid函数用于创建一个新会话,让子进程摆脱原会话、原进程组、原控制终端的控制,从而使子进程完全独立出来62 6.2 Linux进程控制6.3.3 守护进程的编写 例6-10(续)63 6.2 Linux进程控制6.3.3 守护进程的编写p 例6-10:运行结果p 该程序展示了如何利用系统日志管理服务,通过写入系统日志文件的形式调试守护进程64 6.2 Linux进程控制6.3.3 守护进程的编写p 相关知识介绍所需头文件#include 函数功能打开系统记录文件函数原型void openlog(char *ident, int option, int facility);函数传入值option参数:LOG_PID 将信息字符串加上产生信息的进程号(PID)(一般指父进程号?错!?错!)facility参数:LOG_DAEMON 由系统daemon产生的信息函数返回值无openlog函数参考:http:/ 6.2 Linux进程控制6.3.3 守护进程的编写p 相关知识介绍所需头文件#include 函数功能将信息记录至系统日志文件函数原型void syslog(int priority, char *format, );函数传入值priority指定信息
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆保养与智能诊断系统接入协议
- 五年级数学(小数四则混合运算)计算题专项练习及答案
- 劳务人员假期管理制度
- 包装印刷安全管理制度
- 高中历史岳麓版一轮课件36现代科学革命与改变世界的高新科技
- 江苏省南京市镇江市徐州市联盟校2024-2025学年高二下学期5月学情调研试题化学
- 2025年河北省邯郸市武安市贺进镇翟家庄中学、沙名中学联考中考二模数学试题
- 上海交通职业技术学院《游戏视觉设计》2023-2024学年第二学期期末试卷
- 盘锦职业技术学院《陶瓷鉴赏和中国文化》2023-2024学年第二学期期末试卷
- 江西旅游商贸职业学院《统计学与软件》2023-2024学年第二学期期末试卷
- 九宫数独200题(附答案全)
- 人教版2024年小升初语文模拟试卷(含答案解析)
- 2024年山东高压电工题库电工高级工考试题库(全国版)
- 内镜下硬化剂治疗护理
- 三公经费违规的主要表现及防范措施
- 高中英语外研版(2019)选择性必修第一册各单元主题语境与单元目标
- 游艇运营方案
- 人教版八年级下学期音乐期末考试试卷(含答案)
- 给小学生科普人工智能
- 以青春之名励青春之志
- 思维导图(高分作文写作)
评论
0/150
提交评论