1、概述

   System V IPC共有三种类型:System V消息队列、System V 信号量、System V 共享内存区。 System V IPC操作函数如下:

2、key_t键和ftok函数

  三种类型的IPC使用key_t值作为他们的名字,头文件<sys/types.h>把key_t定义为一个整数,通常是一个至少32位的整数,由ftok函数赋予的。函数ftok把一个已存的路径和一个整数标识符转换成一个key_t值,称为IPC键。函数原型如下:

#include <sys/types.h>#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);  //成功返回IPC键,出错返回-1

写个程序看看ftok是如何组合IPC键,程序如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <sys/ipc.h>
 6 #include <sys/stat.h>  7 #include <errno.h>  8  9 typedef unsigned long u_long; 10 11 int main(int argc,char *argv[]) 12 { 13 struct stat st; 14  key_t key; 15 if(argc != 2) 16  { 17 printf("usage: ftok<pathname>"); 18 exit(0); 19  } 20 //获取文件结构信息 21 if (stat(argv[1],&st) == -1) 22  { 23 perror("stat() error"); 24  exit(EXIT_FAILURE); 25  } 26 printf("st_dev : %lx,st_ino: %lx ",(u_long)st.st_dev,(u_long)st.st_ino); 27 //产生IPC键 28 if((key = ftok(argv[1],0x57)) == -1) 29  { 30 perror("ftok() error"); 31  exit(EXIT_FAILURE); 32  } 33 printf("key: %x\n",key); 34 exit(0); 35 }

在Ubuntu上程序测试结果如下:

可以看出在Linux上面IPC键使用的是id低8位,st_dev的低8位以及st_ino的低16位构成的。

3、ipc_perm结构

  内核给每个IPC对象维护一个信息结构,内容跟内核给文件维护的信息类似。Unix下结构信息如下:

struct ipc_perm
{
key_t       key;     /* Key supplied to semget(2) */
uid_t        uid;     /* Effective UID of owner */
gid_t        gid;     /* Effective GID of owner */
uid_t        cuid;    /* Effective UID of creator */
gid_t        cgid;    /* Effective GID of creator */
unsigned short   mode;   /* Permissions */
unsigned short     seq;    /* Sequence number */
};

在Linux该结构信息如下:

参考http://linux.die.net/man/5/ipc

4、创建与打开IPC通道

  对于key值,有两种选择:

(1)调用fotk函数,给它传递pathname和id。

(2)指定key为IPC_PRIVATE,保证会创建一个新的、唯一的IPC对象。

5、IPC权限

For semaphores (from sys/sem.h)
#define SEM_A 0200 /* alter permission */
#define SEM_R 0400 /* read permission */

For message queues (from sys/msg.h)
#define MSG_R 0400 /* read permission */
#define MSG_W 0200 /* write permission */

For shared memory (from sys/shm.h)
#define SHM_R 0400 /* read permission */
#define SHM_W 0200 /* write permission */

6、标识符重用

  System V IPC 标识符是系统范围的,不是特定于进程的。ipc_perm结构含有一个名为seq的变量,是内核为系统每个潜在的IPC对象维护的计数器,每当删除一个IPC对象时,内核就递增相应的槽位号,若溢出则循环到0。这样避免短时间内重用System V IPC标识符,有助于确保过早终止的服务器重新启动后不会重用标识符。写个程序测试输出有megget返回的前10个标识符值,程序如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <unistd.h>
 4 #include <sys/types.h>
 5 #include <sys/ipc.h>
 6 #include <sys/msg.h>  7  8 #define MSG_R 0400 /* read permission */  9 #define MSG_W 0200 /* write permission */ 10 11 #define SVMSG_MODE (MSG_R | MSG_W | MSG_R >>3 | MSG_R >>6) 12 13 int main() 14 { 15 int i,msqid; 16 for(i=0;i<10;++i) 17  { 18 msqid = msgget(IPC_PRIVATE,SVMSG_MODE|IPC_CREAT); 19 printf("msqid = %d\n",msqid); 20  msgctl(msqid,IPC_RMID,NULL); 21  } 22 exit(0); 23 }

在Ubuntu上面测试结果如下:

7、ipcs和ipcrm程序

  System V IPC的三种类型不是以文件系统中的路径名标识的,不能使用ls和rm程序查看和删除。而是同ipcs程序输出System V IPC特性的各种信息,ipcrm则删除一个System V 消息队列、信号量或共享内存区。

ipcs - 分析消息队列、共享内存和信号量
ipcs [-mqs] [-abcopt] [-C core] [-N namelist]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出信号量(semaphore)的信息

输出本机所有System V IPC消息如下:

ipcrm - 删除ipc(清除共享内存信息)
ipcrm -m|-q|-s shm_id
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出信号量(semaphore)的信息

8、内核限制

  System V IPC的多数实现在有内在的内核限制,如消息队列的最大数目、每个信号集的最大信号量数等等。

System V IPC相关推荐

  1. 【C语言】【unix c】信号量集(system v ipc)

    二.信号量集(system v ipc)信号量集就是数组,数组里的每个元素都是信号量的类型1.获取键值ftok(3)2.使用键值获取信号量集的idsemget(2)#include <sys/t ...

  2. system V IPC进程间通信机制一网打尽

    目录 必备IPCS命令解析 ipcs ipcrm Linux IPC消息队列 msgget msgsnd msgrcv msgctl Linux IPC信号量 理解信号量 semget semop s ...

  3. System V IPC POSIX IPC(一):消息队列

    System V IPC & POSIX IPC(一):消息队列 消息队列允许进程之间以消息的形式交换数据,是一种常见的进程之间的通信机制. 1. 消息队列的创建 System V IPC: ...

  4. System V IPC之信号灯

    信号灯也叫信号量 用于进程/线程同步或互斥的机制 信号灯的类型 1.Posix 无名信号灯 2.Posix 有名信号灯 3.System V 信号灯 信号灯的含义 计数信号灯(1和2都是) Syste ...

  5. 进程间同步---system v ipc 对象信号灯集

    一.信号灯简介 Linux支持System V的信号灯(semaphore),是一种进程间通信的方式,只不过它和管道.FIFO或者共享内存不一样,信号灯主要用于同步或者互斥对共享资源的访问,它的发明来 ...

  6. Linux IPC实践(13) --System V IPC综合实践

    实践:实现一个先进先出的共享内存shmfifo 使用消息队列即可实现消息的先进先出(FIFO), 但是使用共享内存实现消息的先进先出则更加快速; 我们首先完成C语言版本的shmfifo(基于过程调用) ...

  7. System V IPC之消息队列

    消息队列由消息队列id来唯一标识 消息队列就是一个消息的列表 用户可以在消息队列中添加消息 读取消息 消息队列可以按照类型来发送和接收消息       消息队列使用步骤 打开/创建消息队列 msgge ...

  8. System V IPC之共享内存

    共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存, 而不需要任何数据的拷贝 共享内存在内核空间创建, 可以被进程映射到用户空间访问 由于多个进程可同时访问共享内存 , 因此需要同步和互斥机 ...

  9. linux system V IPC 信号灯和共享内存实例

    #include<sys/types.h> #include<linux/sem.h> #include<linux/shm.h> #include<unis ...

最新文章

  1. 数据治理的理论实践与发展趋势
  2. 测量分类准确率的过程算坍缩吗?
  3. 腾讯阿里谋定联姻农业 智慧农业对话中国农民丰收节交易会
  4. 你离黑客的距离,就差这20个神器了
  5. MySql数据库中的子查询使用
  6. java中Mark接口_JVM源码分析之Java对象头实现
  7. IIS出现The specified module could not be found解决方法
  8. Docx:docx.opc.exceptions.PackageNotFoundError: Package not found at
  9. python读取mysql数据_Selenium(Python) ddt读取MySQL数据驱动
  10. mysql proxy 读写分离_mysql-proxy 实现读写分离
  11. 监控IIS的运行状态
  12. Bootstrap(5)栅格系统
  13. 拓端tecdat|R语言对巨灾风险下的再保险合同定价研究案例:广义线性模型和帕累托分布Pareto distributions分析
  14. 为了让智能手机厂商早日推出 5G 手机,高通真是操碎了心
  15. PHP中将Word文件转换为PDF
  16. 项目经理的“势能”培养 (转)
  17. nmap 扫描 STATE 显示closed
  18. Android:根据日期计算星期几
  19. 联想TD350服务器主板型号,【新品】塔式机身 联想ThinkServer TD350
  20. 树莓派python实现http请求控制海康威视摄像头转动

热门文章

  1. 阻塞与非阻塞的IO网络读写
  2. [转]产品需求文档(PRD)的写作
  3. iOS开发系列--C语言之存储方式和作用域
  4. 关于数组集合之间的转换
  5. flex 3.0序列号
  6. perl 发送邮件脚本
  7. C#如何进行多线程编程
  8. Azure手把手系列5:Azure帐户和订阅
  9. 17秋 软件工程 第六次作业 Beta冲刺 总结博客
  10. SQLServer特殊字符/生僻字与varchar