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语言高级编程之使用消息队列实现进程间通信!重点内容!!!的主要内容,如果未能解决你的问题,请参考以下文章

PHP高级编程之消息队列

Linux进程间通信--进程,信号,管道,消息队列,信号量,共享内存

Linux编程之自定义消息队列

Linux编程之自定义消息队列

LInux进程间通信之消息队列编程实例

请教一个Linux下C语言的进程间的信号问题