版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章Linux进程管理第5章Linux进程管理2015年10月进程退出执行命令进程创建本章介绍进程基本概念、进程的创建和命令执行、进程的退出及开发实例。2015年10月第5章Linux进程管理5.3进程退出35.2进程创建和命令执行325.1进程基本概念315.4进程开发实例45.1进程基本概念2015年10月进程进程种类Linux以进程为单位分配计算机资源。
进程是程序在系统中的一次执行过程。
进程由程序和进程控制块(PCB)所构成。
进程是一个随时都可能发生变化的、动态的、使用系统运行资源的程序。
一个程序运行可产生多个进程。交互进程:由Shell启动的进程
批处理进程:与终端没有关系,是一个进程序列,由多个进程按照指定方式运行。
守护进程:Linux启动时启动的进程,在后台运行。5.1进程的基本概念(续)2015年10月让程序在后台运行:在输入这执行命令后面加&将后台执行进程转为前台执行:fg将前台执行的进程转为后台执行:bg查询正在执行的进程:ps命令向正在执行的进程发送信号:kill命令5.2进程创建和命令执行进程创建(fork调用)2015年10月#include<unistd.h>pid_tfork(void);/*返回0,子进程号,或-1*/执行时,完成以下任务:①为子进程分配新的内存块和内核数据结构;②复制原来进程信息到新进程,子进程和父进程具有相同可执行代码;③向运行进程集添加新进程;④fork执行结束后,将控制返回给两个进程,两个进程可独立执行,执行顺序取决于进程调度。进程创建2015年10月Beforepid=fork()AfterBeforepid=fork()AfterBeforepid=fork()After子进程Beforepid=fork()After主进程返回0返回子进程编号可通过getpid()获得本进程号fork()调用实例一
例5-1fork调用实例,考察输出行数2015年10月#include<unistd.h>#include<stdio.h>#include<stdlib.h>Intmain(intargc,char*argv[]){intret_from_fork,mypid;mypid=getpid();printf(“Before:mypidis%d\n”,mypid);ret_from_fork=fork();sleep(1);printf(“After:mypidis%d,fork()said%d\n”,getpid(),ret_from_fork);exit(0);}生成子进程延时1秒获得父进程号获得进程号例5-2父子进程间数据是否相互影响2015年10月#include<sys/types.h>#include<unistd.h>#include<stdio.h>intglob=10;//全局变量intmain(intargc,char*argv[]){intlocal;pid_tpid;local=8;if((pid=fork())==0){//子进程执行该代码sleep(2);}elseif(pid>0){//父进程要执行的代码glob++;locpial--;sleep(10);}printf(“glob=%d,local=%d,mypid=%d\n”,glob,local,getpid());exit(0);}fork()调用通过exec系列系统调用2015年10月exec系列调用execlexecvexeclpexecvpintexecl(constchar*path,constchar*arg0,…,NULL);intexecv(constchar*path,constchar*argv[]));intexeclp(constchar*path,constchar*arg0,…,NULL);intexecvp(constchar*path,constchar*argv[]));提供执行命令绝对或相对路径使用$PATH查找执行程序exec调用会将主进程程序体替换2015年10月Before父进程If(fork()==0){execv(“test”,arg);}AfterBefore子进程If(fork()==0){execv(“test”,arg);}Afterfork()返回0test程序覆盖子进程空间例子5-3系统调用演示程序2015年10月#include<unistd.h>#include<stdio.h>intmain(intargc,char*argv[]){char*arglist[3];pid_tpid;arglist[0]=“ls”;arglist[1]=“-l”;arglist[2]=0;if((pid=fork())==0){execvp(“ls”,arglist);}printf(“******Programisover.Bye\n”);}
参数表中,参数0是执行命令例子5-4在子进程和父进程写入文件2015年10月#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>intmain(ingargc,char*argv[]){charbuf[10];char*str1=“Thisischildprocess”;char*str2=“Thisisparentprocess”;pid_tpid;intfd,readsize;fd=open(“test.txt”,O_WRONLY);if(fd==-1){perror(“openfailed”);exit(0);}readsize=read(fd,buf,5);pid=fork();switch(pid){case-1:perror(“forkfailed”);exit(0);br1,eak;case0:write(fd,strlen(str1));break;defalt:write(fd,str2,strlen(str2));}}注意文件写入结果5.3进程退出三种进程退出方式2015年10月进程退出方式正常运行结束调用_exit()调用exit()进程退出2015年10月进程运行调用退出处理函数清理I/O缓冲区调用_exit系统调用进程终止运行exit()_exit()5.3.1守护进程什么是守护进程
守护进程是脱离终端并且在后台运行的进程。如何创建守护进程2015年10月创建子进程让子进程脱离控制终端改变当前目录为根目录修改文件权限掩码关闭文件描述符fork()Setsid()chdir(“/”);umask(0)close(fd)创建守护进程实例2013年10月#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<string.h>#include<sys/wait.h>#defineMAXFILE65535intmain(ingargc,char*argv[]){pid_tpC;inti,fd,len;char*buf=“Hello,everybody!\n”;len=strlen(buf);if((pc=fork())<0){printf(“forkerror\n”);exit(1);}elseif(pc>0)exit(0);setsid();chdir(“/”);umask(0);for(i=0;i<MAXFILE;i++)while(1){if((fd=open(“/temp/daemon.log”,O_CREAT|O_RWONLY|O_APPEND,0600))<0){perror(“open”);exit(1);}write(fd,buf,len+1);close(fd);sleep(10);}}
编译后在后台运行该程序5.3.2僵尸进程进程结束退出后,还残留一些进程占用的内存数据结构(如PCB)。如子进程结束于父进程前,而父进程没使用wait调用获得子进程结束状态,子进程成为僵死进程。2015年10月#include<stdio.h>#include<unistd.h>voidparent_code(intdelay){sleep(delay);}intmain(intargc,char^argv[]){pid_tpid;intstatus;if((pid=fork())==0);if(pid>0)parent_code(100000);}子进程什么也不做,成为僵尸进程。5.3.4进程退出状态通过调用系统调用wait()可获得进程退出的状态。2015年10月#include<sys/wait.h>#include<sys/types.h>pid_twait(int*status);返回子进程号,返回状态存在status中不存在子进程返回-1例子5-7wait系统调用2015年10月#include<stdio.h>#include<sys/wait.h>#include<sys/types.h>#include<unistd.h>Voidchild(intdelay){sleep(delay);exit(0);}Voidparent(int*status){wait(status);exit(0);}intmain(intargc,char*argv[]){pid_tpid;intstatus;printf(“Before:mypidis%d\n”,getpid());pid=fork();if(pid==0)child(1000);if(pid>0)parent(&status);}若需要非阻塞式调用,可使用waitpid()调用等待特定子进程退出,且可获得其状态。pid_twaitpid(pid_tpid,int*status,intoption);5.4进程开发实例程序功能:执行程序时,等待用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生涯展望-追梦进行时 教学设计-2025-2026学年高一上学期生涯导航课程
- RAG赋能知识问答助手方案课程设计
- 2026年银行招聘考试《综合知识》专项训练试卷(附答案)
- 人教部编版一年级下册语文园地三获奖教学设计
- 河北省邯郸市肥乡区七年级生物下册 12.1神经系统与神经调节教案 (新版)北师大版
- 认识人工智能 教学设计-高中信息技术教科版(2019)必修1数据与计算
- 云南省潞西市芒市高中政治 4.1 传统文化的继承教学设计 新人教版必修3
- 我爱米兰教学设计小学音乐人音版五线谱三年级下册-人音版(五线谱)
- 人教版地理必修三教学设计2.3问题探究为什么停止开发北大荒
- 陕旅版五年级下册Unit2SpringIsComing!教案
- 单位食堂食品安全管理方案
- 成都兴城投资集团有限公司成都天府乡村发展集团有限公司2026年招聘综合管理部文秘岗等岗位的考试参考题库及答案详解
- 2026广东广州市南沙区横沥镇编外人员招聘8人考试备考试题及答案详解
- 山东省东营市2026届中考数学试卷(含答案)
- 2026法检系统书记员招聘考试(书记员知识 综合知识 行测 申论)历年参考题库含答案详解3卷
- 新版(2026秋新版)部编版语文九年级上册教学计划合集
- T CCIAT 0112‑2026 灌注桩缺陷修复技术标准(征求意见稿)
- 成都市市场监督管理局所属事业单位2026年公开招聘编制外工作人员(34人)笔试备考试题及答案详解
- Unit 1 课时1 Section A 1a-1d(教学设计)英语新教材人教版九年级上册
- 2026年新教材人教PEP版五年级上册英语Unit 1 Different friends教学设计
- 大健康加盟合同范本
评论
0/150
提交评论