Linux IPC基础(System V)
简介
IPC 主要有消息队列、信号量和共享内存3种机制。和文件一样,IPC 在使用前必须先创建,使用 ipcs 命令可以查看当前系统正在使用的 IPC 工具:

由以上可以看出,一个 IPC 至少包含 key值、ID值、拥有者、权限和使用的大小等关键信息。如果需要手工删除某个 IPC 机制,可以使用 ipcrm 命令。
key 值和 ID 值
IPC 在实现时编写使用 key 值作为参数创建,如果在创建时使用相同的 key 值将得到同一个 IPC 对象的 ID,这样就保证了双方可以获取用于传递数据的 IPC 机制 ID 值。key 值为一个32位的整型数据。Linux 提供函数 ftok() 来创建 key 值。
#include <sys/types.h>
#include <sys/ipc.h>
/* pathname 为文件路径名,第2个参数为 int 型变量 */
key_t ftok(const char *pathname, int proj_id);
每个文件都有其自身的属性,可以通过 stat() 函数读取,在 ftok() 函数创建 key 值过程中使用了该文件属性的 st_dev 和 st_ino 。具体构成如下:

如果使用 ftok() 函数的参数是相同的,那么得到的 key 值是唯一的。所以说两个进程使用相同的参数创建同类 IPC 的话,就可以实现进程间的通信。
用以下程序来演示 key 值各位的组成:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int arg, key;
struct stat buf;
arg = atoi(argv[2]);
key = ftok(argv[1], arg);
printf("Key : %x \n\n", key);
stat(argv[1], &buf);
printf("argv[2] low 8 bits : %x \n", arg & 0x0ff);
printf("st_dev low 8 bits : %x \n", buf.st_dev & 0x0ff);
printf("st_ino low 16 bits : %x \n", buf.st_ino & 0x0ffff);
return 0;
}
运行结果如下:

拥有者及权限
要访问任何一个 IPC 工具需要对该 IPC 工具拥有相应的权限,一个 IPC 工具所具有的 IPC 访问权限定义为 struct ipc_perm。其成员定义如下:

补充 stat 结构体:
struct stat {
mode_t st_mode; // 文件对应的模式,文件,目录等
ino_t st_ino; // inode 节点号
dev_t st_dev; // 设备号码
dev_t st_rdev; // 特殊设备号码
nlink_t st_nlink; // 文件的连接数
uid_t st_uid; // 文件所有者
gid_t st_gid; // 文件所有者对应的组
off_t st_size; // 普通文件,对应的文件字节数
time_t st_atime; // 文件最后被访问的时间
time_t st_mtime; // 文件内容最后被修改的时间
time_t st_ctime; // 文件状态改变时间
blksize_t st_blksize; // 文件内容对应的块大小
blkcnt_t st_blocks; // 文件内容对应的块数量
};
Linux IPC基础(System V)的更多相关文章
- Linux中的System V信号量
在进程同步,并发运行时,保证按序地访问共享资源是十分重要的.因此引入了临界区的概念,一次只能有一个线程进入临界区完成他的指令.而信号量(semaphore)的作用,类似于一个交通信号灯,它负责进程协作 ...
- Linux进程间通信——使用System V 消息队列
消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问 ...
- 【linux高级程序设计】(第十一章)System V进程间通信 1
System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支. 传统上,System V 被看作是两种UNIX"风味"之一(另一个是 B ...
- Linux IPC实践(11) --System V信号量(1)
信号量API #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> int semget ...
- linux网络编程之system v信号量(一)
今天起,学习信号量相关的知识,下面开始: 关于信号量,在前面已经介绍过了,这里回顾一下: 通过上面的描述,很容易就能想到信号量的一上数据结构: 下面再来回顾一下P.V原语: 所谓的原语就是指这段代码是 ...
- 《Unix网络编程》卷2 读书笔记 第3章- System V IPC
1. 概述 三种类型的System V IPC:System V 消息队列.System V 信号量.System V 共享内存区 System V IPC在访问它们的函数和内核为它们维护的信息上共享 ...
- System V IPC相关函数
System V IPC 将一个已保存的路径名和一个整数标识符转换成一个key_t值,称为IPC键key_t:System V IPC(System V消息队列.System V信号量.System ...
- Linux IPC System V 共享内存
模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int ...
随机推荐
- [uboot] (第三章)uboot流程——uboot-spl代码流程
http://blog.csdn.net/ooonebook/article/details/52957395 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- delphi 中OutputDebugString 函数的妙用(转载)
原文地址 https://www.peganza.com/delphi-and-outputdebugstring.html Ever wanted to monitor your Delphi ap ...
- Noxim Overview
PE+Router= Tile Node Architectural Elements: Buffer.h, Router.h, LocalRoutingTable.h, Tile.h, NoC.h, ...
- wind量化交易
https://www.joinquant.com/study?f=home&m=memu https://www.v2ex.com/member/mushroomqiu https://sa ...
- Ubuntu 14.04 LTS 下使用源码编译安装 Sagemath 6.7 x64 (小结)
原先博客放弃使用,几篇文章搬运过来 下载源码包 系统的最低要求: 6GB 硬盘 : 2GB RAM. 命令行工具: A C/C++ compiler: Since Sage builds its ow ...
- html-minifier中文文档
HTMLMinifier是一个高度可配置的.经过良好测试的.基于javascript的HTML缩小器.参见相应的博客文章,了解它的工作原理.每个选项的描述.测试结果和结论.在线测试套件.还可以看到相应 ...
- OpenCV基础知识介绍
1.图像与矩阵 一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(row)和列(column),矩阵的操作在数学和计算机中的处理都很常见且成熟,于是很自然的就 ...
- PHP查看内存使用
第一想法:memory_get_usage() 用microtime函数就可以分析程序执行时间memory_get_usage可以分析内存占用空间 SQL的效率可以使用打开慢查询查看日志分析SQL 找 ...
- Navie level questions
1. Binary Tree Maximum Node Find the maximum node in a binary tree,return the node. public class Max ...
- uniGUI经验几则
uniGUI经验几则 (2015-11-07 21:42:41) 转载▼ 标签: it 分类: uniGUI 1.uniTimer的妙用 很多时候,都会遇到在一个uniForm或者uniFrame加载 ...