Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!
Posted CPP进阶之旅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!相关的知识,希望对你有一定的参考价值。
消息队列实现进程间的通信
消息队列实现进程间通信的过程:首先将数据打包成指定格式的消息,其中一个进程负责将消息发送到队列中,另外一个进程通过接收队列中的消息,从而实现进程间的通信。
消息队列实现进程间通信的流程如下:
1)使用ftok函数,获取key值;
2)使用msgget函数,创建/获取消息队列;
3)使用msgsnd/msgrcv函数,发送消息到/接收消息队列中的消息;
4)使用msgctl函数,删除消息队列;
相关函数介绍
1、msgget函数:创建/获取消息队列
函数原型:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
参数解析:
1)key值,ftok函数的返回值
2)操作标志,如下:
IPC_CREAT:创建;
IPC_EXCL:若存在则创建失败;
0:获取已经存在的消息队列;
返回值:成功返回消息队列的ID,失败返回-1;
功能:主要用于创建/获取消息队列。
注意:
当创建新的消息队列时,需要通过按位或的方式来指定权限信息,如:0664。
2、msgsnd函数:发送指定的消息到指定的消息队列
函数原型:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
参数解析:
1)消息队列的ID,msgget函数的返回值;
struct msgbuf
{
long mtype; //消息的类型, must be > 0
char mtext[1]; //消息的内容,可以是其他类型
};
3)消息的大小:主要用于指定消息内容的大小,不包括消息的类型;
4)发送消息的标志,默认给0即可;
功能:用于发送指定的消息到指定的消息队列中。
3、msgrcv函数:接收指定消息队列中的消息
函数原型:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);
参数解析:
1)消息队列的ID,msgget函数的返回值
3)期望接收的消息大小
4)期望接收的消息类型
0 :表示始终读取消息队列中的第一个消息;
>0 :表示始终读取消息队列中第一个类型为msgtyp的消息;
<0 :表示始终读取消息队列中类型小于等于msgtyp绝对值的消息,其中最小的优先读取;
5)消息接收的标志,默认给0即可;
返回值:成功返回实际接收的数据大小,失败返回-1;
功能:用于接收指定消息队列中的消息。
4、msgctl函数:用于操作指定的消息队列
函数原型:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
参数解析:
1)消息队列的ID,msgget函数的返回值;
2)具体的操作命令,如:
IPC_RMID - 删除消息队列,此时第三个参数给NULL即可;
3)结构体指针;
函数功能:用于操作指定的消息队列。
返回值:成功返回0 ,出错返回-1,错误原因存于error中 。
小知识(消息队列相关命令)
1)ipcs -q 表示查看系统中存在的消息队列;
2)ipcrm -q 消息队列的ID 表示删除指定的消息队列;
以上是关于Linux C语言高级编程之使用消息队列实现进程间通信!重点内容!!!的主要内容,如果未能解决你的问题,请参考以下文章