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

linux进程消息队列

发布时间:2023-04-13 15:41:30

linux系统的进程间通信有哪几种方式

一、方式

1、管道(Pipe)及有名管道( mkpipe):

管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

2、信号(Signal):

信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。

linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction。

实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数。

3、消息队列(Message):

消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

4、共享内存:

使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

5、信号量(semaphore):

主要作为进程间以及同一进程不同线程之间的同步手段。

6、套接口(Socket):

更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

二、概念

进程间通信概念:

IPC—-InterProcess Communication

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到所以进程之间要交换数据必须通过内核。

在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信。

(1)linux进程消息队列扩展阅读

1)无名管道:

管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。

管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,构成两进程间通信的一个媒介。

数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。

2)有名管道:

不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间)。

因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。



⑵ 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 消息队列长度处理

问题:

在Linux 系统中通过消息队列进行进程间的通讯时,只要定义的BufSize小于1024,队列就能正常读写,当Size定义大于1024时,队列就无法成功。

处理步骤:

SystemV的消息队列

/etc/sysctl.conf

修改

kernel.msgmni=1000

kernel.msgmax=81920

kernel.msgmnb=163840

msgmni为MSGMNI,即系统的消息队列数目。平台每个DTA需要使用3个消息队列,即最大DTA数为1000/3。该参数应该比平台最大队列个数参数配置大。

msgmax为MSGMAX,即一个消息的字节大小。目前扩展值为8k,平台一个交易消息为4个字节,不会超过限制。

msgmnb为MSGMNB,即队列存放消息的总字节数。

POSIX消息队列

修改

fs.mqueue.msg_max=1000  <-消息个数

fs. mqueue. msgsize_max=8192 <-消息长度

另外操作系统对文件大小的限制ulimit -q你可以看到POSIX消息队列的最大容量

cat /proc/sys/kernel/msgmax

cat /proc/sys/kernel/msgmni

cat /proc/sys/kernel/msgmnb

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

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

⑸ linux 消息队列进程通信问题,能发送消息,但接收时接收不到,停在那里等,请指导下

可定义一个大的char buff[2048] 大于sizeof(msg2)就行,试试

(msgrcv(iMsgid2, buff, iType, 100, 0) == -1

⑹ linux 进程间通信的几种方式

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

⑺ 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进程消息队列相关的资料

热点内容
创建桌面文件夹路径 浏览:900
华为手机app应用数据哪些删除 浏览:765
数据库有哪些表格 浏览:741
bada12微信java 浏览:16
小白编程什么最好学 浏览:205
qq回头看头像 浏览:338
苹果换屏要多长时间 浏览:283
如何用平板电脑学编程 浏览:424
格式工厂怎么转换swf文件 浏览:817
怎么做一个试用网站 浏览:953
哪里有信息不对称的app 浏览:59
win10的gpeditmsc文件 浏览:451
4399游戏盒20版本 浏览:349
有什么找工作比较靠谱的app吗 浏览:921
如何给网站挂黑链 浏览:282
360断网急救箱网络异常修复不了 浏览:889
身份证验证的js文件 浏览:994
什么人经常换微信名字 浏览:707
网站源码挖掘 浏览:944
荔枝fm和app哪个播放量好 浏览:535

友情链接