Linux IPC机制:消息队列示例

程序msg1.c用于接收消息

<span style="font-size:12px;">#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

#include <sys/msg.h>

struct my_msg_st {
    long int my_msg_type;
    char some_text[BUFSIZ];
};

int main()
{
    int running = 1;
    int msgid;
    struct my_msg_st some_data;
    long int msg_to_receive = 0;

    //建立消息队列
    msgid = msgget( (key_t)1234, 0666 | IPC_CREAT );

    if( -1 == msgid ) {
        fprintf( stderr, "msgget failed with error:%d\n", errno );
        exit( EXIT_FAILURE );
    }

    //从消息队列中获取消息 直到遇见end为止
    while( running ) {
        memset( some_data.some_text, '\0', BUFSIZ );
        if( -1 == msgrcv( msgid, (void *)&some_data, BUFSIZ, msg_to_receive, 0 ) ) {
            fprintf( stderr, "magrcv failed with error %d\n", errno );
            exit( EXIT_FAILURE );
        }

        printf("You wrote: %s", some_data.some_text );
        some_data.some_text[strlen(some_data.some_text)-1] = '\0'; //去掉换行符 以准确找到 结束标志字符串 end
        if( 0 == strcmp( some_data.some_text, "end" ) )
            running = 0;
    }

    //删除消息队列
    if( -1 == msgctl( msgid, IPC_RMID, 0 ) ) {
            fprintf( stderr, "msgctl(IPC_RMID) failed\n");
            exit( EXIT_FAILURE );
    }

    exit( EXIT_SUCCESS );
}</span>

程序 msg2.c 用于发送消息:

<span style="font-size:12px;">#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#include <sys/msg.h>
#define MAX_TEXT 512

struct my_msg_st {
    long int my_msg_type;
    char some_text[MAX_TEXT];
};

int main()
{
    int running = 1;
    struct my_msg_st some_data;
    int msgid;
    char buffer[BUFSIZ];

    msgid = msgget( (key_t)1234, 0666 | IPC_CREAT );

    if( -1 == msgid ) {
        fprintf( stderr, "msgget failed with error %d\n", errno );
        exit( EXIT_FAILURE );
    }

    //发送消息
    while( running ) {
        memset( buffer, '\0', BUFSIZ );
        printf("Enter some text: ");
        fgets( buffer, BUFSIZ, stdin );
        some_data.my_msg_type = 1;
        strcpy( some_data.some_text, buffer );

        if( -1 == msgsnd( msgid, (void *)&some_data, MAX_TEXT, 0 ) ) {
            fprintf( stderr, "msgsnd failed with error %d\n", errno );
            exit( EXIT_FAILURE );
        }
        buffer[strlen(buffer)-1] = '\0';
        if( 0 == strcmp( buffer, "end" ) )
            running = 0;
    }
    exit( EXIT_SUCCESS);
}</span>

输出结果:

[[email protected] document]$ ./msg2

Enter some text: hey man

Enter some text: how are you

Enter some text: endsss

Enter some text: end

[[email protected] document]$ ./msg1

You wrote: hey man

You wrote: how are you

You wrote: endsss

You wrote: end

与命名管道相比,消息队列的优势在于,它独立于发送和接收进程而存在,这消除了同步命名管道的打开和关闭时可能产生的一些困难。

时间: 2024-10-13 23:32:08

Linux IPC机制:消息队列示例的相关文章

Linux 进程间通信(一)(经典IPC:消息队列、信号量、共享存储)

有3种称作XSI IPC的IPC:消息队列.信号量.共享存储.这种类型的IPC有如下共同的特性. 每个内核中的IPC都用一个非负整数标志.标识符是IPC对象的内部名称,为了使多个合作进程能够在同一IPC对象上汇聚,需要提供一个外部命名方案.因此,将每个IPC对象都与一个键相关联,将这个键(key)作为该对象的外部名.这个键的数据类型是key_t,通常在头文件<sys/types.h>中被定义为长整型,该键由内核变换成标识符. 有3种方式可以使客户进程和服务器进程在同一IPC结构上汇聚: (1)

linux进程间通信之消息队列

我们已经知道进程通信的方式是有多种的,在上一篇博客中讲述了通过管道实现简单的进程间通信,那么接下来我们看看与之类似的另一种方式,通过消息队列来实现进程间通信. 什么是消息队列 消息队列提供了一种由一个进程向另一个进程发送块数据的方法.另外,每一个数据块被看作有一个类型,而接收进程可以独立接收具有不同类型的数据块.消息队列的好处在于我们几乎可以完全避免同步问题,并且可以通过发送消息屏蔽有名管道的问题.更好的是,我们可以使用某些紧急方式发送消息.坏处在于,与管道类似,在每一个数据块上有一个最大尺寸限

[转]Linux进程间通信——使用消息队列

点击此处阅读原文 另收藏ljianhui的专栏初学Linux 下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的

Linux进程间通信——使用消息队列

下面来说说如何用不用消息队列来进行进程间的通信,消息队列与命名管道有很多相似之处.有关命名管道的更多内容可以参阅我的另一篇文章:Linux进程间通信--使用命名管道 一.什么是消息队列 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法.  每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构.我们可以通过发送消息来避免命名管道的同步和阻塞问题.但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制. Linux用宏MSGMAX和MSGMNB来限制一条消息

System V IPC(1)-消息队列

一.概述                                                    System V三种IPC:消息队列,信号量,共享内存.这三种IPC最先出现在AT&T System v UNIX上面,并遵循XSI标准,有时候也被称为XSI IPC. 本文先探讨消息队列: 1.消息队列允许进程以消息的形式交换数据.读写都是针对整条消息,不能读写消息的一部分,不像管道那样可以以流的形式读写任意字节. 2.消息队列除了包含数据外,还有一个整数来表示该消息的类型.读取消息

Linux进程间通信(二) - 消息队列

消息队列 消息队列是Linux IPC中很常用的一种通信方式,它通常用来在不同进程间发送特定格式的消息数据. 消息队列和之前讨论过的管道和FIFO有很大的区别,主要有以下两点(管道请查阅我的另一篇文章:http://www.cnblogs.com/linuxbug/p/4863724.html): Ø  一个进程向消息队列写入消息之前,并不需要某个进程在该队列上等待该消息的到达,而管道和FIFO是相反的,进程向其中写消息时,管道和FIFO必须已经打开来读,否则写进程就会阻塞(默认情况下). Ø 

练习--LINUX进程间通信之消息队列MSG

https://www.ibm.com/developerworks/cn/linux/l-ipc/part3/ 继续坚持,或许不能深刻理解,但至少要保证有印象. ~~~~~~~~~~~~~~ 消息队列(也叫做报文队列)能够克服早期unix通信机制的一些缺点.作为早期unix通信机制之一的信号能够传送的信息量有限,后来虽然POSIX 1003.1b在信号的实时性方面作了拓广,使得信号在传递信息量方面有了相当程度的改进,但是信号这种通信方式更像"即时"的通信方式,它要求接受信号的进程在某

Linux下获取消息队列的信息

在程序中想要获取消息队列长度可使用消息队列的属性这个数据结构: 需要#include <sys/msg.h> /* one msqid structure for each queue on the system */ struct msqid_ds {     struct ipc_perm msg_perm;     struct msg *msg_first;  /* first message on queue */     struct msg *msg_last;   /* las

System V IPC 之消息队列

消息队列和共享内存.信号量一样,同属 System V IPC 通信机制.消息队列是一系列连续排列的消息,保存在内核中,通过消息队列的引用标识符来访问.使用消息队列的好处是对每个消息指定了特定消息类型,接收消息的进程可以请求接收下一条消息,也可以请求接收下一条特定类型的消息. 相关数据结构 与其他两个 System V IPC 通信机制一样,消息队列也有一个与之对应的结构,该结构的定义如下: struct msqid_ds { struct ipc_perm msq_perm; struct m