ipcmk下令
此下令可以创建ipc对象msgget()函数
此函数可以获得之前创建的消息队列的标识符- int msgget(key_t key,int msgflg)
- //key:指的是要创建的消息队列的key键值,键值类型key_t其实在内核源码中指的是int类型
- //msgflg:创建消息队列的标志
- //其中IPC_CREAT指的是如果消息队列不存在则创建,IPC_EXCL指的是如果消息队列存在则表示函数调用失败。
- //也可以指定消息队列的权限,权限设置为0644即可
- //ret:成功返回消息队列的标识符,失败返回-1
复制代码 ftok函数
此函数可以生成IPC对象的键值key- key_t ftok(const char *pathname,int proj_id)
- //pathname;文件路径
- //proj_id:项目id由用户指定,是非0值,1-255
- //ret:成功返回键值key,失败返回-1
- //notice:文件路径和项目id一样则返回的键值一样
复制代码 msgsend函数
该函数可以向指定的消息队列发送消息- struct msgbuf {
- long mtype; /* message type, must be > 0 */
- char mtext[1]; /* message data */
- };
- int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
- //msgid指的是消息队列的标识符
- //msgp指的是一个指向struct msgbuf类型的结构体指针,该结构体中有两个成员,其中一个成员mtype指的是消息类型,必须是一个大于0的正整数,另一个成员mtext指的是消息正文,类型可以是数组或者其他结构。
- //msgsz指的是消息正文的大小,按字节计算,当然msgsz的值必须是非负整数,可以设置为0,表示消息正文的长度为0。
- //msgflg指的是消息队列的标志,如果该标志设置为IPC_NOWAIT,则表示不阻塞,此时如果待写入的消息的长度大于消息队列剩余空间,则直接返回并报错。
- //notice:消息队列默认的属性是阻塞的,也就是当待写入的消息的长度大于消息队列剩余空间时,默认阻塞,直到消息队列的容量足够容纳时会解除阻塞。
复制代码 msgrcv函数
- ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
- //msgqid指的是MSG对象的标识符ID
- //msgp指的是存放消息的缓存地址,该地址下存储的是struct msgbuf结构体。
- //msgsz指的是存放消息的缓存的大小,按照字节计算,如果消息正文的大小大于用户设置的缓存大小,则根据msgflg是否为MSG_NOERROR进行判断,如果msgflg设置为MSG_NOERROR ,则可以读取对应字节的消息,如果msgflg没有设置,则无法读取消息并报错。
- //msgtyp指的是要接收消息的类型,在调用msgsnd函数时构造的消息结构体中有该成员的值。
- //等于0:指的是不区分类型,直接读取MSG中的第一个消息。
- //大于0:读取类型为指定msgtyp的第一个消息(若msgflg被配置了MSG_EXCEPT则读取除了类型为msgtyp的第一个消息)
- //3)小于0:读取类型小于等于msgtyp绝对值的第一个具有最小类型的消息。例如当MSG对象中有类型为3、1、5类型消息若干条,当msgtyp为-3时,类型为3的第一个消息将被读取。
- //msgflg指的是接收消息选项,如果msgflg设置为0,指的是默认接收模式,在MSG中无指定类型消息时阻塞。
- //IPC_NOWAIT:指的是非阻塞接收模式,当MSG中没有指定类型消息时直接退出函数
- //MSG_EXCEPT :指的是读取除msgtyp之外的第一个消息。
- //MSG_NOERROR:如果待读取的消息尺寸比msgsz大只返回msgsz部分,其余部分丢弃
复制代码 msgctl函数
该函数实现获取消息队列的属性信息、设置消息队列的属性信息、删除消息队列等操作。- int msgctl(int msqid, int cmd, struct msqid_ds *buf);
- //msgqid指的是MSG对象的标识符ID
- //cmd指定操作符
- //buf存储信息的结构体
- struct msqid_ds {
- struct ipc_perm msg_perm; /* Ownership and permissions */
- time_t msg_stime; /* Time of last msgsnd(2) */
- time_t msg_rtime; /* Time of last msgrcv(2) */
- time_t msg_ctime; /* Time of last change */
- unsigned long __msg_cbytes; /* Current number of bytes in
- queue (nonstandard) */
- msgqnum_t msg_qnum; /* Current number of messages
- in queue */
- msglen_t msg_qbytes; /* Maximum number of bytes
- allowed in queue */
- pid_t msg_lspid; /* PID of last msgsnd(2) */
- pid_t msg_lrpid; /* PID of last msgrcv(2) */
- };
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |