LOGO第十章第十章进程间通信进程间通信嵌入式进程间通信进程间通信IPC(InterProcess Communication)是一种进程之间交换信息是一种进程之间交换信息的一种技术,的一种技术,IPC表示各种进程通信方式的表示各种进程通信方式的统称统称IPC的类型有管道、消息队列、信号量、共的类型有管道、消息队列、信号量、共享存储、网络等享存储、网络等并不是所有的系统都支持所并不是所有的系统都支持所 有的进程间通有的进程间通信方式信方式进程间通信的概念进程间通信的概念半双工管道简称管道,它是半双工管道简称管道,它是UNIX IPC的最的最老形式,是所有的老形式,是所有的UNIX系统都支持的系统都支持的IPC管道有两种限制,一是半双工,数据只能管道有两种限制,一是半双工,数据只能在一个方向上流动,二是它们只能在具有在一个方向上流动,二是它们只能在具有共同祖先的进程间使用共同祖先的进程间使用流管道没有第一种限制,流管道没有第一种限制,FIFO和命名管道和命名管道没有第二种限制没有第二种限制管道的创建管道的创建管道管道在单进程中使用管道没有意义,管道通常在单进程中使用管道没有意义,管道通常使用在父子进程间进行通信使用在父子进程间进行通信fork函数的子进程继承父进程打开的文件描函数的子进程继承父进程打开的文件描述符,包括管道,在父子进程中各关闭管述符,包括管道,在父子进程中各关闭管道的一端就能建立起一条父子进程的通道道的一端就能建立起一条父子进程的通道父子进程关闭的管道端决定了通道的方向父子进程关闭的管道端决定了通道的方向管道的通信管道的通信对管道的读写操作与文件对管道的读写操作与文件IO相同接口相同接口当读一个写端已被关闭的管道时,在所有当读一个写端已被关闭的管道时,在所有数据都被读取后,数据都被读取后,read返回返回0,表示达到文,表示达到文件结束,而不返回件结束,而不返回EOF,因为写端的进程,因为写端的进程未终止未终止当写一个读端已被关闭的管道时,则产生当写一个读端已被关闭的管道时,则产生信号信号SIGPIPE,如果忽略或捕捉该信号,如果忽略或捕捉该信号,则则write函数出错返回,函数出错返回,errno置为置为EPIPE写管道有最大写管道有最大 缓冲,超过时有可能在多进缓冲,超过时有可能在多进程写时发生数据穿插程写时发生数据穿插管道的通信规则管道的通信规则因为常见的操作是创建一个连接到另一个因为常见的操作是创建一个连接到另一个进程的管道,然后读其输入或向其发送输进程的管道,然后读其输入或向其发送输入,所以标准入,所以标准IO提供一组函数实现此功能,提供一组函数实现此功能,它创建一个管道,它创建一个管道,fork一个进程,关闭管道一个进程,关闭管道的不使用端,的不使用端,exec一个一个shell执行命令,最执行命令,最后等待命令终止后等待命令终止popen/pclose函数函数UNIX过滤程序从标准输入读取数据,对其过滤程序从标准输入读取数据,对其进行适当处理后写到标准输出。
进行适当处理后写到标准输出当同一个程序产生某个过滤程序的输入,当同一个程序产生某个过滤程序的输入,同时又读取该过滤程序的输出是,则该过同时又读取该过滤程序的输出是,则该过滤程序就成为协同进程滤程序就成为协同进程popen函数提供了连接到另一个进程的标函数提供了连接到另一个进程的标准输入或输出的单行管道,而对于协同进准输入或输出的单行管道,而对于协同进程,它有连接到另一个进程的程,它有连接到另一个进程的2为何单行管为何单行管道,一个输入一个输出,先将要处理的数道,一个输入一个输出,先将要处理的数据写到输入,经过处理后再从输出读据写到输入,经过处理后再从输出读协同进程协同进程FIFO又称命名管道不相关的进程也能通又称命名管道不相关的进程也能通过命名管道来交换数据过命名管道来交换数据FIFO管道的创建管道的创建非阻塞标志对管道的影响非阻塞标志对管道的影响类似普通管道,若写一个尚无进程为读打类似普通管道,若写一个尚无进程为读打开的开的FIFO,产生信号,产生信号SIGPIPE一个给定的一个给定的FIFO可以有多个写进程,参数可以有多个写进程,参数PIPE_BUF说明了原子写的最大数据量说明了原子写的最大数据量。
若某个若某个FIFO的最后一个写进程关闭了该的最后一个写进程关闭了该FIFO,则为读该,则为读该FIFO的进程产生一个的进程产生一个EOFFIFOFIFO由由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结构结构创建一个共享存储区创建一个共享存储区操作一个共享存储区操作一个共享存储区连接连接/解除连接一个共享存储区解除连接一个共享存储区共享存储共享存储LOGO嵌入式。