使用消息队列实现进程间的通信
首先将发送的数据打包成消息的类型,使用一个进程负责将消息发送到消息队列中,另外一个进程负责从消息队列中接收信息,从而实现进程间通信
1 使用消息队列通信的基本流程
(1)获取key值,使用ftok函数
ftok函数
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname,int proj_id);
第一个参数:字符串形式的路径名(必须存在,可以访问)
第二个参数:项目ID,取低8位(必须是非0)
返回值:成功返回生成的key值,失败返回-1
函数功能:
主要用于根据参数指定的路径和项目ID,生成一个key值
注意:
如果使用相同的路径名和项目ID,则生成相同的key值
(2)创建/获取消息队列,使用msgget函数
msgget函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
第一个参数:key值,ftok函数的返回值
第二个参数:操作标志
IPC_CREAT - 创建消息队列
IPC_EXCL - 与IPC_CREAT搭配使用,存在则创建失败
0 - 表示获取已存在的消息队列
返回值:成功返回消息队列的ID,失败返回-1
函数功能:主要用于获取一个消息队列的ID
注意:
当创建一个新的消息队列时,需要在第二个参数中指定消息队列的权限,如:0644
(3)发送/接受消息队列中的消息,使用msgsnd/msgrcv函数
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);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:消息的首地址,消息的格式如下:
struct msgbuf
{
long mtype;/*消息的类型, must be > 0 */
char mtext[1];/*消息的内容,可以是其他数据类型*/
};
第三个参数:消息的大小
指消息内容的大小,不包括消息的类型
第四个参数:发送的方式,一般给0即可
函数功能:主要用于发送指定的消息到指定的消息队列中
msgrcv函数
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:存放接受到消息的首地址
第三个参数:消息的大小
第四个参数:消息的类型
0 - 读取消息队列中的第一个消息
>0 - 读取消息队列中第一个类型为msgtyp的消息
<0 - 读取消息队列中<=msgtyp绝对值的消息,最小的优先读取
第五个参数:接受的方式,一般给0即可
返回值:成功返回接受的消息大小,失败返回-1
函数功能:主要用于从指定的消息队列中接受消息

(4)如果不再使用,则删除消息队列,使用msgctl函数
msgctl函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid,int cmd,struct msqidds *buf);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:操作的命令
IPC_RMID - 删除指定的消息队列,第三个参数给NULL
第三个参数:结构体指针
首先将发送的数据打包成消息的类型,使用一个进程负责将消息发送到消息队列中,另外一个进程负责从消息队列中接收信息,从而实现进程间通信
1 使用消息队列通信的基本流程
(1)获取key值,使用ftok函数
ftok函数
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname,int proj_id);
第一个参数:字符串形式的路径名(必须存在,可以访问)
第二个参数:项目ID,取低8位(必须是非0)
返回值:成功返回生成的key值,失败返回-1
函数功能:
主要用于根据参数指定的路径和项目ID,生成一个key值
注意:
如果使用相同的路径名和项目ID,则生成相同的key值
(2)创建/获取消息队列,使用msgget函数
msgget函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgget(key_t key, int msgflg);
第一个参数:key值,ftok函数的返回值
第二个参数:操作标志
IPC_CREAT - 创建消息队列
IPC_EXCL - 与IPC_CREAT搭配使用,存在则创建失败
0 - 表示获取已存在的消息队列
返回值:成功返回消息队列的ID,失败返回-1
函数功能:主要用于获取一个消息队列的ID
注意:
当创建一个新的消息队列时,需要在第二个参数中指定消息队列的权限,如:0644
(3)发送/接受消息队列中的消息,使用msgsnd/msgrcv函数
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);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:消息的首地址,消息的格式如下:
struct msgbuf
{
long mtype;/*消息的类型, must be > 0 */
char mtext[1];/*消息的内容,可以是其他数据类型*/
};
第三个参数:消息的大小
指消息内容的大小,不包括消息的类型
第四个参数:发送的方式,一般给0即可
函数功能:主要用于发送指定的消息到指定的消息队列中
msgrcv函数
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:存放接受到消息的首地址
第三个参数:消息的大小
第四个参数:消息的类型
0 - 读取消息队列中的第一个消息
>0 - 读取消息队列中第一个类型为msgtyp的消息
<0 - 读取消息队列中<=msgtyp绝对值的消息,最小的优先读取
第五个参数:接受的方式,一般给0即可
返回值:成功返回接受的消息大小,失败返回-1
函数功能:主要用于从指定的消息队列中接受消息
(4)如果不再使用,则删除消息队列,使用msgctl函数
msgctl函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
int msgctl(int msqid,int cmd,struct msqidds *buf);
第一个参数:消息队列的ID,msgget函数的返回值
第二个参数:操作的命令
IPC_RMID - 删除指定的消息队列,第三个参数给NULL
第三个参数:结构体指针
函数功能:主要用于对指定的消息队列执行指定的操作