IPC之消息队列·即时通讯小程序(一)

  

消息队列

  

上次说到了进程间通信的管道,不过匿名管道有个缺点就是,只能做到有亲缘关系的进程间通信,所以今天学习一个新的进程间通信方式,消息队列。

  
      <李>消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法   <李>每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值   <李>   

    消息队列也有管道一样的不足,就是每个数据块的最大长度是有上限的,系统上全体队列的最大总长度也有一个上限
     IPC之消息队列·即时通讯小程序(一)

      

    消息队列函数

      

    头文件
    # include & lt;sys/types.h>
    # include & lt;sys/ipc.h>
    # include & lt;sys/msg.h>

      

    msgget

      

    int msgget (key_t键,int msgflg);
    作用:创建和访问一个消息队列
    关键:某个消息队列的名字(类似于每个进程都有一个进程ID一样)
    msgflg:有9个权限标志构成。它们的用法和创建文件时使用的方式标志是一样的(比如:一个关键已经存在的消息队列时,要使用IPC_CREAT | IPC_EXCL,就类似于文件操作的打开:O_CREAT | O_EXCL)。
    返回值:成功将返回一个非负整数,即该消息队列的标识码;失败返回1

      

    msgsnd

      
     <代码> int msgsnd (int msqid, const void * msgp, size_t msgsz, int msgflg);  
      

    作用:把一条消息加到消息队列里面
    是否:由msgget函数返回的消息队列标识码
    msgp:是一个指针,指向准备发送的消息
    msgsz: msgp指向的消息长度,这个长度不能保存消息类型里的“长int”类型(下面会说)
    msgflg:控制着当前消息队列满或达到系统上限时将要发生的事情。
    返回值:成功0,失败1
    1)

      
     <代码> struct msgbuf {
      长mtype;/*消息类型,必须在0 */字符多行文字[1];/* */消息数据
      }; 
      

    消息的指针就是指向这样一个结构的消息,这需要我们自己定义。但是,第一个一定得是长整型,表示消息的类型。消息的类型是大于0的整数(当然也是可以等于0的,但是这样就意味着任何消息我都接收,不固定只收某一种类型的消息了)。

      李   <李> msgtype=0返回队列第一条信息李   <李> msgtype> 0返回队列第一条类型等于msgtype的消息李   <李> msgtype<0返回队列第一条类型小于等于msgtype绝对值的消息李   
  

msgrcv

  

作用:从一个消息队列里检索消息
ssize_t msgrcv (int msqid, void * msgp, size_t msgsz,长msgtyp, int msgflg);
是否:由msgget函数返回的消息队列标识码
msgp:是一个指针,指向准备接收的消息
msgsz: msgp指向的消息长度,这个长度不能保存消息类型里的“长int”类型(下面会说)
msgflg:控制着队列中没有相应类型的消息可供接收的时候将要发生的事
<强> msgtyp:可以实现接收优先级的简单形式
返回值:成功,返回实际放到接收缓冲区里的字符个数,失败——“1”
msgflg有以下几个值:
 IPC之消息队列·即时通讯小程序(一)

  
      <李> msgflg=IPC_NOWAIT队列没有可读消息不等,待返回ENOMSG错误。   <李> msgflg=MSG_NOERROR消息大小超过msgsz时被截断李   <李> msgtype> 0且msgflg=MSC_EXCEPT接收类型不等于msgtype的第一条消息。   

    msgctl

      
     <代码> int msgctl (int, int msqid cmd, struct msqid_ds * buf);  
      

    作用:消息队列的控制函数
    是否:由msgget函数返回的消息队列标识码
    cmd:将要采取的动作,简单讲常用的三个可取值:

      
  

 IPC之消息队列·即时通讯小程序(一)
 IPC之消息队列·即时通讯小程序(一)
msgid_ds数据结构定义如下:

  
 <代码> struct msqid_ds {
  struct ipc_perm msg_perm;/* */所有权和权限
  time_t msg_stime;/*时间最后msgsnd (2) */time_t msg_rtime;/*时间最后msgrcv (2) */time_t msg_ctime;/*时间的改变*/无符号长__msg_cbytes;/*当前的字节数
  队列(非标)*/msgqnum_t msg_qnum;/*当前的消息数量
  在队列*/msglen_t msg_qbytes;/*最大的字节数
  允许在队列*/pid_t msg_lspid;/* PID最后msgsnd (2) */pid_t msg_lrpid;/*去年msgrcv PID (2) */};

IPC之消息队列·即时通讯小程序(一)