zoukankan      html  css  js  c++  java
  • linux进程通信:消息队列

    消息队列可以实现两个没有关系的进程之间的通信。

    创建了一个消息队列后,进程可以往里面放消息,也可以取消息。因为这个消息队列是有名字的,所以就算是两个没有关系的进程,也能通信。

    而且人性化的一点是,可以自己定义消息的结构体。

    几个重要的函数:

    //创建消息队列,如果存在就直接获取
    int msgget(key_t, key, int msgflg);
    //第一个参数是key整形,用于区分不同的队列
    //返回key命名的队列id,唯一标识一个队列
    
    
    
    //发送消息
    int msgsend(int msgid, const void *msg_ptr, size_t msg_sz, int msgflg); 
    //msgid是标识队列的id
    //msg_ptr是自己定义的消息结构体,注意结构体里面是长整型开始
    
    //所以要定义成这样
    struct my_message{  
        long int message_type;  
        /* The data you wish to transfer*/  
    }; 
    
    
    //获取消息
    int msgrcv(int msgid, void *msg_ptr, size_t msg_st, long int msgtype, int msgflg);  
    //参数跟上面一样

    效果图:

    Server的代码:(用于取消息)

    #include <unistd.h>  
    #include <stdlib.h>  
    #include <stdio.h>  
    #include <string.h>  
    #include <errno.h>  
    #include <sys/msg.h> 
    
    struct msg_st  
    {  
        long int msg_type;  
        char text[256];  
    };  
    
    
    int main(){
    
        int msgid = -1;  
    
          struct msg_st data;  
    
        long int msgtype = 0;
    
        msgid = msgget((key_t)1234,IPC_CREAT);
    
        if(msgid == -1){ 
    
            printf("msgget failed
    ");  
    
            exit(EXIT_FAILURE);  
    
            } 
    
        printf("Server start!
    ");
    
        while(1){
    
            
    
            if(msgrcv(msgid, (void*)&data, 256, msgtype, 0) == -1){
                        printf("msgrcv failed
    ");  
                        exit(EXIT_FAILURE);  
                }//end if
    
            
            //success
            printf("from client:%s
    ",data.text);
    
    
        }//end while
    
    
    
    
    
    
    
    
    }

    Client.c的代码:(用于发消息)

    #include <unistd.h>  
    #include <stdlib.h>  
    #include <stdio.h>  
    #include <string.h>  
    #include <errno.h>  
    #include <sys/msg.h>
    
    struct msg_st  
    
    {  
    
        long int msg_type;  
    
        char text[256];  
    
    };  
    
    
    int main(){
    
        struct msg_st data;
        int msgid = -1;
        char buffer[256];
    
        memset(buffer,'',256);
    
        msgid = msgget((key_t)1234,IPC_CREAT); 
    
        if(msgid == -1){
            printf("msgget failed
    ");  
                exit(EXIT_FAILURE);  
            }  
    
        while(1){
    
            printf("Enter a string
    ");
            fgets(buffer,256,stdin);
            strcpy(data.text,buffer);
            data.msg_type=1;
            
            msgsnd(msgid, (void*)&data,256, 0);
    
    
    
    
    
    
        }
    
    
    
    
    
    
    }
  • 相关阅读:
    图像全參考客观评价算法比較
    单片机project师必备的知识
    ACM-并查集之小希的迷宫——hdu1272
    ArcGIS教程:加权总和
    九度 题目1368:二叉树中和为某一值的路径
    解决solr搜索多词匹配度和排序方案
    具体解释linux文件处理的的经常使用命令
    Hotel
    Unity3D 射线指定层获取GameObject 注意 LayerMask
    ios设计一部WindowsPhone手机
  • 原文地址:https://www.cnblogs.com/wzben/p/5436721.html
Copyright © 2011-2022 走看看