null第十章
进程间通信第十章
进程间通信嵌入式进程间通信的概念进程间通信IPC(InterProcess Communication)是一种进程之间交换信息的一种技术,IPC
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示各种进程通信方式的统称
IPC的类型有管道、消息队列、信号量、共享存储、网络等
并不是所有的系统都支持所 有的进程间通信方式进程间通信的概念管道半双工管道简称管道,它是UNIX IPC的最老形式,是所有的UNIX系统都支持的IPC
管道有两种限制,一是半双工,数据只能在一个方向上流动,二是它们只能在具有共同祖先的进程间使用。
流管道没有第一种限制,FIFO和命名管道没有第二种限制
管道的创建
管道管道的通信在单进程中使用管道没有意义,管道通常使用在父子进程间进行通信
fork函数的子进程继承父进程打开的文件描述符,包括管道,在父子进程中各关闭管道的一端就能建立起一条父子进程的通道
父子进程关闭的管道端决定了通道的方向
管道的通信管道的通信规则对管道的读写操作与文件IO相同接口
当读一个写端已被关闭的管道时,在所有数据都被读取后,read返回0,表示达到文件结束,而不返回EOF,因为写端的进程未终止
当写一个读端已被关闭的管道时,则产生信号SIGPIPE,如果忽略或捕捉该信号,则write函数出错返回,errno置为EPIPE
写管道有最大 缓冲,超过时有可能在多进程写时发生数据穿插管道的通信规则popen/pclose函数因为常见的操作是创建一个连接到另一个进程的管道,然后读其输入或向其发送输入,所以
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
IO提供一组函数实现此功能,它创建一个管道,fork一个进程,关闭管道的不使用端,exec一个shell执行命令,最后等待命令终止
popen/pclose函数协同进程UNIX过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。
当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出是,则该过滤程序就成为协同进程
popen函数提供了连接到另一个进程的标准输入或输出的单行管道,而对于协同进程,它有连接到另一个进程的2为何单行管道,一个输入一个输出,先将要处理的数据写到输入,经过处理后再从输出读协同进程FIFOFIFO又称命名管道。不相关的进程也能通过命名管道来交换数据
FIFO管道的创建
非阻塞标志对管道的影响
类似普通管道,若写一个尚无进程为读打开的FIFO,产生信号SIGPIPE。
一个给定的FIFO可以有多个写进程,参数PIPE_BUF说明了原子写的最大数据量。
若某个FIFO的最后一个写进程关闭了该FIFO,则为读该FIFO的进程产生一个EOFFIFOFIFO的用途FIFO由shell命令使用以将数据从一条管道线传送到另一条,无需为此而创建中间临时文件
FIFO用于客户机-服务器应用程序中,以在客户机和服务器之间传递数据
FIFO的用途消息队列、信号量和共享存储消息队列、信号量和共享存储是三种系统V的IPC,有许多相似之处
三种IPC都使用一个非负的整数标示符引用
创建时需要指定一个关键字,类型为key_t,内核将关键字转为标示符返回
使用IPC_PRIVATE表示创建一个新的私有IPC结构,也可以在标志位中设置IPC_CREAT来创建一个新的共有IPC结构
可以通过ftok函数指定2个参数来创建一个关键字
消息队列、信号量和共享存储许可权结构当创建IPC时,系统为每个IPC设置一个ipc_perm结构,该结构规定了IPC的许可权和所有者
可以通过相应函数修改IPC的所有者和访问权限
和普通文件一样,IPC有三组访问权限,每组访问权限都只有读和写,没有执行权限
许可权结构限制IPC结构在系统范围内起作用,没有范围计数,即创建一个IPC并添加消息后终止,该消息仍然存在,而对于管道、FIFO,进程终止后就删除管道和管道内的数据
IPC没有名字,无法在文件系统中索引它们,因此不能使用文件IO来操作,而必须使用专门的系统调用函数来操作限制消息队列消息队列克服了早期UNIX IPC的缺点,例如信号能够传输的信息量有限,而管道/命名管道只能传输无格式的字节流,并且受缓冲区大小限制
消息队列是一个消息的链表,消息相当于记录,具有特定的格式和优先级,对消息队列有写权限的进程可以按照一定的规则添加新消息,对消息队列有读权限的进程可以从消息队列中读消息消息队列消息队列消息队列的创建,每个消息队列都有一个msqid_ds结构与其相关,该结构规定了队列的当前状态
对消息队列执行操作,该功能操作类似ioctl函数
添加消息
获取消息
消息队列信号量信号量与管道和消息队列不同,它是一个计数器,用于多线程对共享数据对象的存取
1.测试控制该资源的信号量2.若值为正,则进程可以使用该资源,并将信号量减1。3若信号量值为0,则进程进入休眠直至信号量值大于0,该进程被唤醒后返回步骤1
当进程不再使用该信号量控制的共享资源时,该信号量加1,如果有进程在休眠等待此信号量则唤醒它们
信号量信号量为正确使用信号量,对其的测试及减1操作应当是原子操作,通常在内核实现
初始值为1的信号量称为双态信号量,它控制单个资源
与信号量相关的数据结构为semid_ds
创建一个信号量集合
信号量的操作信号量共享存储共享存储允许两个或多个进程共享一定的存储区,由于不涉及数据的拷贝,这是最快的一种IPC
对共享存储的采取需要同步
每个共享存储都有一个shmid_ds结构
创建一个共享存储区
操作一个共享存储区
连接/解除连接一个共享存储区共享存储null嵌入式