System V IPC分为三种:

  • System V消息队列
  • System V信号量
  • System V共享内存区
这三种类型的IPC使用key_t值做为它们的名字。
key_t这个数据类型在<sys/types.h>有定义,通常是一个至少32位的整数。
我们通常使用ftok()函数(可以如此记忆:file to key)把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键。
(当然,我们也可以不用ftok函数来生成该键,指定一个整数也是可以的,当然你需要考虑键的正负问题)。
看下ftok的声明:
1 #include
<sys/ipc.h>
2 /*
Generates key for System V style IPC.  */
3 key_t
ftok (
const char *pathname, int proj_id);

pathname 通常是跟本应用用关的目录;proj_id指的是本应用所用到的IPC的一个序列号;成功返回IPC键,失败返回-1;

注:两进程如在pathname和proj_id上达成一致(或约定好),双方就都能够通过调用ftok函数得到同一个IPC键。

那么ftok是怎么实现的呢?

《UNIX网络编程》上讲到,ftok的实现是组合了三个值:
  • pathname所在文件系统的信息(stat结构的st_dev成员)
  • pathname在本文件系统内的索引节点号(stat结构的st_ino成员)
  • id的低序8位(不能为0)
具体如何组合的,根据系统实现而不同。

使用ftok()需要注意的问题:

  • pathname指定的目录(文件)必须真实存在且调用进程可访问,否则ftok返回-1;
  • pathname指定的目录(文件)不能在程序运行期间删除或创建。因为文件每次创建时由系统赋予的索引节点可能不一样。这样一来,通过同一个pathname与proj_id就不能保证生成同一个IPC键。


最新文章

  1. python与shell的3种交互方式介绍
  2. MySQL PXC 高可用集群搭建
  3. MATLAB中plot()画图的颜色线型和希腊字母参数设置
  4. Android-Adapter用法总结
  5. Bcdedit命令使用详解使用方法
  6. 从零开始搭建ELK+GPE监控预警系统
  7. Linux上程序调试的基石(2)--GDB
  8. Java 静态内部类的加载时机
  9. spring面向接口编程
  10. Angular $interval
  11. Java_myBatis_xml代理写法
  12. Linux命令之man
  13. 19迭代模式Iterator
  14. 【题解】Luogu P3901 数列找不同
  15. [JS]给String对象添加方法,使传入的字符串字符之间以空格分开输出
  16. [LeetCode&amp;Python] Problem 409. Longest Palindrome
  17. supervisorctl 常用命令
  18. 面试:用快排实现数组中的第K大的数
  19. [IOI2018] werewolf 狼人
  20. sys和os模块

热门文章

  1. postman是如何使用的?
  2. vue2 本地安装
  3. 百度地图API简介
  4. hive常规配置及常用命令使用
  5. Windows下oracle-win-64-11g安装步骤
  6. 解决iOS11 UIScrollView下移问题
  7. 5.Django数据库配置
  8. LeetCode:完全平方数【279】【DP】
  9. CodeForces - 597C Subsequences 【DP + 树状数组】
  10. Python 3 面向对象 一