
嵌入式Linux高级编程-03posix进程管理.ppt
25页单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,中程信息产业培训网,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,嵌入式,Linux,高级编程,Linux,进程管理,王莉,进程的定义和特征,进程的定义,进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。
进程的实体结构,(,1,)进程控制块(,PCB,),(,2,)程序段,(,3,)数据段,进程控制块,进程控制块是进程实体的一部分,是操作系统中最重要的记录型数据结构PCB,中记录了操作系统所需的,用于描述进程进展情况及控制进程运行所需的全部信息PCB,是进程存在的惟一标志一般把,PCB,存放在操作系统专门开辟的,PCB,区内在进程控制块中,主要包括下述,4,方面的信息1,)进程描述信息,进程标识符每个进程都有惟一的进程标识符,用以识别不同的进程用户名或用户标识号每个进程都隶属于某个用户,有利于资源共享与保护家族关系标识进程之间的家族关系进程控制块,(,2,)处理机状态信息,通用寄存器、指令计数器、程序状态字(,PSW,)、用户栈指针等,(,3,)进程调度信息,进程状态指明进程的当前状态,以作为进程调度和进程对换时的依据进程优先级用于描述进程使用处理机的优先级别的一个整数,优先级别高的进程先获得处理机进程调度所需的其他信息如进程已等待,CPU,的时间总和、进程已执行的时间总和等指进程被阻塞的原因4,)进程控制信息,程 序和数据的地址指出该进程的程序和数据所在的内存或外存地址,以便再调度到该进程执行时,能从中找到其程序和数据。
进程同步和通信机制指实现进程同步和进程通信时所必须的机制,如消息队列指针、信号量等这些数据应全部或部分地存放在,PCB,中进程的状态及其转换,1,进程的基本状态,(,1,)就绪状态,当进程已分配到除处理机以外的所有必要的资源后,只要再获得处理机便可立即执行,这时进程的状态称为就绪状态2,)执行状态,执行状态是指进程已获得处理机、其程序正在执行的状态3,)阻塞状态,正在执行的进程因发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,这种暂停状态被称为阻塞状态进程的状态及其转换,命令行参数,两种获得命令行参数的写法:,main(int argc,char*argv);,main(int argc,char*argv,char*envp);,获取进程标识,#include,#include,pid_t getpid(void);,功能:获取当前进程,ID,返回:调用进程的进程,ID,#include,#include,pid_t getppid(void);,功能:获取父进程,ID,返回:调用进程的父进程,ID,进程创建,#include,#include,pid_t fork(void);,功能:创建一个新的进程。
返回:子进程中为,0,,父进程中为子进程,ID,,出错为,-1,说明:,由,fork,创建的新进程被称为子进程(,child process,)该函数被调用一次,但返回两次两次返回的区别是子进程的返回值是,0,,而父进程的返回值则是子进程的进程,ID,一般来说,在,fork,之后是父进程先执行还是子进程先执行是不确定的这取决于内核所使用的调度算法父、子进程之间的区别,fork,的返回值;,进程,ID,、不同的父进程,ID,;,父进程设置的锁,子进程不继承;,子进程的未决告警被清除;,子进程的未决信号集设置为空集父、子进程之间的继承,使用,fork,函数得到的子进程是父进程的处继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等include,#include,#include,int main(void),pid_t pid;,pid=fork();,switch(pid),case-1:,perror(fork error);,exit(1);,case 0:,printf(I am the child process,my process id is%dn,getpid();,break;,default:,printf(I am the parent process,my process id is%dn,getpid();,break;,return 0;,进程的终止,进程的终止有以下几种方式:,exit(),_exit(),由信号终止,exit,和,_exit,exit,和,_exit,用于中止进程;,_exit,的作用:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的数据结构;,exit,与,_exit,函数不同,,exit,函数在调用,exit,系统之前要检查文件打开情况把文件缓冲区的内容写回文件中去。
如调用,printf,()函数进程运行,调用退出处理函数,清除,I/O,缓冲,调用,_exit,系统调用,进程终止运行,_exit,exit,exec,函数,在用,fork,函数创建子进程后,子进程往往要调用一个,exec,函数以执行另一个程序当进程调用一种,exec,函数时,该进程完全由新程序代换,而新程序则从其,main,函数开始执行因为调用,exec,并不创建新进程,所以前后的进程,ID,并未改变exec,只是用另一个新程序替换了当前进程的正文、数据、堆和栈段exec,函数,#include,int execl(const char*pathname,const char*arg 0,./*(char*)0*/);,int execv(const char*pathname,char*const a rgv );,int execle(const char*pathname,const char*a rg 0,./*(char*)0,char*const e n v p */);,int execve(const char*pathname char*const a rgv,char*const envp );,int execlp(const char*filename,const char*a rg 0,./*(char*)0*/);,int execvp(const char*filename,char*const a rgv );,功能:实现代码替换,返回值:若出错则为,-1,,若成功替换新代码。
exec,函数,E:,指可以传递环境变量表,L:,单独的参数传递,最后要有一个,NULL,V:,传一个指针数组名,P:,按照环境变量来查找,程序举例:,char*ps_argv=“ps”,”-ax”,NULL;,char*ps_envp=“PATH=/bin:/usr/bin”,”TERM=console”,NULL,execl(“/bin/ps”,“ps”,“-ax”,NULL);,execv(“/bin/ps”,ps_argv);,execle(“/bin/ps”,“ps”,“-ax”,NULL,ps_envp);,execve(“/bin/ps”,ps_argv,ps_envp);,execlp(“ps”,“ps”,“-ax”,NULL);,execvp(“ps”,ps_argv);,wait,和,waitpid,函数,当一个进程正常或异常终止时,内核就向其父进程发送,SIGCHLD,信号因为子进程终止是个异步事件,(,这可以在父进程运行的任何时候发生,),,所以这种信号也是内核向父进程发的异步通知父进程可以忽略该信号,或者提供一个该信号发生时即被调用执行的函数,(,信号处理程序,),。
对于这种信号的系统默认动作是忽略它wait,函数用于使父进程阻塞,直到一个子进程结束或者该进程接收到一个指定信号为止wait,和,waitpid,函数,调用,wait,或,waitpid,的进程可能会:,阻塞,(,如果其所有子进程都还在运行,),带子进程的终止状态立即返回,(,如果一个子进程已终止,正等待父进程存取其终止状态,),出错立即返回,(,如果它没有任何子进程,),wait,和,waitpid,函数,#include,#include,pid_t wait(int*status);,pid_t waitpid(pid_t pid,int*status,int options);,功能:等待进程返回值:若成功则为子进程,ID,号,若出错则为,-1.,参数说明:,status,:用于存放进程结束状态pid,:要等待的进程,ID,pid=-1,等待任一子进程于是在这一功能方面,waitpid,与,wait,等效pid 0,等待其进程,ID,与,PID,相等的子进程pid=0,等待其组,ID,等于调用进程的组,ID,的任一子进程pid -1,等待其组,ID,等于,PID,的绝对值的任一子进程。
options,:设置等待方式0,:不设置WNOHANG,:如果没有任何已经结束的进程则马上返回,不等待WUNTRACED,:如果子进程进入暂停状态则马上返回include#include#include#include#include int main(void)pid_t childpid;int status;childpid=fork();if(-1=childpid)perror(fork();exit(EXIT_FAILURE);else if(0=childpid)puts(In child process);sleep(3);/,让子进程睡眠,3,秒,看看父进程的行为,printf(tchild pid=%dn,getpid();printf(tchild ppid=%dn,getppid();exit(EXIT_SUCCESS);else waitpid(childpid,system,函数,在程序中执行一个命令字符串很方便include,int system(const char*cmdstring);,。












