zoukankan      html  css  js  c++  java
  • ipc

    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. 
  • 相关阅读:
    设计模式_桥梁模式
    C++基础学习教程(一)
    Python图像处理(11):k均值
    Cygwin-安装和配置ssh服务
    LeetCode11:Container With Most Water
    事务四大特征:原子性,一致性,隔离性和持久性(ACID)
    2014微软编程之美初赛第一场第三题 活动中心
    改进xutils下载管理器,使其,在随意地方进行进度更新,以及其它状态监听操作
    IT痴汉的工作现状21-Android开发前景论
    Spring配置文件总结
  • 原文地址:https://www.cnblogs.com/fanweisheng/p/11088060.html
Copyright © 2011-2022 走看看