消息队列的函数接口

打印 上一主题 下一主题

主题 1963|帖子 1963|积分 5889

ipcmk下令

此下令可以创建ipc对象
  1. ipcmk -Q        //用于创建消息队列
复制代码
msgget()函数

此函数可以获得之前创建的消息队列的标识符
  1. int msgget(key_t key,int msgflg)
  2. //key:指的是要创建的消息队列的key键值,键值类型key_t其实在内核源码中指的是int类型
  3. //msgflg:创建消息队列的标志
  4. //其中IPC_CREAT指的是如果消息队列不存在则创建,IPC_EXCL指的是如果消息队列存在则表示函数调用失败。
  5. //也可以指定消息队列的权限,权限设置为0644即可
  6. //ret:成功返回消息队列的标识符,失败返回-1
复制代码
ftok函数

此函数可以生成IPC对象的键值key
  1. key_t ftok(const char *pathname,int proj_id)
  2. //pathname;文件路径
  3. //proj_id:项目id由用户指定,是非0值,1-255
  4. //ret:成功返回键值key,失败返回-1
  5. //notice:文件路径和项目id一样则返回的键值一样
复制代码
msgsend函数

该函数可以向指定的消息队列发送消息
  1. struct msgbuf {
  2.                long mtype;       /* message type, must be > 0 */
  3.                char mtext[1];    /* message data */
  4.            };
  5. int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
  6. //msgid指的是消息队列的标识符
  7. //msgp指的是一个指向struct msgbuf类型的结构体指针,该结构体中有两个成员,其中一个成员mtype指的是消息类型,必须是一个大于0的正整数,另一个成员mtext指的是消息正文,类型可以是数组或者其他结构。
  8. //msgsz指的是消息正文的大小,按字节计算,当然msgsz的值必须是非负整数,可以设置为0,表示消息正文的长度为0。
  9. //msgflg指的是消息队列的标志,如果该标志设置为IPC_NOWAIT,则表示不阻塞,此时如果待写入的消息的长度大于消息队列剩余空间,则直接返回并报错。
  10. //notice:消息队列默认的属性是阻塞的,也就是当待写入的消息的长度大于消息队列剩余空间时,默认阻塞,直到消息队列的容量足够容纳时会解除阻塞。
复制代码
msgrcv函数
  1. ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
  2. //msgqid指的是MSG对象的标识符ID
  3. //msgp指的是存放消息的缓存地址,该地址下存储的是struct  msgbuf结构体。
  4. //msgsz指的是存放消息的缓存的大小,按照字节计算,如果消息正文的大小大于用户设置的缓存大小,则根据msgflg是否为MSG_NOERROR进行判断,如果msgflg设置为MSG_NOERROR ,则可以读取对应字节的消息,如果msgflg没有设置,则无法读取消息并报错。
  5. //msgtyp指的是要接收消息的类型,在调用msgsnd函数时构造的消息结构体中有该成员的值。
  6. //等于0:指的是不区分类型,直接读取MSG中的第一个消息。
  7. //大于0:读取类型为指定msgtyp的第一个消息(若msgflg被配置了MSG_EXCEPT则读取除了类型为msgtyp的第一个消息)
  8. //3)小于0:读取类型小于等于msgtyp绝对值的第一个具有最小类型的消息。例如当MSG对象中有类型为3、1、5类型消息若干条,当msgtyp为-3时,类型为3的第一个消息将被读取。
  9. //msgflg指的是接收消息选项,如果msgflg设置为0,指的是默认接收模式,在MSG中无指定类型消息时阻塞。
  10. //IPC_NOWAIT:指的是非阻塞接收模式,当MSG中没有指定类型消息时直接退出函数
  11. //MSG_EXCEPT :指的是读取除msgtyp之外的第一个消息。
  12. //MSG_NOERROR:如果待读取的消息尺寸比msgsz大只返回msgsz部分,其余部分丢弃
复制代码
msgctl函数

该函数实现获取消息队列的属性信息、设置消息队列的属性信息、删除消息队列等操作。
  1. int msgctl(int msqid, int cmd, struct msqid_ds *buf);
  2. //msgqid指的是MSG对象的标识符ID
  3. //cmd指定操作符
  4. //buf存储信息的结构体
  5. struct msqid_ds {
  6.                struct ipc_perm msg_perm;     /* Ownership and permissions */
  7.                time_t          msg_stime;    /* Time of last msgsnd(2) */
  8.                time_t          msg_rtime;    /* Time of last msgrcv(2) */
  9.                time_t          msg_ctime;    /* Time of last change */
  10.                unsigned long   __msg_cbytes; /* Current number of bytes in
  11.                                                 queue (nonstandard) */
  12.                msgqnum_t       msg_qnum;     /* Current number of messages
  13.                                               in queue */
  14.                msglen_t        msg_qbytes;   /* Maximum number of bytes
  15.                                                 allowed in queue */
  16.                pid_t           msg_lspid;    /* PID of last msgsnd(2) */
  17.                pid_t           msg_lrpid;    /* PID of last msgrcv(2) */
  18.            };
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表