zoukankan      html  css  js  c++  java
  • 【IPC通信】key_t键和ftok函数

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


  • 相关阅读:
    最简单跳转,待反混爻的合集
    搜索引擎劫持代码
    Warning: Cannot modify header information
    editplus 正则删换行
    在全程Linux環境部署IBM Lotus Domino/Notes 8.5
    3.5-杂项②
    3.4-杂项①
    3.3-ISDN
    3.2-帧中继②
    3.2-帧中继①
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218474.html
Copyright © 2011-2022 走看看