嵌入式Linux编程入门与开发实例-第9章.ppt
上传人:qw****27 上传时间:2024-09-12 格式:PPT 页数:114 大小:2.2MB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

嵌入式Linux编程入门与开发实例-第9章.ppt

嵌入式Linux编程入门与开发实例-第9章.ppt

预览

免费试读已结束,剩余 104 页请下载文档后查看

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第9章进程控制第9章进程控制9.1Linux进程9.1.1Linux进程概述9.1.2Linux进程调度9.1.3进程的内存映像图9-6程序映像的布局9.2进程控制在Linux中主要提供了fork()、vfork()的进程创建方法,介绍如下:1、fork()函数Linux系统启动时往往需要启动很多的系统服务程序,这些系统服务程序往往是运行在后台的,不受用户登录注销的影响,它们一直在运行着,这些服务程序被称为守护进程(daemon)。由于守护进程运行在后台中,不可能向终端输出相关的运行信息,因此,日志系统是守护进程用于记录信息的重要手段。Linux的大多数服务器就是用守护进程的方式实现的。1、正常退出(1)在main()函数中执行return。(2)调用exit()函数。exit()函数原型:voidexit(intstate);(3)调用_exit函数。(4)调用on_exit()函数2、异常退出(1)调用abort()函数。abort()函数原型:voidabort(void);(2)进程收到某个信号,而该信号使程序终止。可以通过设置进程的优先级来保证进程的优先运行。相关的函数有setpriority()、getpriority()和nice()。setpriority()函数的原型为:#include<sys/time.h>#include<sys/resource.h>intsetpriority(intwhich,intwho,intprio);使用fork()或vfork()函数创建子程序后,子程序通常会调用exec()函数来执行另外一个程序。当进程调用exec()函数时,该进程完全由新程序代替,因为并不创建新的进程,所以前后的进程ID并未改变。Linux下exec()函数族有以下6种不同的调用形式,格式如下:#include<unistd.h>intexecve(constchar*path,char*constargv[],char*constenvp[]);intexecv(constchar*path,char*constenvp[]);intexecle(constchar*path,constchar*arg,...);intexecl(constchar*path,constchar*arg,...);intexevp(constchar*file,Har*constargv[]);intexeclp(constchar*file,constchar*arg,...);当子进程先于父进程退出时,如果父进程没有调用wait()和waitpid()函数,子进程就会进入僵死状态。如果父进程调用了wait()或waitpid()函数,就不会使子进程变为僵死进程,这两个函数的声明如下:#include<sys/types.h>#include<sys/wait.h>pid_twait(int*status);pid_twaitpid(pid_tpid,int*status,intoptions);表9-4waitpid()函数参数pid不同取值的对应状态9.3进程间通信管道是Linux最早使用的进程通信机制之一,管道只能实现具有亲缘关系的进程(如父进程与子进程)间的通信,而有名管道克服了这一缺点。管道是单向的,数据只能从一端写入,从另一端读取。如果要进行全双工通信,需要建立两个管道。管道还有其他一些不足,如管道没有名字,管道的缓冲区大小是受限制的,管道所传送的是无格式的字节流。要求管道的输入方和输出方事先约定好数据的格式。管道的不足之处是没有名字,只能用于具有亲缘关系的进程间通信,有名管道(namedpipe或FIFO)可以在互不相关的两个进程间实现彼此通信。有名管道提供一个路径名与之关联,有名管道是一个设备文件。有名管道FIFO严格按照先进先出的规则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾,不支持lseek等文件定位操作。有名管道的创建在Shell方式下可以使用mkfifo()函数和mknod()函数。创建成功后就可以使用open()、read()、write()这些函数了。消息队列是一个存放在内核中的消息链表,每个消息队列由消息队列标识符标识。消息队列是存放在内核中的,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正删除。操作消息队列时用到的数据结构主要有msgbuf、msqid_ds和ipc_perm。信号量的原理是一种数据操作锁的概念,它本身不具备数据交换的功能,而是通过控制其他的通信资源(文件,外部设备等)来实现进程间通信。当请求一个使用信号量来表示的资源时,进程需要先读取信号量的值,以判断相应