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键。


【IPC通信】key_t键和ftok函数的更多相关文章

  1. key_t键和ftok函数

    系统建立IPC通讯(如消息队列.共享内存时)必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型如下: key_t ftok( char * fname, int id ) f ...

  2. 【IPC通信】基于管道的popen和pclose函数

    http://my.oschina.net/renhc/blog/35116 [IPC通信]基于管道的popen和pclose函数 恋恋美食  恋恋美食 发布时间: 2011/11/12 23:20 ...

  3. ftok()函数深度解析

    [转载] 原文链接:https://blog.csdn.net/u013485792/article/details/50764224 关于ftok函数,先不去了解它的作用来先说说为什么要用它,共享内 ...

  4. ftok函数

    ftok函数 系统建立IPC通讯(消息队列.信号量和共享内存)时必须指定一个ID值.通常情况下,该id值通过ftok函数得到. ftok原型 头文件: #include <sys/types.h ...

  5. ftok函数的使用

    ftok函数的定义:系统建立IPC通讯 (消息队列.信号量和共享内存) 时必须指定一个ID值.通常情况下,该id值通过ftok函数得到. 头文件 #include <sys/types.h> ...

  6. ftok函数例子

    #include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>int main( void ){ int ...

  7. linux进程篇 (三) 进程间的通信3 IPC通信

    3 IPC通信 用户空间 进程A <----无法通信----> 进程B -----------------|--------------------------------------|- ...

  8. OS: 生产者消费者问题(二) ---- 系统V IPC通信-信号量和共享内存

    在上一篇“OS: 生产者消费者问题(多进程+共享内存+信号量)”中提到的方法二: 如果进程之间并没有父子关系,但是协商好了共享存储的 KEY , 那么在每个进程中,就可以通过 KEY 以及 shmge ...

  9. Binder机制,从Java到C (9. IPC通信过程)

    1.一次IPC通信過程的幾個步驟 一次通信过程简单的说有下面5个步骤,第一眼看上去,肯定不知道什么玩意,多看几遍,慢慢看,其实是能理解的. 1. Client将数据封装成Parcel. (前面已经讲过 ...

随机推荐

  1. 使用ILookup<TKey, TElement> 接口查找集合

    public class Program { public static void Main() { // 创建一个放入ilookup数据结构的School清单. List<School> ...

  2. City Game(最大子矩阵)

    Bob is a strategy game programming specialist. In his new city building game the gaming environment ...

  3. spring+thymeleaf实现表单验证数据双向绑定

    前言 这个教程介绍了Thymeleaf与Spring框架的集成,特别是SpringMvc框架. 注意Thymeleaf支持同Spring框架的3.和4.版本的集成,但是这两个版本的支持是封装在thym ...

  4. SAP HR 复制PA30的人员

    [转自http://www.512test.com/home/space.php?uid=19&do=blog&id=2381] 很多顾问测试HR的程序时都为录入人员头痛,下面的程序提 ...

  5. 关于 IN UPDATE TASK

    [转 http://blog.sina.com.cn/s/blog_6f74e6d50100sq57.html]更新程序必须用一个特殊的FM(update module)来实现. 1.Exportin ...

  6. 使用阿里云的PyPI源

    方法1:(1)创建pip.conf文件 (2).编辑如下内容 [global] index-url = http://mirrors.aliyun.com/pypi/simple/ [install] ...

  7. python基础15 ---面像对象的程序设计

    面向对象的程序设计 一.面向对象的程序设计简介 1.面向对象程序设计的由来. 我们之前虽然学习过了面向过程的程序,它的核心是面向过程,一步一步的设计好了的流程,虽然极大的降低了程序的复杂度,但是一个设 ...

  8. Tomcat的Server.xml虚拟主机和虚拟目录的配置

    以前开发JavaEE网站都布置在Tomcat下,布置目录一般为$CATALINA_HOME/webapps/WebName,所以要访问网站,则在http://localhost后必须要加上上下文路径( ...

  9. 【leetcode刷题笔记】Permutations II

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  10. 国内ADSL用户的带宽一般都是1M、2M、3M的,理论上的下载速度分别是128K/S、256K/S、384K/S。

    国内ADSL用户的带宽一般都是1M.2M.3M的,理论上的下载速度分别是128K/S.256K/S.384K/S. 1024/8===128      2048/8==256