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的声明:

#include <sys/ipc.h>
/* Generates key for System V style IPC.  */
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键。

附:文件属性结构

struct stat
{dev_t         st_dev;      /* device */ino_t         st_ino;      /* inode */mode_t        st_mode;     /* protection */nlink_t       st_nlink;    /* number of hard links */uid_t         st_uid;      /* user ID of owner */gid_t         st_gid;      /* group ID of owner */dev_t         st_rdev;     /* device type (if inode device) */off_t         st_size;     /* total size, in bytes */blksize_t     st_blksize;  /* blocksize for filesystem I/O */blkcnt_t      st_blocks;   /* number of blocks allocated */time_t        st_atime;    /* time of last access */time_t        st_mtime;    /* time of last modification */time_t        st_ctime;    /* time of last status change */
};

获取文件属性的函数有如下几个:

int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);

下面通过例子来看一下如何获取:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>int main()
{const char fname[] = "main.c";struct stat stat_info;if(0 != stat(fname, &stat_info)){perror("取得文件信息失败!");exit(1);}printf("文件所在设备编号:%ld\r\n", stat_info.st_dev);printf("文件所在文件系统索引:%ld\r\n", stat_info.st_ino);printf("文件的类型和存取的权限:%d\r\n", stat_info.st_mode);printf("连到该文件的硬连接数目:%d\r\n", stat_info.st_nlink);printf("文件所有者的用户识别码:%d\r\n", stat_info.st_uid);printf("文件所有者的组识别码:%d\r\n", stat_info.st_gid);printf("装置设备文件:%ld\r\n", stat_info.st_rdev);printf("文件大小:%ld\r\n", stat_info.st_size);printf("文件系统的I/O缓冲区大小:%ld\r\n", stat_info.st_blksize);printf("占用文件区块的个数(每一区块大小为512个字节):%ld\r\n", stat_info.st_blocks);printf("文件最近一次被存取或被执行的时间:%ld\r\n", stat_info.st_atime);printf("文件最后一次被修改的时间:%ld\r\n", stat_info.st_mtime);printf("最近一次被更改的时间:%ld\r\n", stat_info.st_ctime);return 0;
}

编译并执行输出:

$ gcc -o getstat main.c

$ ./getstat

文件所在设备编号:2051

文件所在文件系统索引:61079722

文件的类型和存取的权限:33188

连到该文件的硬连接数目:1

文件所有者的用户识别码:502

文件所有者的组识别码:503

装置设备文件:0

文件大小:1210

文件系统的I/O缓冲区大小:4096

占用文件区块的个数(每一区块大小为512个字节):8

文件最近一次被存取或被执行的时间:1320997735

文件最后一次被修改的时间:1320994242

最近一次被更改的时间:1320994242

2011-11-11  任洪彩  qdurenhongcai@163.com

转载请注明出处。

【IPC通信】key_t键和ftok函数相关推荐

  1. key_t键和ftok函数

    目录 `key_t键`.`ftok函数` key_t键.ftok函数 key_t ftok(const char *pathname, int proj_id); 功能:通过ftok返回的是根据文件( ...

  2. key_t键和ftok函数(转)

    key_t键 System V IPC使用key_t值作为它们的名字,在Redhat linux(后续验证默认都在该平台下)下key_t被定义为int类型,追溯如下: /usr/include/sys ...

  3. key_t IPC键和ftok函数详解和剖析

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

  4. ftok()函数解析

    ftok 消息队列.信号灯.共享内存常用在Linux服务端编程的进程间通信环境中.而此三类编程函数在实际项目中都是用System V IPC函数实现的.System V IPC函数名称和说明如下表15 ...

  5. Linux C 进程间的IPC通信 之 共享内存(二)

    1.父子进程(有亲缘关系)的IPC通信 int shmid;       shmid = shmget(IPC_PRIVATE, 128, IPC_CREAT | 0777); //创建共享内存,参数 ...

  6. linux进程通信 --ftok函数

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

  7. ftok() 函数讲解 获取内核键值

    ftok() 函数之获取消息队列的键值 1.概述: 系统建立IPC通讯(消息队列.信号量和共享内存)时必须指定一个ID值,通常情况下,该ID值通过ftok函数得到. 2.原型: #include &l ...

  8. 使用共享内存实现IPC通信

    共享内存的使用流程 参考博文: https://www.cnblogs.com/LiuYanYGZ/p/14292524.html 1.向内核申请一块指定大小的内存 2.如果有两个进程,需要通信,可以 ...

  9. 正文6:System V共享内存(修正版)及ftok函数讲解

    文章目录 0.linux共享内存相关操作命令 1)ipcs用法 2)ipcrm用法 1.共享内存的通信原理 0)特点 1)定义: 2)原理: 3)特别提醒: 4)原理图: 5)补充 2.为什么共享内存 ...

最新文章

  1. SonarQube代码质量管理平台安装与配置
  2. matlab讨论资金积累,资金积累、国民收入与人口增长的关系综合评估
  3. Drawable 添加过滤色,改变图片颜色
  4. 同步,异步,多线程,你怎么看?
  5. 工作回报如何影响人的生产力_如何在减少工作的同时提高生产力
  6. 「NOIP 2013」 货车运输
  7. C++基础::运算符重载
  8. 谷粒商城:05. 分布式组件SpringCloud Alibaba
  9. 【优化预测】基于matlab天牛须算法优化BP神经网络预测【含Matlab源码 1318期】
  10. oracle索引实现方式,Oracle中的索引原理(1)
  11. 金融数据分析(十)人均国内生产总值的增长率
  12. Ae 表达式语言引用​:Comp
  13. 用sympy库解常微分方程
  14. Soul源码总结-01-20
  15. 拓嘉启远电商:拼多多直通车烧钱太多的原因
  16. Swift 中字符串截取的几种常见情况
  17. 基于JAVA爱馨敬老院网站计算机毕业设计源码+系统+lw文档+部署
  18. 【单目摄像头测量距离:相似三角形法】
  19. 阿里云团队协作网盘Teambition之目录程序
  20. 二等奖方案|2021 CCF BDCI个贷违约预测赛题@Faulty 队解题思路

热门文章

  1. IPU缩放图片的实现
  2. 程序员有必要参加软考吗?软考有什么用?
  3. matlab数学建模方法与实践 笔记1:快速入门
  4. 习题解答_反正切函数的求导
  5. JetsonXavierAGX配置Yolov5环境
  6. Latex Tips: 如何输入矩阵(illustrated in Jupyter Notebook)
  7. Latex如何排版矩阵
  8. 键盘输入一个整数1~7代表今天周几,再输入间隔天数n,判断n天后是周几
  9. csgo准星设置代码_csgo准星设置指令
  10. 阿里云服务器ECS适用于哪些场景?