Linux进程间通信--消息队列

àì夳堔傛蜴生んèń 2023-03-02 14:59 89阅读 0赞

system v ipc

ipcs

  • key:通信双方约定好的KEY值,32位的整形数据
  • id :系统会为IPC分配一个唯一的ID,通信双方都需要知道ID才能使用当前IPC方法,创建者会返回当前ID值,

    include

    1. #include <sys/ipc.h>
    2. key_t ftok(const char *pathname, int proj_id);
    3. . proj_id
    4. key 31-24 proj_id 8
    5. key 23-16 st_dev属性的低8
    6. key 15-0 st_ino属性的低16
  • 对象

  • 拥有者及权限对象

    struct ipc_perm
    {

    1. __kernel_key_t key;
    2. __kernel_uid_t uid;
    3. __kernel_gid_t gid;
    4. __kernel_uid_t cuid;
    5. __kernel_gid_t cgid;
    6. __kernel_mode_t mode;
    7. unsigned short seq;

    };

XSI消息队列

  • 对象:
    struct msqid_ds

    struct msqid_ds {

    1. struct ipc_perm msg_perm; /* Ownership and permissions */
    2. time_t msg_stime; /* Time of last msgsnd(2) */
    3. time_t msg_rtime; /* Time of last msgrcv(2) */
    4. time_t msg_ctime; /* Time of last change */
    5. unsigned long __msg_cbytes; /* Current number of bytes in queue (nonstandard) */
    6. msgqnum_t msg_qnum; /* Current number of messages in queue */
    7. msglen_t msg_qbytes; /* Maximum number of bytes allowed in queue */
    8. pid_t msg_lspid; /* PID of last msgsnd(2) */
    9. pid_t msg_lrpid; /* PID of last msgrcv(2) */
    10. struct msg * msq_first ;
    11. struct msg * msq_last ;
    12. };

在这里插入图片描述

优点和缺点

优点:

  1. 消息队列是两个不相关进程之间传递数据的有效渠道.
  2. 与命名管道相比,具有的优势是:
    独立于发送以及接收进程而存在;
    消除命名管道的打开以及关闭而存在的困难;
    可以提前查看紧急信息;
    避免命名管道的同步以及阻塞问题;
    缺点:
    与命名管道一样,每个数据块都有一个最大长度限制;
    系统中所有队列包含的全部数据块长度也有一个上限;

    • 创建对象:
      int msgget(key_t key, int msgflg);

      int msgget(key_t key, int msgflg);

key_t key
int msgflg 确定消息队列的访问权限,

  1. IPC_CREAT 找到当前的key对应的IPC,如果没有IPC则进行创建
  2. IPC_EXCL 如果存在则返回失败
  3. IPC_NOWAIT 返回值为当前ipc对应的id
  • 设置对象:

    int msgctl(int msqid,int cmd,struct msqid_ds *buf);

    1. cmd:
    2. IPC_RMID 删除
    3. IPC_SET 设置ipc_perm参数
    4. IPC_STAT 获取ipc_perm参数
    5. IPC_INFO 获取ipc信息 ipcs
  • 使用对象:

    1. 发送

      int msgsnd(int msqid,const void *msg_ptr,size_t sz,int msgflg);

      1. struct msgbuf

      {

      1. long mtype; /* message type, must be > 0 */
      2. char mtext[1]; /* message data */
      3. };
      1. 接收

        ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,

        1. int msgflg);

    msgtyp 0 默认接收第一条消息
    msgtyp > 0 接收第一条msgtyp消息
    msgtyp < 0 接收小于msgtyp绝对值的消息

    早期的版本,现在根据Ubuntu的版本不一样可能会有出入
    msgmni 最大消息队列数 16
    msgmax 最大消息长度(字节数) 8192
    msgmnb 消息队列中的最大字节数 16384

发表评论

表情:
评论列表 (有 0 条评论,89人围观)

还没有评论,来说两句吧...

相关阅读