linux IPC -msg 消息队列

1.进程通讯的方式:消息队列、 共享内存段 、信号量、管道、SOCKET等。
2.linux 下IPCS命令的做用:报告进程间通讯设施状态-
ipcs -q查看消息队列,-m查看内存,-s查看信号量 -a查看上述全部信息 
3.消息队列:msg  
    3.1 消息队列建立:int msgget(key_t key,IPC_CREAT|IPC_EXCL|(权限));//成功返回消息队列标识值
   key_t 为消息队列关联值 : IPC_PRIVATE
   IPC_CREAT,若是队列存在则打开,不存在则建立。
   IPC_EXCL自己没什么用,和IPC_CREAT一块儿使用时,若是队列存在则返回错误-1
   函数调用成功,则返回 消息队列标识值,错误时,返回不一样值,如,已存在但没有权限打开,没有内存,已达到系统最大消息值,不存在但没有使用IPC_CREAT...
   3.2 写消息到消息队列中
   int msgsnd(int msqid,void * ptr,size_t nbytes ,int flags); //成功返回0
        msqid 消息队列标识,ptr 消息结构指针,nbytes 消息长度,flags :0表示忽略。
        ptr 指针,指向的是一个可定义的消息缓冲区,用来存储要发送和接收的消息。定义以下:
   struct msgbuf
          {
               long mtype;//消息类型 >0
               char mtext[1];//消息文本
           }
    3.3 从消息队列中读消息
           ssize msgrcv(int msqid,void * ptr,size_t nbytes,long type,int flags);//成功返回接收到的消息数据长度。
          nbytes 要接收的数据长度(应该是msgbuf中定义的数组大小+1),若是接收到的数据长度比nbytes大,则按照flags进行处理:
   flags:  IPC_NOWAIT 队列中没有要找到的消息时 出错返回。errno 为ENOMSG
      o 函数阻塞    
   type :0 则从队列头中开始取消息 ,>0 则找到消息队列中消息类型为type在第一个取消息,<0 则返回消息类型小于等于type绝对值的最小值的第1条消息 linux

   3.4  操做消息队列 int msgctl(int msqid,int cmd,struct msqid_ds * buf);
            buf 为cmd命令参数。
            cmd: IPC_STAT 取消息队列中msqid_ds 数据
       IPC_SET设置消息队列的msqid_ds 数据
       IPC_RMID 删除消息队列 数组

linux/msg.h 中定义,以下所示: app

struct msqid_ds{ 函数

    struct ipc_perm     msg_perm;   .net

    msgqnum_t   msg_qnum;       指针

    msglen_t    msg_qbytes;     blog

    pid_t       msg_lspid;      队列

    pid_t       msg_lrpid;          进程

    time_t      msg_stime;      ip

    time_t      msg_rtime;     

    time_t      msg_ctime;     

    ...

   

    ...

}; --http://blog.csdn.net/renrenhappy/article/details/5862254

相关文章
相关标签/搜索