System V IPC概述

匿名 (未验证) 提交于 2019-12-03 00:22:01

2. System V IPC对象的访问




3.头文件及函数介绍

头文件:

#include <sys/types.h> //公共头文件,声明了key_t类型 #include <sys/ipc.h>   //公共头文件  #include <sys/msg.h>   //消息队列函数的头文件 #include <sys/sem.h>   //信号量函数的头文件 #include <sys/shm.h>   //共享内存函数的头文件
sysĿ¼下的。前面两个是公共的头文件,也就是说三种IPC机制都有用到,而后面三个是和具体的IPC机制相关的,通过头文件的名称我们能发现它们同样满足前面所说的缩写。
ftok()函数:
#include <sys/types.h> #include <sys/ipc.h>  key_t ftok(const char *pathname, int proj_id);
的英文可以理解为的缩写。即将文件转换成key。
“.”);proj_id被称作子id,自己指定一个整型。注意如果两个进程要通过System V的IPC通信,那么它们的ftok函数的两个参数必须相同,这样才能生成同样的key,从而产出同样的id。
  • key的31~24位为ftok函数第二个参数proj_id的低8位。
  • key的23~16位为该文件stat结构中st_dev属性的低8位。
  • key的15~0位为该文件stat结构中st_ino属性的低16位。
这是一个结构体。他的英文含义是:ipc permission(IPC权限)
struct ipc_perm {     key_t          __key; /* key */     uid_t          uid;   /* 所有者的有效用户ID */     gid_t          gid;   /* 所有者的有效组ID */     uid_t          cuid;  /* 创造者的有效用户ID */     gid_t          cgid;  /* 创造者的有效组ID */     unsigned short mode;  /* 权限 */     unsigned short __seq; /* 可忽略 */ };
共同的成员就是这个ipc_perm,用来标识IPC对象的权限。

不同IPC机制之中的很多函数之间有着异曲同工之妙,学会分类,找到各自的相同点和不同点。

分类创建函数控制函数独立函数
消息队列msggetmsgctlmsgsnd,msgrcv
信号量semgetsemctlsemop
共享内存shmgetshmctlshmat,shmdt
横着看。可以清楚的看到同一行的函数名都有同一个头。这个头就是IPC机制的缩写:msg、sem和shm。
竖着看。我把每种IPC函数都分成三类:创建函数、控制函数和独立函数。创建函数和控制函数是三种IPC都有的,而独立函数指的是与具体IPC机制特性相关的函数。
  • 创建函数(get函数)创建的是IPC对象的标识符(id),它们以ftok生成的键(key)为参数(以及其他参数)生成。
  • 控制函数(ctl函数)控制的是对应IPC数据结构的成员属性,从而改变IPC对象的状态。
文件描述符(fd),而get函数在功能上来说可以类比open函数
int msgget(key_t key, int flag); int semget(key_t key, int nsems, int flag); int shmget(key_t key, size_t size, int flag);
  • (类似open函数的O_CREAT)
  • (类似open函数的O_EXCL)
IPC_CREAT|IPC_EXCL
类比的记忆与学习方法。另外我还提到了一个ӡ֤,指的是和shell的命令相印证,Linux中有三个命令是和System V的三个IPC相关的:
  • ipcmk
  • ipcrm
  • ipcs
其中ipcmk命令用于创建IPC对象,来看一下它的三个主要选项:
选项描述
-Q创建一个消息队列
-S创建信号量,后跟一参数指明数量
-M创建共享内存,后跟一参数指明大小

CTL函数
int msgctl(int msqid, int cmd, struct msqid_ds *buf); int semctl(int semid, int semnum, int cmd, ...);     //有三参数和四参数两种,根据cmd的不同而不同 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
  • msqid_ds
  • semid_ds
  • shmid_ds
id_ds。ds就是data structure(数据结构)的意思。

共同的成员就是前面提到的ipc_perm。具体每个结构体的成员有谁,这里篇幅有限,不赘述,大家自行百度谷歌,或者去man一下其对应的的控制函数。大家在学习过程中就要一层一层的抽丝剥茧,看到函数的参数是结构体,就要去探究结构体的成员,看到它的成员也是结构体,那么就要继续探究。

这三个函数都有一个cmd参数(控制参数),不同的IPC机制它们的控制参数是不一样的。但是由几个控制参数是公共的(定义在ipc.h中)。下面以消息队列为例(也适用于信号量和共享内存)

IPC_RMID删除消息队列。只能由其创建者或超级用户(root)来删除
IPC_SET设置消息队列的属性。按照buf指向的结构中的值,来设置此IPC对象
IPC_STAT读取消息队列的属性。取得此队列的msqid_ds结构,并存放在buf中
IPC_INFO(只有Linux有)返回系统级的限制,结果放在buf中

文章来源: System V IPC概述
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!