进程通信之消息队列

消息队列就是一些消息的列表。用户可以在消息队列中添加消息和读取消息等。消息存在于内核中,有“队列ID”来标识

msgget函数语法:

msgsnd函数语法:

msgrcv函数语法:

msgctl函数语法:

添加消息代码:

/* msgsnd.c 添加消息*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define  BUFFER_SIZE        512

struct message
{
    long msg_type;
    char msg_text[BUFFER_SIZE];
};
int main()
{
    int qid;
    key_t key;
    struct message msg;

    /*根据不同的路径和关键字产生标准的key*/
    if ((key = ftok(".", ‘a‘)) == -1)
    {
        perror("ftok");
        exit(1);
    }
    /*创建消息队列*/
    if ((qid = msgget(key, IPC_CREAT|0666)) == -1)
    {
        perror("msgget");
        exit(1);
    }
    printf("Open queue %d\n",qid);
    while(1)
    {
        printf("Enter some message to the queue:");
        if ((fgets(msg.msg_text, BUFFER_SIZE, stdin)) == NULL)
        {
            puts("no message");
            exit(1);
        }

        msg.msg_type = getpid();
        /*添加消息到消息队列*/
        if ((msgsnd(qid, &msg, strlen(msg.msg_text), 0)) < 0)
        {
            perror("message posted");
            exit(1);
        }
        if (strncmp(msg.msg_text, "quit", 4) == 0)
        {
            break;
        }
    }
    exit(0);
}

读取消息的程序代码:

/* msgrcv.c 读取消息*/
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#define  BUFFER_SIZE        512

struct message
{
    long msg_type;
    char msg_text[BUFFER_SIZE];
};
int main()
{
    int qid;
    key_t key;
    struct message msg;

    /*根据不同的路径和关键字产生标准的key*/
    if ((key = ftok(".", ‘a‘)) == -1)
    {
        perror("ftok");
        exit(1);
    }
    /*创建消息队列*/
    if ((qid = msgget(key, IPC_CREAT|0666)) == -1)
    {
        perror("msgget");
        exit(1);
    }
    printf("Open queue %d\n", qid);
    do
    {
        /*读取消息队列*/
        memset(msg.msg_text, 0, BUFFER_SIZE);
        if (msgrcv(qid, (void*)&msg, BUFFER_SIZE, 0, 0) < 0)
        {
            perror("msgrcv");
            exit(1);
        }
        printf("The message from process %d : %s",
msg.msg_type, msg.msg_text);        

    } while(strncmp(msg.msg_text, "quit", 4));
/*从系统内核中移走消息队列 */
    if ((msgctl(qid, IPC_RMID, NULL)) < 0)
    {
        perror("msgctl");
        exit(1);
    }
    return 0;
}
时间: 2024-11-02 12:52:48

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

Linux程序设计学习笔记----System V进程通信之消息队列

一个或多个进程可向消息队列写入消息,而一个或多个进程可从消息队列中读取消息,这种进程间通讯机制通常使用在客户/服务器模型中,客户向服务器发送请求消息,服务器读取消息并执行相应请求.在许多微内核结构的操作系统中,内核和各组件之间的基本通讯方式就是消息队列.例如,在 MINIX 操作系统中,内核.I/O 任务.服务器进程和用户进程之间就是通过消息队列实现通讯的. Linux中的消息可以被描述成在内核地址空间的一个内部链表,每一个消息队列由一个IPC的标识号唯一的标识.Linux 为系统中所有的消息队

Linux:进程通信之消息队列Message实例

/*send.c*/ /*send.c*/ #include <stdio.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <errno.h> #define MSGKEY 1024 struct msgstru { long msgtype; char msgtext[2048]; }; main() { struct msgstru ms

进程通信(消息队列)

消息队列与管道不同的是,消息队列是基于消息的, 而管道是基于字节流的,且消息队列的读取不一定是先入先出.消息队列与命名管道有一 样的不足,就是每个消息的最大长度是有上限的(MSGMAX),每个消息队列的总的字节 数是有上限的(MSGMNB),系统上消息队列的总数也有一个上限(MSGMNI). IPC对象数据结构 内核为每个IPC对象维护一个数据结构(/usr/include/linux/ipc.h) struct ipc_perm { key_t __key; /* Key supplied t

【进程编程】——msg进程间的消息队列通信

           [进程编程]--msg进程间的消息队列通信 消息队列就像一个链表,先进先出,就像排队打饭,先到先买!键值 用来获取消息队列的描述字,我感觉就像是一个定位标识符! 函数一     key_t ftok(char *pathname,char proj)返回的是一个键值------>创建队列之前一定要获取这个键值!proj:项目名,不为零即可 打开.创建函数二     int msgget(key_t key,int msgflg) //看见没,这里是要求键值的. key:键值

msgrcv,msgsnd进程通信,消息的发送和接收

//进程通信,消息的发送和接收 //client.c #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <err

linux进程间的通信(C): 消息队列

一.消息队列(message queue) 消息队列也是System V IPC机制之一. 消息队列与命名管道类似, 但少了打开和关闭管道方面的复杂性. 但使用消息队列并未解决我们在使用命名管道时遇到的一些问题, 如管道满时的阻塞问题. 消息队列提供了一种在两个不相关进程间传递数据的简单有效的方法. 与命名管道相比, 消息队列的优势在于,它独立于发送和接收进程而存在, 这消除了在同步命名管道的打开和关闭时可能产生的一些困难. 消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法. 而且,

IPC通信之消息队列、信号量和共享内存

有三种IPC我们称作XSI IPC,即消息队列,信号量以及共享存储器.XSI IPC源自System V的IPC功能.由于XSI IPC不使用文件系统的命名空间,而是构造了它们自己的名字空间,为此常常受到批评. 相似之处:每个内核中的IPC结构都用一个非负整数的标识符加以引用.例如对一个消息队列发送或取消息,只需要知道其队列标识符.与文件标识符不同,IPC标识符不是小的整数,当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整形数的最大正值,然后又回转到0. 标

进程通信之消息通信

消息通信 message 消息是进程间通信的一种重要方式,通常由客户端和服务器端组成.服务器以特定的键值创建一个消息队列,根据约定的消息格式填充要发送的消息和数据类型,把他插入消息队列.而在客户端,根据已知的键值和指定地点类型编码,接收对应的数据.和共享内存的方式相比,不用自己维护消息队列,可以集中精力关注数据传输,但不足的是,对于需要共享或者传输比较复杂数据结构的应用,它就显得不太灵活. 消息通信重要的函数组包括: int msgget(key_t key, int msgflg); The

IPC通信_消息队列

(共享内存,信号量,消息队列等方式时,有System v以及POXIS两种接口类型,这里介绍常用的systemV接口) 内核中的IPC结构(共享内存,信号量,消息队列)都用一个非法整数的标识符(identifier)加以引用.这里的标识符(identifier)是IPC对象的内部名. 为了使多个合作进程能够在同一IPC对象上汇聚,提供一个该IPC对象的外部名键(key),每一个IPC对象都与一个键(key)相关联. 消息队列是消息的链接表,存储在内核中,有消息队列标识符标识.下面描述几个涉及到的