SYNOPSIS 总览

# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/msg.h>
# include <sys/sem.h>
# include <sys/shm.h>

DESCRIPTION

本手册页涉及 System V 进程间通信机制在 Linux 下的实现: 消息队列, 信号灯集合, 以及共享内存段. 下面提到 资源 时, 就是指上面这些通信机制中的一种.

资源访问权限

对每个资源, 系统用一个共有的 struct ipc_perm 结构来存放权限信息, 以确定一个 ipc 操作是否可访问该资源. 在 <sys/ipc.h> 中定义了 ipc_perm, 其成员如下:

       ushort cuid;     /* 创建者 uid */

       ushort cgid;     /* 创建者 gid
*/

       ushort uid; /* 所有者 uid
*/

       ushort gid; /* 所有者 gid
*/

       ushort mode; /* 读/写权限 */

结构 ipc_perm 的成员 mode 的低九位定义了对该资源的访问许可, 以确定一个执行了 ipc
系统调用的进程能否访问该资源. 其解释如下:

        0400    用户可读.
0200 用户可写. 0040 组成员可读.
0020 组成员可写. 0004 其他用户可读.
0002 其他用户可写.

系统没有使用执行位 0100, 0010 和 0001. 另外, 这里的 "可写" 等效于信号灯集合里的 "可更改".

<sys/ipc.h> 系统头文件里还定义了如下符号常数:

IPC_CREAT
如果 key 不存在就创建.
IPC_EXCL
如果 key 已经存在则失败.
IPC_NOWAIT
如果请求必须等待, 产生错误.
IPC_PRIVATE
私有 key.
IPC_RMID
删除资源.
IPC_SET
设置资源选项.
IPC_STAT
取得资源选项.

请注意 IPC_PRIVATE 是一个 key_t 类型, 而别的符号常数都是标志域,它们的可以或( OR )在一起形成 int 类型.

消息队列

消息队列由正整数 (它的 msqid) 唯一标识, 其结构体 struct msquid_ds<sys/msg.h> 中定义, 包含如下成员:

       struct ipc_perm msg_perm;
       ushort msg_qnum;         /* 队列中消息数目
*/

       ushort msg_qbytes;       /* 一条队列最大字节数
*/

       ushort msg_lspid;        /* 上一次 msgsnd
调用的 pid */

       ushort msg_lrpid;        /*
上一次 msgrcv 调用的 pid */

       time_t
msg_stime;       
/* 上一次 msgsnd 的时间
*/

       time_t msg_rtime;        /* 上一次 msgrcv
的时间 */

       time_t msg_ctime;        /*
上一次修改时间 */

msg_perm
ipc_perm 结构, 指明了对该消息队列的访问权限.
msg_qnum
该队列当前的消息总数.
msg_qbytes
该队列所允许的消息正文最大字节总数.
msg_lspid
最后做 msgsnd 系统调用的进程的 ID.
msg_lrpid
最后做 msgrcv 系统调用的进程的 ID.
msg_stime
最近做 msgsnd 系统调用的时间.
msg_rtime
最近做 msgrcv 系统调用的时间.
msg_ctime
最后一次改变 msqid_ds 结构成员的时间.

信号灯集合

信号灯集合由正整数 (它的 semid) 唯一标识, 并有一个与之关联的结构体 struct
semid_ds
它在 <sys/sem.h> 中定义, 包含如下成员:

       struct ipc_perm sem_perm;

       time_t sem_otime;        /* 上一次操作的时间
*/

       time_t sem_ctime;        /* 上一次修改的时间
*/

       ushort sem_nsems;        /* 集合中信号灯数目
*/

sem_perm
ipc_perm 结构, 指明对该信号灯集合的访问权限.
sem_otime
最近做 semop 系统调用的时间.
sem_ctime
最近做 semctl 系统调用的时间, 该调用修改了上面结构的一个成员或者改变了属于该集合的一个信号灯.
sem_nsems
该信号灯集合的信号灯数目. 集合中每个信号灯都可以用从 0sem_nsems-1 的一个非负整数来引用.

一个信号灯就是一个 struct sem 结构, 包含如下成员:

       ushort semval;   /* 信号灯值
*/

       short sempid;    /* 上一次操作的进程的 pid
*/

       ushort semncnt;  /* 等待增加 semval 值的进程数目
*/

       ushort semzcnt;  /* 等待 semval = 0
的进程数目 */

semval
该信号灯值,是一个非负整数.
sempid
最后一个对该信号灯做操作的进程 ID.
semncnt
等待增加 semval 的进程数.
semznt
等待 semval 变成 0 的进程数.

共享内存段

共享内存段由正整数 (它的 shmid) 唯一标识, 有一个关联的结构类型 struct
shmid_ds
<sys/shm.h> 中定义, 包含如下成员:

       struct ipc_perm shm_perm;
       int
shm_segsz;  
/* 段尺寸 */

       ushort
shm_cpid;        
/* 创建者 pid */

       ushort
shm_lpid;        
/* 上一次操作的进程的 pid
*/

       short shm_nattch;        /* 目前附着的进程数目
*/

       time_t shm_atime;        /* 上一次附着的时间
*/

       time_t shm_dtime;        /* 上一次脱离的时间
*/

       time_t shm_ctime;        /* 上一次修改的时间
*/

shm_perm
ipc_perm 结构, 指明对共享内存段的访问权限.
shm_segsz
共享内存段的大小, 以字节为单位.
shm_cpid
创建该共享内存段的进程的 ID.
shm_lpid
最后执行 shmat 或者 shmdt 系统调用的进程 ID.
shm_nattch
当前对该共享内存段的活跃连接数.
shm_atime
最后做 shmat 系统调用的时间.
shm_dtime
最后做 shmdt 系统调用的时间.
shm_ctime
最后做 shmctl 系统调用的时间, 如果该调用改变了 shmid_ds. 

ipc - System V 进程间通信机制的更多相关文章

  1. 【linux高级程序设计】(第十一章)System V进程间通信 1

    System V, 曾经也被称为 AT&T System V,是Unix操作系统众多版本中的一支. 传统上,System V 被看作是两种UNIX"风味"之一(另一个是 B ...

  2. Linux IPC System V 信号量

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> ftok() //获取key ...

  3. Linux IPC System V 消息队列

    模型 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> ftok() //获取key ...

  4. Linux IPC System V 共享内存

    模型 #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> ftok() //获取key值 s ...

  5. system v进程间通信整理

    key_t键和ftok函数 三种类型的system v IPC使用key_t值作为他们的名字.头文件<sys/types.h> 把key_t这个数据类型定义为一个整数,它通常是一个至少32 ...

  6. 【linux高级程序设计】(第十一章)System V进程间通信 3

    信号量通信机制 可以看到,跟消息队列类似,也是包括两个结构. int semget (key_t __key, int __nsems, int __semflg) : 创建信号量集合 第一个参数:f ...

  7. System V进程间通信

    一)Linux环境进程间通信(一)管道及有名管道http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/二)Linux环境进程间通信(二): 信号 ...

  8. 【linux高级程序设计】(第十一章)System V进程间通信 4

    共享内存 共享内存主要用于实现进程间大量数据传输. 共享内存的数据结构定义: 系统对共享内存的限制: 共享内存与管道的对比: 可以看到,共享内存的优势: 1.共享内存只需复制2次,而管道需要4次 2. ...

  9. 【linux高级程序设计】(第十一章)System V进程间通信 2

    消息队列 消息队列是消息的链式队列,模型如下: 包括两种数据结构: msqid_ds消息队列数据结构 msg消息队列数据结构 struct msg_msg{ struct list_head m_li ...

随机推荐

  1. 【编程漫谈】Hello world!

    Hello world!是打开编程世界的第一把钥匙,只要你能运行出Hello world!,基本上就算入了个门了,因为程序正确的运行代表着基本开发环境都有了,包括编辑器,编译器,解释器,运行环境等待, ...

  2. [论文理解] Receptive Field Block Net for Accurate and Fast Object Detection

    Receptive Field Block Net for Accurate and Fast Object Detection 简介 本文在SSD基础上提出了RFB Module,利用神经科学的先验 ...

  3. sqlToolbox 1.82 Beta版 下载

    下载链接:https://pan.baidu.com/s/1jCTRe0NGgEb5qF3BDN_jTQ 久违的回忆. 2019年8月30日13点43分

  4. [VBA]合并工作簿优化版

    Sub 合并工作簿数据()Dim arrDim i As Integer, j As Integer, x As IntegerDim f As String, m As String, n As S ...

  5. UTF-8 有BOM 和 无BOM的区别

    BOM: Byte Order Mark,即字节序标志 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在UC ...

  6. maven将自己的springboot项目打包成jar包后,作为工具包引入其他项目,找不到jar中的类

    将springboot项目打包成jar包,作为工具包导入项目后,找不到jar中的类. 原因是:springboot项目使用了自动的打包插件. 原先的插件配置: <build> <pl ...

  7. 针对C++容器类的一个简陋的allocator

    参考: https://en.cppreference.com/w/cpp/named_req/Allocator http://www.josuttis.com/libbook/memory/mya ...

  8. Oracle自动性能统计

    Oracle自动性能统计   高效诊断性能问题,需要提供完整可用的统计信息,好比医生给病人看病的望闻问切,才能够正确的确诊,然后再开出相应的药方.Oracle数据库为系统.会话以及单独的sql语句生成 ...

  9. linu基础命令1

    /根目录,第一级目录 1.ls列出当前目录下的文件和目录-a: 列出所有的文件,包括所有以.开头的隐藏文件-d: 列出目录本身,并不包含目录中的文件(-ld)-h: 和-l一起使用,文件大小人类易读 ...

  10. CentOS7中SSH免密登陆设置

    一.准备三台客户机 hadoop100 192.168.13.100(Master) hadoop101 192.168.13.101 hadoop102 192.168.13.102 二.在hado ...