第7章进程控制开发_第1页
第7章进程控制开发_第2页
第7章进程控制开发_第3页
第7章进程控制开发_第4页
第7章进程控制开发_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章进程控制开发理解进程相关的概念学会使用进程控制相关API学习目标进程、进程控制块、进程状态与特点等进程控制编程学习内容定义:是一个具有一定独立功能的程序的一次运行活动。进程是一个独立的可调度的活动是一个抽象实体,当执行某个任务时,要分配和释放各种资源可以并行执行的计算单位程序是一组指令的有序集合,是静态的进程是程序的执行过程,包括创建、调度和消亡过程,是动态的进程与程序特点动态性并发性独立性异步性状态进程的标识1.PID:标识进程的唯一数字(通过getpid()函数获取)2.PPID:父进程的标识(通过getppid()函数获取)进程控制块(PCB)1.包含进程的描述信息、控制信息和资源信息,是进程的静态描述2.由进程控制块、程序段、数据段3个部分组成3.由task_struct数据结构定义,创建一个进程,就产生一个task_struct结构,从父进程继承一些数据,然后插入到进程树中进程描述符包含进程所有的信息,如:状态、调度信息、标识符、文件系统信息等启动进程Linux下进程管理1.手工启动:由用户输入命令直接启动进程,如“ls-l”2.调度启动:系统根据用户的设置自行启动进程,如使用at命令在指定时刻执行进程等进程调度1.包括对进程的中断操作、改变优先级、查看进程状态等2.常见的进程调度算法:先来先服务、短进程优先、高优先级优先、时间片轮转法等3.常见的进程调度命令如下:命令功能ps查看系统中的进程top动态显示系统中的进程nice按用户指定的优先级运行renice改变正在运行进程的优先级kill向进程发送信号bg将挂起的进程放到后台执行进程互斥临界资源(临界区)进程同步死锁……………进程控制与管理的其他概念获取进程标识进程控制编程需要头文件#include<unistd.h>函数原型pid_tgetpid();函数说明pid_t:是一个宏定义,属于int类型返回值非零的正整数1.获取当前进程的PID和PPID#include<stdio.h>#include<unistd.h>voidmain(){ printf("PID=%d\n",getpid()); printf("PPID=%d\n",getppid());} 创建进程fork()1.从已存在的进程(父进程)中创建一个新进程(子进程),子进程有自己独立的进程标识2.创建的子进程是父进程的复制品,从父进程继承了整个进程的信息,即父子两个进程运行同一个程序,但分别在两个不同的地址空间运行3.执行fork()函数后,在父进程中的返回值是子进程的进程号,在子进程中返回0,用以区分是父进程还是子进程需要头文件#include<unistd.h>函数原型pid_tfork();返回值0:

子进程;子进程ID:父进程;-1:出错2.创建一个子进程#include<stdio.h>#include<unistd.h>voidmain(){ pid_tpid; pid=fork(); if(pid==-1) { printf("forkerror!\n"); } elseif(pid==0) { printf("inchildprocess:returnedPID=%d,My_PIDid%d\n",pid,getpid(),getppid()); } else { printf("inpraentprocess:returnedPID=%d,My_PIDid%d\n",pid,getpid()); }}Exec函数族父进程创建子进程,子进程如何执行?1.exec函数族提供了一个进程中启动另一个程序执行的方法2.可从指定的文件名或目录名中找到可执行文件,用它取代进程中的内容,但原进程号保留使用exec函数族的情况1.一个进程想执行另一个程序时,可调用fork()函数新建一个进程,然后调用exec函数族中的任意一个需要头文件#include<unistd.h>函数原型intexecl(constchar*path,constchar*arg,...)intexecv(constchar*path,char*constargv[])intexecle(constchar*path,constchar*arg,...,char*constenvp[])intexecve(constchar*path,char*constargv[],char*constenvp[])intexeclp(constchar*file,constchar*arg,...)intexecvp(constchar*file,char*constargv[])返回值-1:出错1.第5位为“l”—逐个列举参数;“v”—将所有参数整体构造成指针数组传递;2.第6位为:“e”—在envp[]中指定当前进程所使用的环境变量;“p”—只给出文件名,系统会自动按照环境变量指定的路径查找3.参数必须以NULL结束3.应用exec函数族查看系统进程信息(1)使用execlp()#include<stdio.h>#include<unistd.h>voidmain(){ if(fork()==0) { if(execlp("ps","ps","-ef",NULL)<0) { printf("execlperror\n"); } }}(2)使用execl()#include<stdio.h>#include<unistd.h>voidmain(){ if(fork()==0) { if(execl(“/bin/ps","ps","-ef",NULL)<0) { printf("execlerror\n"); } }}4.

exec函数族其他函数的使用(1)使用execle()查看环境变量#include<stdio.h>#include<unistd.h>voidmain(){ char*envp[]={"PATH=/tmp","USER=RPDZKJ",NULL}; if(fork()==0) { if(execle("/usr/bin/env","env",NULL,envp)<0) { printf("execleerror!\n"); } }}(2)使用execve()查看环境变量#include<stdio.h>#include<unistd.h>voidmain(){ char*arg[]={"env",NULL}; char*envp[]={"PATH=/tmp","USER=RPDZKJ“,NULL}; if(fork()==0) { if(execve("/usr/bin/env",arg,envp)<0) { printf("execveerror!\n"); } }}system函数作用:在一个程序内部启动另一个程序,从而创建一个新的进程需要头文件#include<stdlib.h>函数原型intsystem(constchar*string)说明:运行以字符串参数形式传递给它的命令,并等待该命令的完成4.应用system函数查看当前目录下的所有文件(system_ls.c)#include<stdio.h>#include<stdlib.h>voidmain(){ if(system("ls-l")==0) { printf("OK!\n"); } else { printf("error\n"); } }5.应用system函数与exec函数自动编译一个已有的c程序#include<stdio.h>#include<stdlib.h>#include<unistd.h>voidmain(){

system("gccsystem_ls.c-osystem_ls"); printf("gccsystem_ls.csuccess!\n"); if(fork()==0) { if(execlp("./system_ls","system_ls",NULL)<0) { printf("execlperror\n"); } } sleep(3); printf("system_lsrunsuccessfully!\n");}6.练习:P133,例6-9exit和_exit()函数作用:终止进程,清除进程控制块等进程信息1._exit()函数直接终止进程的运行2.exit()函数在终止进程运行之前,检查文件的打开情况,将文件缓冲区的内容写回文件3.函数原型:voidexit(intstatus);status为“0”—正常退出,其他值为异常退出7.exit()与_exit()的比较#include<stdio.h>#include<stdlib.h>voidmain(){ printf("usingexit()....\n"); printf("Thisisthecontentinbuff");

exit(0);}#include<stdio.h>#include<stdlib.h>#include<unistd.h>voidmain(){ printf("usingexit()....\n"); printf("Thisisthecontentinbuff");

_exit(0);}加“\n”后运行结果为什么会不同?wait和waitpid函数子进程的结果作为父进程执行的先决条件,如:子进程创建文件,父进程往文件里写数据时,要求父进程必须等待子进程运行结束。wait()函数作用:使父进程(调用wint()的进程)阻塞,直到一个子进程结束或该进程接到指定的信号为止,若该进程没有子进程或子进程已经结束,则立即返回。waitpid()函数挂起当前进程的执行,直到指定的子进程状态发生变化函数原型pid_twait(int*status)函数参数status—子进程退出时的状态,可以设成NULL返回值成功:结束运行的子进程号失败:-1wait()函数语法函数原型pid_twaitpid(pid_tpid,int*status,intoptions)函数参数pidpid<-1:等待指定进程组中的任何子进程pid=0:等待同一进程组中的任何子进程pid>0:等待进程ID为pid的子进程pid=-1:等待任何子进程的退出,相当于wait()status与wait()相同optionsWNOHANG:若子进程没有结束则马上返回,waitpid()不阻塞WUNTRACED:若子进程进入暂停状态则立即返回0:阻塞父进程,等待子进程退出返回值成功:结束运行的子进程号使用选项WNOHANG且子进程没有退出:0失败:-1waitpid()函数语法8.wait()函数——进程同步:子进程结束后,唤醒父进程#include<stdio.h>#include<stdlib.h>voidmain(){ pid_tpc,pr; pc=fork(); if(pc<0){ printf("erroroccured\n"); }elseif(pc==0){ printf("thisischileprocesswithpid:%d\n",getpid()); sleep(5); }else{

pr=wait(NULL);//父进程阻塞等待 printf("catchedachildprocesswihtpidof%d\n",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论