systemV消息队列

Posted lsaejn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了systemV消息队列相关的知识,希望对你有一定的参考价值。

参考命令:

1.  ipcs

2.  ipckill

例子参考了网络,作者不详。

发送数据

#include <stdlib.h>

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/msg.h>
#include <errno.h>
 
#define MAX_TEXT 512
 
struct msg_st
{
    long int msg_type;
    char text[MAX_TEXT];
};
 
int main(int argc, char **argv)
{
    struct msg_st data;
    char buffer[BUFSIZ];
    int msgid = -1;
 
    // 建立消息队列
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
    if (msgid == -1)
    {
        fprintf(stderr, "msgget failed error: %d
", errno);
        exit(EXIT_FAILURE);
    }
 
    // 向消息队里中写消息,直到写入end
    while (1)
    {
        printf("Enter some text: 
");
        fgets(buffer, BUFSIZ, stdin);
        data.msg_type = 1; // 注意2
        strcpy(data.text, buffer);
 
        // 向队列里发送数据
        if (msgsnd(msgid, (void *)&data, MAX_TEXT, 0) == -1)
        {
            fprintf(stderr, "msgsnd failed
");
            exit(EXIT_FAILURE);
        }
 
        // 输入end结束输入
        if (strncmp(buffer, "end", 3) == 0)
        {
            break;
        }
 
        sleep(1);
    }
 
    exit(EXIT_SUCCESS);
}

接受进程

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/msg.h>
#include <errno.h>
 
struct msg_st
{
    long int msg_type;
    char text[BUFSIZ];
};
 
int main(int argc, char **argv)
{
    int msgid = -1;
    struct msg_st data;
    long int msgtype = 0;   // 注意1
 
    // 建立消息队列
    msgid = msgget((key_t)1234, 0666 | IPC_CREAT);
    if (msgid == -1)
    {
        fprintf(stderr, "msgget failed width error: %d
", errno);
        exit(EXIT_FAILURE);
    }
 
    // 从队列中获取消息,直到遇到end消息为止
    while (1)
    {
        if (msgrcv(msgid, (void *)&data, BUFSIZ, msgtype, 0) == -1)
        {
            fprintf(stderr, "msgrcv failed width erro: %d", errno);
        }
 
        printf("You wrote: %s
", data.text);
 
        // 遇到end结束
        if (strncmp(data.text, "end", 3) == 0)
        {
            break;
        }
    }
 
    // 删除消息队列
    if (msgctl(msgid, IPC_RMID, 0) == -1)
    {
        fprintf(stderr, "msgctl(IPC_RMID) failed
");
    }
 
    exit(EXIT_SUCCESS);
}

以发送一个文件为例,数据流:

输入文件->用户发送程序->内核IPC(管道,FIFO,消息队列)->接收端->输出文件

一共4次系统调用。相比共享内存要多2次。

 

以上是关于systemV消息队列的主要内容,如果未能解决你的问题,请参考以下文章

linux进程间通信之Posix消息队列

Posix消息队列

linux里的ipc是啥意思

Linux-进程间通信

Linux-进程间通信

Linux-进程间通信