进程间通讯之消息队列

#include<stdio.h>

#include<sys/msg.h>

#define MAX_MSG_BUF_LEN    512

int iKey = 6004;

struct ipcmsgbuf

{

long mtype;

char mtext[MAX_MSG_BUF_LEN];

};

int main( void )

{

int qid;

char sTmp[128], sTmp2[128], sTmp3[128];

struct ipcmsgbuf msgdata;

memset( sTmp, 0, sizeof(sTmp) );

memset( sTmp2, 0, sizeof(sTmp2) );

memset( sTmp3, 0, sizeof(sTmp3) );

if( (qid = msgget(iKey, 0000)) < 0 )

{

printf("0000\n");

qid = msgget( iKey, IPC_CREAT|0660 );

if( qid < 0 )

{

printf( "msgget error!\n" );

return -1;

}

}

/* 写消息队列 */

memset( &msgdata, 0, sizeof( struct ipcmsgbuf ) );

msgdata.mtype = 1;

memcpy( msgdata.mtext, "abcdefg", 7 );

msgsnd( qid, &msgdata, 7, 0 );

/* 写消息队列 */

memset( &msgdata, 0, sizeof( struct ipcmsgbuf ) );

msgdata.mtype = 2;

memcpy( msgdata.mtext, "1234567", 7 );

msgsnd( qid, &msgdata, 7, 0 );

/* 读消息队列 */

memset( &msgdata, 0, sizeof( struct ipcmsgbuf ) );

msgrcv( qid, &msgdata, 7, 1, 0 );

memcpy( sTmp, msgdata.mtext, 7 );

printf( "sTmp=%s\n", sTmp );

/* 读消息队列 */

memset( &msgdata, 0, sizeof( struct ipcmsgbuf ) );

msgrcv( qid, &msgdata, 7, 2, 0 );

memcpy( sTmp2, msgdata.mtext, 7 );

printf( "sTmp2=%s\n", sTmp2 );

/* 读消息队列 */

memset( &msgdata, 0, sizeof( struct ipcmsgbuf ) );

msgrcv( qid, &msgdata, 7, 2, IPC_NOWAIT );

memcpy( sTmp3, msgdata.mtext, 7 );

printf( "sTmp3=%s\n", sTmp3 );

/* 从系统中删除该消息队列以及仍在该队列上的所有数据 */

msgctl( qid, IPC_RMID, 0 );

return 0;

}

运行结果:

0000

sTmp=abcdefg

sTmp2=1234567

sTmp3=

进程间通讯之消息队列

时间: 2024-08-29 18:37:47

进程间通讯之消息队列的相关文章

linux_c 开发(5-5)进程间通讯_消息队列

进程间通讯_消息队列 定义: UNIX早起通信机制之一的信号能够传送的信息量有限,管道则只能传送无格式的字节流,这无疑会给应用程序开发带来不便.消息队列(也称报文队列)则克服了这些缺点. 发展: 消息队列就是一个消息的链表.可以把消息看做一个记录,**具有特定的格式.进程可以向中按照一定的规则添加新消息:另一些进程则可以从消息队列中读取消息. 分类: 目前主要有两种类型的消息队列:POSIX消息队列 以及系统V消息队列,系统V消息队列目前被大量使用. 持续性:系统V消息队列是随内核持续的,只有在

进程组间通讯(消息队列)

1.所有进程共用一个消息队列组. 2.消息队列组里面包含一个发送消息队列和一个接收消息队列. 3.请求进程主动向发送消息队列发送消息,从接收消息队列接收消息.处理进程从发送消息队列读取请求,向接收队列发送处理结果. 4.同一进程组都是相同的进程. 5.处理进程组内的所有进程以竞争的方式从消息队列内读取请求. 5.要实现的功能是向进程组发送消息,得到处理结果.从发送请求的进程的角度来说,只需要知道发送给哪个进程组即可.从接收进程的角度来说,需要知道请求是从哪一个进程发来的才能准确地把请求结果返回.

.Net 利用消息在进程间通讯实现进程互操作

有时候我们会遇到需要在两个进程间通过某种方式实现互操作,方法有很多,例如你可以尝试让两个进程持续监视一个外部文件,由此文件记录各自进程的数据:还有可以使用网络端口实现进程间通讯.共享一片内存区域记录及传递各自进程的数据等:此处讲述在.net 下如何利用消息的传递及处理实现两个进程的通讯. 是的,这里所说的消息指的就是Windows的消息机制,对于 I T 菜鸟,可以这样简单理解Windows 消息机制:Windows系统可以同时运行很多很多应用程序,Windows系统要让某一个程序做一件事情,就

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程

Android进阶笔记04:Android进程间通讯之Messenger ( 区别于AIDL)

一. Android进程间通讯之Messenger 的引入 (1)引言:      平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消息的进程间通信,就像子线程和UI线程发送消息那样,是不是很简单,还不用去写AIDL文件,是不是有点小爽.哈哈.此外,还支持记录客户端对象的Messenger,然后可以实现一对多的通信:甚至作为一个转接处,任意两个进程都能通过服务端进行通信. (2) Messenger 与 AIDL 比较:    

UNIX 进程间通讯(IPC)概念(Posix,System V IPC)

 IPC(Inter-Process Communication,进程间通讯)可以有三种信息共享方式(随文件系统,随内核,随共享内存).(当然这里虽然说是进程间通讯,其实也是可以和线程相通的). 相对的IPC的持续性(Persistence of IPC Object)也有三种: 随进程持续的(Process-Persistent IPC) IPC对象一直存在,直到最后拥有他的进程被关闭为止,典型的IPC有pipes(管道)和FIFOs(先进先出对象) 随内核持续的(Kernel-persist

Android进程间通讯之messenger

这两天在看binder,无意间在文档看到messenger这么个东西,感觉这个东西还挺有意思的,给大家分享一下. 平时一说进程间通讯,大家都会想到AIDL,其实messenger和AIDL作用一样,都可以进行进程间通讯.它是基于消息的进程间通信,就像子线程和UI线程发送消息那样,是不是很简单,还不用去写AIDL文件,是不是有点小爽.哈哈. 此外,还支持记录客户端对象的Messenger,然后可以实现一对多的通信:甚至作为一个转接处,任意两个进程都能通过服务端进行通信. 与 AIDL 比较: 当您

进程间通讯。

进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法. 进程是计算机系统分配资源的最小单位(严格说来是线程).每个进程都有自己的一部分独立的系统资源,彼此是隔离的. 为了能使不同的进程互相访问资源并进行协调工作,才有了进程间通信. 举一个典型的例子,使用进程间通信的两个应用可以被分类为客户端和服务器(见主从式架构),客户端进程请求数据,服务端回复客户端的数据请求. 有一些应用本身既是服务器又是客户端,这在分布式计算中,

Linux 进程间通讯方式 pipe()函数 (转载)

转自:http://blog.csdn.net/ta893115871/article/details/7478779 Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6->套接字(sicket) 在这里我们看一下第一种====管道(pipe).有名管道(fifo)见其它文章. eg :我们以前学的命令 cat  file | grep  "abc