第第44章章SystemVIPCSystemVIPC进程进程通信通信yy实验目的实验目的实验目的实验目的理解理解SystemVIPCSystemVIPC通信机制工作原理通信机制工作原理掌握和使用共享主存实现进程通信掌握和使用共享主存实现进程通信掌握和使用消息队列实现进程通信掌握和使用消息队列实现进程通信掌握和使用消息队列实现进程通信掌握和使用消息队列实现进程通信掌握和使用信号量实现进程同步掌握和使用信号量实现进程同步2主要内容主要内容主要内容主要内容背景知识背景知识¾¾SystemVSystemV的进程间通信机制的进程间通信机制¾¾消息队列消息队列¾¾信号量信号量¾¾共享主存共享主存实验内容实验内容¾¾消息队列实现进程间通信消息队列实现进程间通信¾¾消息队列实现进程间通信消息队列实现进程间通信¾¾信号量实现进程同步信号量实现进程同步¾¾基于信号量采用多线程技术实现进程同步基于信号量采用多线程技术实现进程同步¾¾基于信号量采用多线程技术实现进程同步基于信号量采用多线程技术实现进程同步¾¾共享主存实现进程间通信共享主存实现进程间通信3SystemVIPCSystemVIPC概述概述SystemVIPCSystemVIPC概述概述IPCIPC资源资源¾¾表示单独的消息队列、共享内存或是信号量集合表示单独的消息队列、共享内存或是信号量集合具有相同类型的接口函数具有相同类型的接口函数信号量实现与其他进程同步信号量实现与其他进程同步¾¾信号量实现与其他进程同步信号量实现与其他进程同步¾¾消息队列以异步方式为通信频繁、但数据量少的进程通信提供服务消息队列以异步方式为通信频繁、但数据量少的进程通信提供服务¾¾共享主存为数据量大的进程间通信提供服务共享主存为数据量大的进程间通信提供服务¾¾共享主存为数据量大的进程间通信提供服务共享主存为数据量大的进程间通信提供服务共同点共同点¾¾通过通过SystemVIPCSystemVIPC对象通信时,需传递该对象的唯一对象通信时,需传递该对象的唯一IPCIPC标识符标识符通过通过yy对象通信时,需传递该对象的唯一对象通信时,需传递该对象的唯一标识符标识符¾¾访问访问SystemVIPCSystemVIPC对象时必须经过许可检验对象时必须经过许可检验¾¾SystemVIPCSystemVIPC对象访问权限的设置由对象的创建者实现对象访问权限的设置由对象的创建者实现¾¾IPCIPC通信机制把通信机制把IPCIPC对象的对象的IPCIPC标识符作为对系统资源表的索引标识符作为对系统资源表的索引4SystemVIPCSystemVIPC共有操作共有操作SystemVIPCSystemVIPC共有操作共有操作操作函数(操作函数(XXXXXX代表代表msgmsg、、semsem、、shmshm三者之一)三者之一)¾¾XXXXXXgetget()():获得:获得IPCIPC标识符标识符¾¾XXXXXXctlctl()():控制:控制IPCIPC资源资源操作模式操作模式¾¾先通过先通过XXXgetXXXget()()创建一个创建一个IPCIPC资源,返回值是该资源,返回值是该IPCIPC资源资源¾¾先通过先通过XXXgetXXXget()()创建一个创建一个IPCIPC资源,返回值是该资源,返回值是该IPCIPC资源资源IDID¾¾随后操作均以随后操作均以IPCIPC资源资源IDID为参数以对相应的为参数以对相应的IPCIPC资源进行资源进行随后操作均以随后操作均以资源资源为参数以对相应的为参数以对相应的资源进行资源进行操作操作¾¾其他进程可通过其他进程可通过XXXgetXXXget()()取得已有的取得已有的IPCIPC资源资源IDID(权限(权限允许的话),并对其允许的话),并对其操作操作5IPCIPC机制的公共数据结构机制的公共数据结构IPCIPC机制的公共数据结构机制的公共数据结构ipc_idsipc_ids结构结构[[linuxlinux//ipcipc//util.hutil.h]]¾¾每一类每一类IPCIPC资源都有一个资源都有一个ipc_idsipc_ids结构的全局变量,用于描结构的全局变量,用于描述同一类资源的公有述同一类资源的公有数据数据¾¾三个全局变量分别是三个全局变量分别是semid_dssemid_ds,,msgid_dsmsgid_ds和和shmid_dsshmid_ds6IPCIPC机制的公共数据结构机制的公共数据结构IPCIPC机制的公共数据结构机制的公共数据结构kern_ipc_permkern_ipc_perm结构结构[[linuxlinux//ipc.hipc.h]]表示每一个表示每一个IPCIPC资源的属性,用来控制操作资源的属性,用来控制操作权限权限¾¾表示每一个表示每一个IPCIPC资源的属性,用来控制操作资源的属性,用来控制操作权限权限¾¾cuidcuid和和cgidcgid成员设置为创建者进程的有效用户成员设置为创建者进程的有效用户IDID和有效组和有效组IDID,合称,合称为创建者为创建者IDID¾¾uiduid和和gidgid成员设置为拥有者进程的有效用户成员设置为拥有者进程的有效用户IDID和有效组和有效组IDID,合称为,合称为¾¾uiduid和和gidgid成员设置为拥有者进程的有效用户成员设置为拥有者进程的有效用户IDID和有效组和有效组IDID,合称为,合称为属主属主IDID¾¾keykey:为整型,由用户提供,用于申请一个:为整型,由用户提供,用于申请一个IPCIPC标识符标识符¾¾modemode:指该资源的所有者、组以及其他用户对资源的读、写访问:指该资源的所有者、组以及其他用户对资源的读、写访问权权7¾¾modemode:指该资源的所有者、组以及其他用户对资源的读、写访问:指该资源的所有者、组以及其他用户对资源的读、写访问权权限限¾¾SeqSeq:表示位置使用序列号,在计算:表示位置使用序列号,在计算IPCIPC标识符时标识符时使用使用IPCIPC对象标识符与对象标识符与IPCIPC键键IPCIPC对象标识符与对象标识符与IPCIPC键键IPCIPC键键¾¾是是IPCIPC对象的外部表示,可由程序员选择对象的外部表示,可由程序员选择¾¾如果键是公用的,则系统中所有进程通过权限检查后,如果键是公用的,则系统中所有进程通过权限检查后,均可找到和访问相应均可找到和访问相应IPCIPC对象对象均可找到和访问相应均可找到和访问相应IPCIPC对象对象¾¾如果键是私有的,则键值为如果键是私有的,则键值为00¾¾每个进程都可建立一个键值为每个进程都可建立一个键值为00的私有的私有IPCIPC对象对象¾¾每个进程都可建立一个键值为每个进程都可建立一个键值为00的私有的私有IPCIPC对象对象IPCIPC标识符标识符¾¾由内核分配给由内核分配给IPCIPC对象,在系统内部是唯一的对象,在系统内部是唯一的¾¾由内核分配给由内核分配给IPCIPC对象,在系统内部是唯一的对象,在系统内部是唯一的¾¾IPCIPC对象标识符的获取:对象标识符的获取:XXXget()XXXget()99将将IPCIPC键传递给以键传递给以syssys打头的内核函数,并为用户分配打头的内核函数,并为用户分配99将将IPCIPC键传递给以键传递给以sys_sys_打头的内核函数,并为用户分配打头的内核函数,并为用户分配一个与一个与IPCIPC对象相对应的数据结构。对象相对应的数据结构。99返回一个返回一个3232位的位的IPCIPC标识符,进程使用此标识符对这标识符,进程使用此标识符对这8个资源进行访问。个资源进行访问。IPCIPC键的创建键的创建IPCIPC键的创建键的创建创建函数创建函数¾¾key_tkey_tftokftok(char*filename,(char*filename,intintid)id);;功能说明功能说明功能说明功能说明¾¾将一个已存在的文件名将一个已存在的文件名((该文件必须是存在而且可以访问该文件必须是存在而且可以访问的的))和一个整数标识符和一个整数标识符idid转换成一个转换成一个key_tkey_t值值))y_y_¾¾在在LinuxLinux系统实现中,调用该函数时,系统将文件的索引系统实现中,调用该函数时,系统将文件的索引节点号取出,并在前面加上子序号,从而得到节点号取出,并在前面加上子序号,从而得到key_tkey_t的返的返回回值值回回值值9IPCIPC对象获取的内核函数对象获取的内核函数IPCIPC对象获取的内核函数对象获取的内核函数函数原型函数原型¾¾ntntsys_semgetsys_semget((key_tkey_tkey,intkey,intnsems,intnsems,intoflagoflag));;¾¾intintsys_msggetsys_msgget((key_tkey_tkey,intkey,intoflagoflag));;itiththt((ktktkitkitiitiitflfl));;¾¾intintsys_shmgetsys_shmget((key_tkey_tkey,intkey,intsize,intsize,intoflagoflag));;参数说明参数说明¾¾keykey:可由:可由ftokftok()()函数产生或定义为函数产生或定义为IPCPRIVATEIPCPRIVATE常量常量¾¾keykey:可由:可由ftokftok()()函数产生或定义为函数产生或定义为IPC_PRIVATEIPC_PRIVATE常量常量¾¾oflagoflag:包括读写权限,还可以包含:包括读写权限,还可以包含IPC_CREATEIPC_CREATE和和IPC_EXCLIPC_EXCL标标志位,组合效果志位,组合效果如下如下oflagoflag标志标志IPCIPC对象不存在对象不存在IPCIPC对象已存在对象已存在无特殊标志无特殊标志出错,出错,errno=ENOENTerrno=ENOENT成功,引用已存在对象成功,引用已存在对象IPCCREATIPCCREAT成功,创建新对象成功,创建新对象成功,引用已存在对象成功,引用已存在对象10__成功,创建新对象成功,创建新对象成功,引用已存在对象成功,引用已存在对象IPC_CREAT|IPC_EXCLIPC_CREAT|IPC_EXCL成功,创建新对象成功,创建新对象出错,出错,errno=EEXISTerrno=EEXISTIPCIPC对象权限位的设定对象权限位的设定IPCIPC对象权限位的设定对象权限位的设定八进制表示格式八进制表示格式¾¾04000400:由用户:由用户((属主属主))读读¾¾02000200:由用户:由用户((属主属主))写写¾¾00400040:由:由((属属))组成员读组成员读¾¾00200020:由:由((属属))组成员写组成员写(())¾¾00040004:由其他用户读:由其他用户读¾¾00020002:由其他用户写:由其他用户写:由其他用户写:由其他用户写11主要内容主要内容主要内容主要内容背景知识背景知识¾¾SystemVSystemV的进程间通信机制的进程间通信机制¾¾消息队列消息队列¾¾信号量信号量¾¾共享主存共享主存实验内容实验内容¾¾消息队列实现进程间通信消息队列实现进程间通信¾¾消息队列实现进程间通信消息队列实现进程间通信¾¾信号量实现进程同步信号量实现进程同步¾¾基于信号量采用多线程技术实现进程同步基于信号量采用多线程技术实现进程同步¾¾基于信号量采用多线程技术实现进程同步基于信号量采用多线程技术实现进程同步¾¾共享主存实现进程间通信共享主存实现进程间通信12消息队列消息队列消息队列消息队列是一个格式化的可变长信息单位是一个格式化的可变长信息单位消息机制允许一个进程向任何其他进程发送一个消消息机制允许一个进程向任何其他进程发