[国嵌攻略][086][消息队列通讯]

消息队列

消息队列就是一个消息的链表。而一条消息则可以看作一个记录,具有特定的格式。进程可以向中按照一定的规则添加新消息;另一些进程则可以从消息队列中读走消息。

 

消息格式

每一条消息都有固定的格式。格式如下:

struct msgbuf {

long mtype;       /* message type, must be > 0 */

char mtext[1];    /* message data */

};

 

A.c

复制代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct msgbuf {
    long mtype;       /* message type, must be > 0 */
    char mtext[1024]; /* message data */
}MsgBuf;

void main(){
    //创建消息队列
    int key;
    int msqid;
    
    key = ftok("./", 0);
    msqid = msgget(key, IPC_CREAT);
    
    while(1){
        //获取消息类型
        long mtype;
        
        printf("Message Type:");
        scanf("%d", &mtype);
        
        //判断是否退出
        if(mtype == 0){
            break;
        }
        
        //获取消息数据
        char mtext[1024];
        
        printf("Message Text:");
        scanf("%s", mtext);
        
        //发送消息结构
        MsgBuf msgBuf;
        
        msgBuf.mtype = mtype;
        strcpy(msgBuf.mtext, mtext);
        
        msgsnd(msqid, &msgBuf, sizeof(MsgBuf), 0);
    }
    
    //删除消息队列
    msgctl(msqid, IPC_RMID, NULL);
}
复制代码

 

B.c

复制代码
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct msgbuf {
    long mtype;       /* message type, must be > 0 */
    char mtext[1024]; /* message data */
}MsgBuf;

void process(int msqid);

void main(){
    //打开消息队列
    int key;
    int msqid;
    
    key = ftok("./", 0);
    msqid = msgget(key, IPC_EXCL);
    
    //创建处理进程
    int i;
    
    for(i = 0; i < 3; i++){
        int pid;
        
        pid = fork();
        if(pid == 0){
            process(msqid);
        }
    }
}

void process(int msqid){
    while(1){
        //接收消息
        MsgBuf msgBuf;
        
        msgrcv(msqid, &msgBuf, sizeof(MsgBuf), 0, 0);
        
        //显示消息
        printf("Message Text:%s\n", msgBuf.mtext);
    }
}
复制代码

 

posted @   盛夏夜  阅读(308)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示