zoukankan      html  css  js  c++  java
  • Linux 进程间通信 消息队列 实现两个进程间通信

    例子: 通过消息队列实现两个进程间通信,一个进程从终端输入数据,通过消息队列发送,另一个进程通过消息队列接收数据

      文件1 创建进程1 终端输入通过消息队列发送数据

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <string.h>
    
    struct msgbuf //消息结构体
    {
        long types;
        char msg[20];
    };
    struct msgbuf mymsgbuf; //定义消息结构变量
    
    int main(int argc, const char *argv[])
    {
        key_t key;
        int msgid;
    
        mymsgbuf.types = 100; //给消息结构赋值
    
        key = ftok("./app",'a');  //建立key值
        if(key < 0)
        {
            perror("ftok fail ");
            exit(1);
        }
    
        // 创建消息队列,如果消息队列存在,errno 会提示 eexist
        // 错误,此时只需要直接打开消息队列即可
        msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);
        if(msgid < 0)
        {
            if(errno == EEXIST) //文件存在错误提示
            {
                msgid = msgget(key,0666);//打开消息队列
            }
            else //其他错误退出
            {
                perror("msgget fail ");
                exit(1);
            }
        }
        while(1) //循环从终端获取数据,然后通过消息队列发送出去,输入 “quit” 结束循环
        {
            fgets(mymsgbuf.msg, 10, stdin); //终端获取消息写入消息队列中
            //发送消息
            msgsnd(msgid, &mymsgbuf, sizeof(mymsgbuf)-sizeof(long),0);
            if(strstr(mymsgbuf.msg, "quit")!=NULL)
            {
                break;
            }
        }
        
        //删除消息队列
        msgctl(msgid, IPC_RMID, NULL);
    
        return 0;
    }

    文件 2 创建进程2 ,接收消息队列的数据,打印到终端上

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    #include <string.h>
    
    struct msgbuf //消息结构体
    {
        long types;
        char b[20];
    };
    struct msgbuf mymsgbuf, recvbuf; //定义消息结构变量
    
    int main(int argc, const char *argv[])
    {
        key_t key;
        int msgid;
    
        mymsgbuf.types = 100; //给消息结构赋值
    
        key = ftok("./app",'a');  //建立key值
        if(key < 0)
        {
            perror("ftok fail ");
            exit(1);
        }
    
        // 创建消息队列,如果消息队列存在,errno 会提示 eexist
        // 错误,此时只需要直接打开消息队列即可
        msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);
        if(msgid < 0)
        {
            if(errno == EEXIST) //文件存在错误提示
            {
                msgid = msgget(key,0666);//打开消息队列
            }
            else //其他错误退出
            {
                perror("msgget fail ");
                exit(1);
            }
        }
    
        while(1)  //接收到 “quit” 结束循环
        {
            //接收消息
            msgrcv(msgid,&recvbuf,sizeof(mymsgbuf)-sizeof(long),100,0); //recvbuf 是接收消息的结构体,其中的b是实际的数据
            if(strstr(recvbuf.b, "quit") != NULL)
            {
                break;
            }
            printf("recvbuf: %s", recvbuf.b); //
        }
    
        //删除消息队列
        msgctl(msgid, IPC_RMID, NULL);
    
        return 0;
    }

    测试:

  • 相关阅读:
    模拟赛20181101 雅礼 Wearry 施工 蔬菜 联盟
    模拟赛20181031 雅礼 Wearry 养花 折射 画作
    set/priority_queue的运算符重载
    set的完整用法
    最长公共上升子序列 O(n^2)
    无向图边双联通分量 tarjan 模板
    ID 迭代加深搜索 模板 埃及分数
    树上背包DP Luogu P2014 选课
    A* 第k短路
    [POJ3468]关于整数的简单题 (你想要的)树状数组区间修改区间查询
  • 原文地址:https://www.cnblogs.com/electronic/p/10946501.html
Copyright © 2011-2022 走看看