导航:首页 > 操作系统 > linux进程消息队列

linux进程消息队列

发布时间:2022-06-12 09:26:02

linux编程的利用消息队列在两个进程间通信,怎么写代码,求思路,需要建立几个消息队列呢

首先建议你先参考 《advanced programming in the unix environment》 一书中的第15章(Interprocess communication 进程间通信)中的第7节(message queues 消息队列)了解消息队列的相关接口函数,比如如何创建获取消息队列,如何收发消息。然后就很简单了

如果你打算两个进程依次收消息,发消息,就像打乒乓球一样,那么只要一个queue,A 发消息, B 收消息并处理,然后 B 发消息, A 收并处理………… 按此次序进行下去。

更灵活的方法是两个消息队列 (a, b), A 进程从 队列a收消息,向 b 发消息。 B进程从b收消息,想a发消息。

㈡ 简述Linux进程间通信的几种方式

进程间通讯进程间通信就是不同进程之间传播或交换信息,进程的用户空间是互相独立的,进程之间可以利用系统空间交换信息。
管道(pipe)管道是一种半双工的通信方式,数据只能单向流动。如果要进行双工通信,需要建立两个管道。
管道只能在具有亲缘关系的进程间使用,例如父子进程或兄弟进程。
有名管道(named
pipe)
有名管道也是双半工的通信方式,但它允许无亲缘关系的进程间使用。
信号量(semophore)
信号量常用来作为一种锁机制来使用,它是一个记数器,用来控制多进程对共享资源的访问,防止多个进程同时访问一个共享资源。信号量主要用作为进程间或同一进程间不同线程之间的同步手段。
信号(sinal)
信号是一种比较复杂的通信方式,用于通知接收进程某些事件已经发生,要注意信号处理中调用的函数是否为信号安全。
消息队列(message
queue)
消息队列是由消息的链表组成,存放在内核中并由消息队列标识符标识。
共享内存(shared
memory)
共享内存就是映射一段被其他进程所访问的内存,这段共享内存由一个进程创建,可由多个进程访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式的低运行效率而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
套接字(socket)
套接字也是进程间通信的一种方式,与其他方式不同的是,它可以用在不同主机间的进程通信(也是它的主要用途)。
几种方式的缺点
管道:
速度慢,容量有限,只能用于亲缘关系进程间通信。
有名管道:
同管道,不过允许无亲缘关系进程间通信。
消息队列:
容量受系统限制,队列中会遗留数据,读时要考虑到这些未读完的数据。
信号量:
主要用于同步,无法传递复杂的数据信息。

㈢ 请教一个关于linux进程通信消息队列mq

在Linux中使用消息队列
Linux提供了一系列消息队列的函数接口来让我们方便地使用它来实现进程间的通信。它的用法与其他两个System V PIC机制,即信号量和共享内存相似。

1、msgget函数
该函数用来创建和访问一个消息队列。它的原型为:
int msgget(key_t, key, int msgflg);
与其他的IPC机制一样,程序必须提供一个键来命名某个特定的消息队列。msgflg是一个权限标志,表示消息队列的访问权限,它与文件的访问权限一样。msgflg可以与IPC_CREAT做或操作,表示当key所命名的消息队列不存在时创建一个消息队列,如果key所命名的消息队列存在时,IPC_CREAT标志会被忽略,而只返回一个标识符。

它返回一个以key命名的消息队列的标识符(非零整数),失败时返回-1.

msgsnd函数
该函数用来把消息添加到消息队列中。它的原型为:
int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg);
msgid是由msgget函数返回的消息队列标识符。

msg_ptr是一个指向准备发送消息的指针,但是消息的数据结构却有一定的要求,指针msg_ptr所指向的消息结构一定要是以一个长整型成员变量开始的结构体,接收函数将用这个成员来确定消息的类型。所以消息结构要定义成这样:

struct my_message{
long int message_type;
/* The data you wish to transfer*/
};
msg_sz是msg_ptr指向的消息的长度,注意是消息的长度,而不是整个结构体的长度,也就是说msg_sz是不包括长整型消息类型成员变量的长度。

msgflg用于控制当前消息队列满或队列消息到达系统范围的限制时将要发生的事情。

如果调用成功,消息数据的一分副本将被放到消息队列中,并返回0,失败时返回-1.

㈣ Linux下编程消息队列怎么封装较好,怎么保证2个进程能用同一个消息队列

消息队列就是用来进程间通信的, 每个进程只要知道消息队列的queueID即可

#ifndef CMSGOP_H
#define CMSGOP_H
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
class CMsgOp
{
public:
CMsgOp();
virtual ~CMsgOp();
typedef struct _customMessageFormat{
int processID;
int cmd;
int commandArg;
}CCustomMessageFormat;

int init();
int send(const CCustomMessageFormat &message);
int receive(CCustomMessageFormat &message);
private:
int msgQueueID;
struct msgbuf sendBuf;
struct msgbuf recvBuf;

};

#endif // CMSGOP_H

#include "cmsgop.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
CMsgOp::CMsgOp()
{
}

CMsgOp::~CMsgOp()
{
msgctl(msgQueueID, IPC_RMID, NULL);
}

int CMsgOp::init()
{
key_t key = ftok("/home/maemo/tmp2", 1);
if(-1 == key)
{
perror("ftok failed!");
return -1;
}

int ret = msgget(key, IPC_CREAT);
if(-1 == ret)
{
perror("create message queue failed!");
return -1;
}

msgQueueID = ret;
return 0;
}

int CMsgOp::send(const CCustomMessageFormat &message)
{
memcpy(sendBuf.mtext, &message, sizeof(CCustomMessageFormat));
sendBuf.mtype = 1;
int ret = msgsnd(msgQueueID, &sendBuf, sizeof(CCustomMessageFormat), 0);
if(-1 == ret)
{
perror("message send failed!");
return ret;
}
}

int CMsgOp::receive(CCustomMessageFormat &message)
{
int ret = msgrcv(msgQueueID, &recvBuf, sizeof(CCustomMessageFormat), 0, IPC_NOWAIT);
if(-1 == ret)
{
perror("receive message failed!");
return -1;
}

memcpy(&message, recvBuf.mtext, sizeof(CCustomMessageFormat));
return ret;
}

㈤ 请教一个关于linux消息队列的问题

一般使用步骤:

1. 用ftok产生一个key。

2. 调用msgget(使用key作为参数)产生一个队列

3. 进程可以用msgsnd发送消息到这个队列,相应的别的进程用msgrcv读取。

这里需要注意msgsnd可能会失败的两个情况:

a) 可能被中断打断(包括msgsnd和msgrcv). 尤其是大流量应用中更容易出现. 比较安全的用法是判断操作是否被中断打断,如果被打断, 则需要继续尝试。

b) 消息队列满。产生这个错误,则需要考虑提高系统消息队列规格,或者查看消息接收处是否有问题

4. msgctl函数可以用来删除消息队列
消息队列产生之后,除非明确的删除(可以用),产生的队列会一直保留在系统中。linux下消息队列的个数是有限的,注意不要泄露。如果 使用已经达到上限,msgget调用会失败,产生的错误码对应的提示信息为no space left on device.

注意点:

1.消息的类型 mtype 不需为非0值。如果使用0,则msgsnd会失败,并得到”Invalid argument“错误。

2.msgflg为0表示阻塞等待,如果msgflg为IPC_NOWAIT表示非阻塞。

3.最好使用root权限执行消息队列,否则msgrcv 提示 "Permission denied"。

㈥ linux进程间通信(消息队列)

在与此进程P1通信的进程P2中,同样的以ftok创建KEY, msgget在该KEY上创建消息队列,
只需要保证,ftok的参数中,第一个参数,即文件,是同一个文件即可。当P2中的文件与P1不同时,msgget函数将会返回错误。
可以说,消息队列也是通过文件实现的,就像创建一个socket,要使用它时,也已经为其绑定了一个文件fd。
有一个例子不错,你可以看看。实验时,需要把ftok的第一个参数,即文件,设置为一个你当前目录存在的文件。你可以touch一个临时文件来实验。
http://blog.csdn.net/lcrystal623/archive/2007/03/16/1531183.aspx
同时,谢谢link的博主。

㈦ linux 消息队列编程

两个进程用相同的key,就能共享了。 之后就能通讯了。例如下面用1234做key

//接收方
msgid=msgget((key_t)1234,0666|IPC_CREAT);
if(msgrcv(msgid,(void*)&data,BUFSIZ,msgtype,0)==-1)
{
fprintf(stderr,"msgrcvfailedwitherrno:%d ",errno);
exit(EXIT_FAILURE);
}


//发送方
msgid=msgget((key_t)1234,0666|IPC_CREAT);
if(msgsnd(msgid,(void*)&data,MAX_TEXT,0)==-1)
{
fprintf(stderr,"msgsndfailed ");
exit(EXIT_FAILURE);
}

㈧ Linux进程间通信的方式有哪些

第一种:管道通信
两个进程利用管道进行通信时,发送信息的进程称为写进程;接收信息的进程称为读进程。管道通信方式的中间介质就是文件,通常称这种文件为管道文件,它就像管道一样将一个写进程和一个读进程连接在一起,实现两个进程之间的通信。写进程通过写入端往管道文件中写入信息;读进程通过读出端从管道文件中读取信息。两个进程协调不断地进行写和读,便会构成双方通过管道传递信息的流水线。
第二种:消息缓冲通信
多个独立的进程之间可以通过消息缓冲机制来相互通信。这种通信的实现是以消息缓冲区为中间介质,通信双方的发送和接收操作均以消息为单位。在存储器中,消息缓冲区被组织成队列,通常称之为消息队列。消息队列一旦创建后即可由多进程共享,发送消息的进程可以在任意时刻发送任意个消息到指定的消息队列上,并检查是否有接收进程在等待它所发送的消息。若有则唤醒它,而接收消息的进程可以在需要消息的时候到指定的消息队列上获取消息,如果消息还没有到来,则转入睡眠等待状态。
第三种:共享内存通信
针对消息缓冲需要占用CPU进行消息复制的缺点,OS提供了一种进程间直接进行数据交换的通信方式。共享内存,顾名思义这种通信方式允许多个进程在外部通信协议或同步,互斥机制的支持下使用同一个内存段进行通信,它是一种最有效的数据通信方式,其特点是没有中间环节,直接将共享的内存页面通过附接映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面。

㈨ linux系统编程中的消息队列该怎么使用呀

消息队列用于进程间通信,每个进程可以,只要该消息queueID队列

的#ifndef CMSGOP_H

#定义CMSGOP_H

#包括类型。 H>

#包括ipc.h>

#包括msg.h>中

类CMsgOp

{

公众:

CMsgOp ();

虚拟CMsgOp();

typedef结构_customMessageFormat {

整数PROCESSID;

整数CMD;

整数commandArg;

} CCustomMessageFormat; BR p>诠释的init();

整数发送(常量CCustomMessageFormat&消息);

整数接收(CCustomMessageFormat&消息);

私人:

整数msgQueueID;

结构msgbuf sendBuf;

结构msgbuf recvBuf;

};

#ENDIF / / CMSGOP_H

的#include“ cmsgop.h“

#包括中

#包括中

#包括中

CMsgOp :: CMsgOp()
> {

}

CMsgOp ::CMsgOp()

{

了msgctl(msgQueueID,IPC_RMID,NULL);

}

BR />整型CMsgOp :: init()中

的key_t的key = ftok的(“/ home/maemo/tmp2”,1);

如果(-1 ==键) {

PERROR(“ftok的失败!”);

返回-1;

}

整数RET = msgget(键,IPC_CREAT);
>如果(-1 == RET)

{

PERROR(“创建消息队列失败!”);

返回-1;

}

msgQueueID = RET;

返回0;

}

整数CMsgOp ::发送(常量CCustomMessageFormat&消息)

{的memcpy(sendBuf.mtext,及讯息,大小(CCustomMessageFormat));

sendBuf.mtype = 1;

整数RET =的msgsnd(msgQueueID,&sendBuf,大小(CCustomMessageFormat),0);

如果(-1 = = RET)

{

PERROR(“消息发送失败!”);

返回RET;

}

}

整数CMsgOp: :接收(CCustomMessageFormat&消息)

{

整数RET =的msgrcv(msgQueueID,与recvBuf,大小(CCustomMessageFormat),0,IPC_NOWAIT);

如果( - 1 == RET) {

PERROR(“接收消息失败!”);

返回-1;

}

的memcpy(&消息,recvBuf.mtext,大小(CCustomMessageFormat ));

返回RET;
}

阅读全文

与linux进程消息队列相关的资料

热点内容
剪应力计算法 浏览:819
如何自己搭建url跳转服务器 浏览:983
广数980tb3用g83钻孔怎么编程 浏览:576
程序员上海与北京 浏览:405
安卓手机的动态照片为什么卡 浏览:538
ad编译集成库时最常见的问题 浏览:846
matlab微分方程编程 浏览:700
安卓手机如何打开esp文件 浏览:545
什么app能安装应用 浏览:199
手机用什么app看电视剧电影好 浏览:603
导入原理图为什么文件夹不显示 浏览:656
androidapp风格 浏览:211
php取服务器url地址 浏览:293
linux时间调度算法 浏览:771
单片机最小电路详解 浏览:185
请求要求命令 浏览:806
电脑文件夹发微信显示被占用 浏览:295
手机怎么看加密视频 浏览:207
怎样解压手机es文件包 浏览:661
2017年学什么编程 浏览:935