嵌入式Linux高级编程--03posix_进程管理

上传人:ji****72 文档编号:51944652 上传时间:2018-08-17 格式:PPT 页数:25 大小:1.20MB
返回 下载 相关 举报
嵌入式Linux高级编程--03posix_进程管理_第1页
第1页 / 共25页
嵌入式Linux高级编程--03posix_进程管理_第2页
第2页 / 共25页
嵌入式Linux高级编程--03posix_进程管理_第3页
第3页 / 共25页
嵌入式Linux高级编程--03posix_进程管理_第4页
第4页 / 共25页
嵌入式Linux高级编程--03posix_进程管理_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《嵌入式Linux高级编程--03posix_进程管理》由会员分享,可在线阅读,更多相关《嵌入式Linux高级编程--03posix_进程管理(25页珍藏版)》请在金锄头文库上搜索。

1、嵌入式Linux高级编程Linux进程管理王莉进程的定义和特征进程的定义 进程是一个具有一定独立功能的程序关于某个数据集 合的一次运行活动。 进程的实体结构 (1)进程控制块(PCB) (2)程序段 (3)数据段进程控制块进程控制块是进程实体的一部分,是操作系统中最重要的记录 型数据结构。PCB中记录了操作系统所需的,用于描述进程进 展情况及控制进程运行所需的全部信息。 PCB是进程存在的惟一标志。 一般把PCB存放在操作系统专门开辟的PCB区内。 在进程控制块中,主要包括下述4方面的信息。 (1)进程描述信息 进程标识符。每个进程都有惟一的进程标识符,用以识别不同 的进程。 用户名或用户标识

2、号。每个进程都隶属于某个用户,有利于资 源共享与保护。 家族关系。标识进程之间的家族关系。进程控制块(2)处理机状态信息通用寄存器、指令计数器、程序状态字(PSW)、用户栈指针等 (3)进程调度信息进程状态。指明进程的当前状态,以作为进程调度和进程对换时的依据。 进程优先级。用于描述进程使用处理机的优先级别的一个整数,优先级别高的进程 先获得处理机。 进程调度所需的其他信息。如进程已等待CPU的时间总和、进程已执行的时间总和 等。 事件。指进程被阻塞的原因。 (4)进程控制信息 程 序和数据的地址。指出该进程的程序和数据所在的内存或外存地址,以便再调 度到该进程执行时,能从中找到其程序和数据。

3、 进程同步和通信机制。指实现进程同步和进程通信时所必须的机制,如消息队列指针、信号量等。这些数据应全部或部分地存放在PCB中。进程的状态及其转换1进程的基本状态(1)就绪状态 当进程已分配到除处理机以外的所有必要的资源后,只要再 获得处理机便可立即执行,这时进程的状态称为就绪状态。 (2)执行状态 执行状态是指进程已获得处理机、其程序正在执行的状态。 (3)阻塞状态 正在执行的进程因发生某事件而暂时无法继续执行时,便放 弃处理机而处于暂停状态,这种暂停状态被称为阻塞状态。 进程的状态及其转换命令行参数两种获得命令行参数的写法: main(int argc, char *argv); main(

4、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)。该函数被调用一次,但返回两次。两次返回的区别是

5、子进程的返回 值是0,而父进程的返回值则是子进程的进程ID。一般来说,在fork之后是父进程先执行还是子进程先执行是不确定 的。这取决于内核所使用的调度算法。 父、子进程之间的区别fork的返回值; 进程ID、不同的父进程ID;父进程设置的锁,子进程不继承; 子进程的未决告警被清除; 子进程的未决信号集设置为空集。父、子进程之间的继承使用fork函数得到的子进程是父进程的处继承了整个 进程的地址空间,包括:进程上下文、进程堆栈、内 存信息、打开的文件描述符、信号控制设置、进程优 先级、进程组号、当前工作目录、根目录、资源限制 、控制终端等。#include #include #include

6、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()由信号终

7、止exit和_exitexit和_exit用于中止进程; _exit的作用:直接使进程停止运行,清除其使用的内 存空间,并清除其在内核中的数据结构; exit与_exit函数不同,exit函数在调用exit系统之前要 检查文件打开情况把文件缓冲区的内容写回文件中去 。如调用printf()函数。进程运行调用退出处理函数清除I/O缓冲调用_exit系统调用进程终止运行_exitexitexec函数在用fork函数创建子进程后,子进程往往要调用一 个exec函数以执行另一个程序。 当进程调用一种exec函数时,该进程完全由新程 序代换,而新程序则从其main函数开始执行。因 为调用exec并不创建

8、新进程,所以前后的进程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

9、(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 *p

10、s_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函数当一个

11、进程正常或异常终止时,内核就向其父进程发 送SIGCHLD信号。因为子进程终止是个异步事件(这 可以在父进程运行的任何时候发生),所以这种信号也 是内核向父进程发的异步通知。父进程可以忽略该信 号,或者提供一个该信号发生时即被调用执行的函数( 信号处理程序)。对于这种信号的系统默认动作是忽略 它。 wait函数用于使父进程阻塞,直到一个子进程结束或 者该进程接收到一个指定信号为止。wait和waitpid函数调用wait或waitpid的进程可能会: 阻塞(如果其所有子进程都还在运行)。 带子进程的终止状态立即返回(如果一个子进程已终止 ,正等待父进程存取其终止状态)。 出错立即返回(如果它没

12、有任何子进程)。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 #in

13、clude #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“, ge

14、tppid();exit(EXIT_SUCCESS);else waitpid( childpid, puts( “in parent“ );printf( “tparent pid = %dn“, getpid() );printf( “tparent ppid = %dn“, getppid() );printf( “tchild process exited with status %d n“, status );exit(EXIT_SUCCESS); system函数在程序中执行一个命令字符串很方便。 #include int system(const char * cmdstring);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号