【IPC-UNIX网络编程】第3章System V IPC

1. System V IPC
  • System V 消息队列
  • System V 信号量
  • System V 共享内存区

System V IPC函数汇总

消息队列信号量共享内存区
头文件<sys/msg.h><sys/sem.h><sys/shm.h>
创建或打开IPC的函数msggetsemgetshmget
控制IPC操作的函数msgctlsemctlshmctl
IPC操作函数msgsend msgrcvsemopshmat shmdt

2. key_t键和ftok函数

System V IPC使用key_t值作为它们的名字,它通常是至少32位的整数(由<sys/types.h>定义)。而这些整数值通常是由ftok函数赋予。

  • 函数ftok把一个已存在的路径名和一个整数标识符(使用其低序8位)转换成一个key_t值,称为IPC键。

    #include <sys/ipc.h>
    key_t ftok(const char *pathname,int id); //返回:成功则为IPC键,否则为-1
    
  • 该函数假定对于使用System V IPC的某个应用而言,客户和服务器同意使用对该应用有一定意义的pathname [服务器守护程序的路径名服务器使用的某个公共数据文件路径名系统某个其他路径名] 。

    Note:路径名用于产生键的文件不能是在服务器存货期间由服务器反复创建并删除的文件,因为该文件每次创建时由系统赋予的索引节点很可能不一样,于是对下一个调用者来说,由ftok返回的键也可能不同。

  • 若客户和服务器之间只需单个IPC通道,则可以使用如id=1;若需多个IPC通道,如client->server && server->client,则一个通道可使用id=1,另一个通道可使用id=2。

  • 一旦client和server在pathname和id上达成一致,则双方调用ftok函数把pathname和id转换成同一个IPC键。

3. ipc_perm结构——维护IPC对象信息结构

其内容跟内核给文件维护的信息类似。

struct ipc_perm {
  uid_t uid; //owner用户id
  gid_t gid; //owner组id --合称为owner ID
  
  uid_t cuid; //creator用户id
  gid_t cgid; //creator组id --合称为creator ID
  
  mode_t mode; //读-写权限
  ulong_t seq; //slot使用序列号
  key_t key;  //IPC key
}
  1. 创建与打开IPC通道
  • 指定key为IPC_PRIVATE能保证创建一个唯一的IPC对象。没有一对id和pathname的组合会导致ftok产生IPC_PRIVATE这个键值;
  • 设置oflag参数的IPC_CREAT位但不设置它的IPC_EXCL位时,如果所指定键的IPC对象不存在,那就创建一个新的对象,否则返回该对象
  • 同时设置oflag参数的IPC_CREAT位和IPC_EXCL位时,若所指定键的IPC对象不存在,则创建一个对象;否则返回EEXIST错误。

在这里插入图片描述

5. 习题

  • 3.4 如果一个服务器想要为其客户创建一个唯一的消息队列,那么采用哪种方法更恰当——使用某个常值路径名(如可执行文件)作为ftok的一个参数呢,还是使用IPC_PRIVATE?

1)若使用ftok,系统中另外某个路径名所形成的键与服务器所用的键相同的可能性总是存在。2)若使用IPC_PRIVATE,服务器尽管知道它是在创建新的消息队列,但她必须接着把所创建消息队列的标识符写到某文件中,供客户读取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值