《嵌入式系统设计与应用:第7讲 嵌入式Linux进程控制开发》由会员分享,可在线阅读,更多相关《嵌入式系统设计与应用:第7讲 嵌入式Linux进程控制开发(15页珍藏版)》请在金锄头文库上搜索。
1、进程控制开发 文件是Linux中最常见最基础的操作对象,而进程则是系统调度的单位,在上一课学习了文件I/O控制之后,本次课主要讲解进程控制开发部分,通过本次课的学习,读者将会掌握以下内容:掌握进程相关的基本概念 掌握Linux下的进程结构 掌握Linux下进程创建及进程管理 掌握Linux下进程创建相关的系统调用 掌握守护进程的概念 掌握守护进程的启动方法 掌握守护进程的输出及建立方法 学会编写多进程程序、学会编写守护进程 进程的定义 进程的概念首先是在60年代初期由MIT的Multics系统和IBM的TSS/360系统引入的。经过了40多年的发展,人们对进程有过各种各样的定义。现列举较为著名
2、的几种。(1)进程是一个独立的可调度的活动(E. Cohen,D. Jofferson)(2)进程是一个抽象实体,当它执行某个任务时,将要分配和释放各种资源(P. Denning)(3)进程是可以并行执行的计算部分。(S. E. Madnick,J. T. Donovan)进程与程序的区别以上进程的概念都不相同,但其本质是一样的。它指出了进程是一个程序的一次执行的过程。它和程序是有本质区别的,程序是静态的,它是一些保存在磁盘上的指令的有序集合,没有任何执行的概念;而进程是一个动态的概念,它是程序执行的过程,包括了动态创建、调度和消亡的整个过程。它是程序执行和资源管理的最小单位。因此,对系统而言
3、,当用户在系统中键入命令执行一个程序的时候,它将启动一个进程。 进程控制块 进程是Linux系统的基本调度单位,那么从系统的角度看如何描述并表示它的变化呢?在这里,是通过进程控制块来描述的。进程控制块包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。在Linux中,进程控制块中的每一项都是一个task_struct结构,它是在include/linux/sched.h中定义的。 进程的标识 在Linux中最主要的进程标识有进程号(PID,Process Idenity Number)和它的父进程号(PPID,parent process ID)。其中PID惟一地标识一个进程。
4、PID和PPID都是非零的正整数。在Linux中获得当前进程的PID和PPID的系统调用函数为getpid和getppid,通常程序获得当前进程的PID和PPID可以将其写入日志文件以做备份。 getpid和getppid系统调用过程 /*process.c*/#include#include#include int main()/*获得当前进程的进程ID和其父进程ID*/ printf(The PID of this process is %dn,getpid(); printf(The PPID of this process is %dn,getppid();进程运行的状态 进程是程序的
5、执行过程,根据它的生命期可以划分成3种状态。 执行态:该进程正在,即进程正在占用CPU。 就绪态:进程已经具备执行的一切条件,正在等待分配CPU的处理时间片。 等待态:进程不能使用CPU,若等待事件发生则可将其唤醒。 Linux下的进程结构 Linux系统是一个多进程的系统,它的进程之间具有并行性、互不干扰等特点。也就是说,进程之间是分离的任务,拥有各自的权利和责任。其中,每一个进程都运行在各自独立的虚拟地址空间,因此,即使一个进程发生异常,它也不会影响到系统中的其他进程。Linux中的进程包含3个段,分别为“数据段”、“代码段”和“堆栈段”。Linux下进程的模式和类型 在Linux系统中,
6、进程的执行模式划分为用户模式和内核模式。如果当前运行的是用户程序、应用程序或者内核之外的系统程序,那么对应进程就在用户模式下运行;如果在用户程序执行过程中出现系统调用或者发生中断事件,那么就要运行操作系统(即核心)程序,进程模式就变成内核模式。在内核模式下运行的进程可以执行机器的特权指令,而且此时该进程的运行不受用户的干扰,即使是root用户也不能干扰内核模式下进程的运行。 用户进程的两种运行模式 Linux下的进程管理 1启动进程Linux下启动一个进程有两种主要途径:手工启动和调度启动。手工启动是由用户输入命令直接启动进程,而调度启动是指系统根据用户的设置自行启动进程。(2)调度启动有时,
7、系统需要进行一些比较费时而且占用资源的维护工作,并且这些工作适合在深夜无人职守的时候进行,这时用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统就会自动完成这一切工作。 Linux进程控制编程 进程创建1fork()在Linux中创建一个新进程的惟一方法是使用fork函数。fork函数是Linux中一个非常重要的函数,和读者以往遇到的函数也有很大的区别,它执行一次却返回两个值。 fork函数语法要点 所需头文件#include / 提供类型pid_t的定义#include 函数原型pid_t fork(void)函数返回值0:子进程子进程ID(大于0的整数):父进程1:出错ex
8、ec函数族 fork函数是用于创建一个子进程,该子进程几乎拷贝了父进程的全部内容,但是,这个新创建的进程如何执行呢?这个exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新的进程替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行的脚本文件。exec函数族成员函数语法 所需头文件#include 函数原型int execl(const char *path, const char *arg, .)int execv(const char *path, char *const argv)int execle(const char *path, const char *arg, ., char *const envp)int execve(const char *path, char *const argv, char *const envp)int execlp(const char *file, const char *arg, .)int execvp(const char *file, char *const argv)函数返回值1:出错