消息队列应用

Posted 吾乃世间奇才

tags:

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

client.c

#include <sys/msg.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <sys/errno.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>

struct mymsgbuf
        long mtype;
        float num_data[10];
;
int main(int argc, char *argv[])
        struct mymsgbuf buf;
        int msgid;
        int i;
        if((msgid = msgget(0x1234, 0666|IPC_CREAT)) < 0)
        
            fprintf(stderr, "open msg %x failed.\\n", 0x1234);
            return 0;
        
        memset(&buf, 0, sizeof(buf));
        buf.mtype = atoi(argv[1]);
        srand(atoi(argv[1]) + time(NULL));
        for(i=0; i < 10; i++)
            buf.num_data[i] = 0+1.0*(rand()%RAND_MAX)/RAND_MAX *(1-0);

        msgsnd(msgid, &buf, sizeof(buf.num_data),0);
        usleep(400000);
        msgrcv(msgid, &buf, sizeof(buf.num_data), buf.mtype, 0);
        printf("average is %f\\n", buf.num_data[0]);
        return 0;

server.c
#include <sys/msg.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <stdio.h>
#include <signal.h>
#include <sys/errno.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#define MSG_NUM 4

extern int errno;
int msgid;
struct mymsgbuf
    long mtype;
    float num_data[10];
;

void close_fun(int signo)

        if(SIGINT == signo)
        
                msgctl(msgid,IPC_RMID,NULL);
                exit(0);
        


float col_num_avr(float *arr, int num)

    int i=0;
    float tmp = 0.0;
    for(i=0; i < num; i++) 
        printf("%f ", arr[i]);
        tmp += arr[i];
    
    printf("\\n");
    return tmp/num;

void *deal_num_data(void *arg)

    struct mymsgbuf *msg = (struct mymsgbuf *)arg;
    struct mymsgbuf buf;
    float avr = col_num_avr(msg->num_data, 10);
    buf.num_data[0] = avr;
    buf.mtype = msg->mtype;
    msgsnd(msgid, &buf, sizeof(buf.num_data),0);
    return NULL;


int main()

    struct mymsgbuf *buf[MSG_NUM];
    int i;
    signal(SIGINT, close_fun);
    for(i=0; i < MSG_NUM; i++)
        buf[i] = malloc(MSG_NUM * sizeof(struct mymsgbuf));
    int ret;
    pthread_t pid;
    if((msgid = msgget(0x1234, 0666|IPC_CREAT)) < 0)    
        fprintf(stderr, "open msg %X failed.\\n", 0x1234);
        return 0;
    
    for(i=0; i < MSG_NUM; i++) 
        buf[i]->mtype=i+1;
        msgrcv(msgid, buf[i], sizeof(buf[i]->num_data), buf[i]->mtype, 0);
        pthread_create(&pid, NULL, deal_num_data, buf[i]);
        usleep(100000);
    
    return 0;

两个程序,客户端生成随机10个float数,然后服务端接受,并返回给client平均值,
执行
./server
seq 1 4 | xargs -P 0 -n 1 ./client

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

消息队列MQ技术的介绍和原理

消息队列mq的原理及实现方法

消息队列MQ技术的介绍和原理

MQ消息队列应用场景比较介绍

消息队列技术

PHP消息队列实现及应用