Linux之SystemV消息队列



                消息队列
     消息队列是将消息按队列的方式组织成的链表,每个消息都是其中的一个节点。
    消息队列的运行方式与命名管道非常相似。欲与其他进程通信的进程只要将消息发送到消息队列中,目的进程就从消息队列中读取需要的消息。需要注意的是,消息队列的长度以及每个消息的大小都是有限制的。

Linux系统提供的消息队列操作函数主要有以下几个:
int msgget(key_t key,int msgflg);
int msgsnd(int msqid, const void *msgptr,  int msgsz,int msgflg);
int msgrcv(int msqid, void *msgptr, int msgsz, long msgtyp, int msgflg);
int msgctl(int msqid, int cmd, struct msqid_ds *buf);

   ①msgget()函数与信号量的semget()函数相似,作用是创建一个消息队列。参数key是一个键值,可由用户设定也可通过ftok()函数获得。Msgflg参数设置的是一些标志位,可以是IPC_CREAT、IPC_EXCL、IPC_NOWAIT中的一个或者他们的组合。创建成功则返回消息队列ID;否则返回-1。

   ②Msgsnd()函数的作用是将消息发送到消息队列中去。Msqid为消息队列ID。Msgptr是指想要发送的消息的指针,并且指向的缓冲区得第一个字段应为长整形,指定消息类型,消息内容存放在该缓冲区得紧跟消息类型字段得区域中。Msgsz是要发送的消息的长度。Msgflg与msgget()函数中的msgflg参数设置类似,设置当消息队列满等情况出现时的处理方式,如果msgflg设置为IPC_NOWAIT,则不发送消息并且立即返回-1;否则发送进程挂起等待。
如果msgsnd()函数调用成功,就会把消息复制到消息队列中去并返回0;否则返回-1。

   ③Msgrcv()函数的作用是从消息队列中读取一个消息。Msqid是消息队列的ID。Msgptr保存从消息队列中读到的消息。Msgsz是msgptr指向的消息的长度。Msgtyp指定要求的消息类型,见表
     Msgrcv()函数msgtyp参数说明
      Msgtyp取值              说明
      大于0          接收消息队列中类型为msgtyp的第一个可用报文
      等于0          接收消息队列中的第一个可用报文
      小于0          接收消息队列中小于或等于msgtyp绝对值的第一个可用报文
    Msgflg的设置与msgsnd()函数中 的参数msgflg设置类似,用于设置如何处理当前消息队列中没有满足条件的消息的情况。
    如果msgrcv()函数调用成功,则返回读出的实际字节数;否则返回-1.

    ④Msgctl()函数是消息队列的控制函数,类似于信号量的控制函数semctl()。Msqid是消息队列的ID。Cmd是要采取的控制操作,有3个可取值,见表
         参数值             说明
         IPC_SET 设置消息队列的属性,将buf指向的结构体中的数值设置为消息队列的相关性
        IPC_STAT 获取消息队列的属性信息并保存到buf指向的结构体中
        IPC_RMID 移除ID为msqid的消息队列


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值