• 使用消息队列的方式实现进程间通信,输入quit时退出


    发送接收端1 头文件查man手册

    #include

    struct msbuf{
        long mtype;
        char mtext[128];
    };

    int main(int argc, const char *argv[])
    {
        key_t key = ftok("/home/ubuntu/",2);
        if(key < 0){
            perror("ftok");
            return -1;
        }
        printf("键值创建成功 %d\n",__LINE__);
        int msqid = msgget(key,IPC_CREAT|0777);
        if(msqid < 0){
            perror("msgget");
            return -1;
        }
        printf("消息队列创建成功 %d\n",__LINE__);
        
        struct msbuf send;
        while(1){
            printf("输入消息类型>>> ");
            scanf("%ld",&send.mtype);
            getchar();
            if(send.mtype <= 0){
                break;
            }
            printf("输入消息内容>>> ");
            fgets(send.mtext,sizeof(send.mtext),stdin);
            send.mtext[strlen(send.mtext)-1] = '\0';
            //数据打包发送
            if(msgsnd(msqid,(void*)&send,sizeof(send.mtext),0) < 0){
                perror("msgsnd");
                return -1;
            }
            printf("发送数据成功 %d\n",__LINE__);
            system("ipc -q");
        }    
        return 0;
    }

    发送接收端2:

    #include

    #define MSG_EXCEPT 020000

    struct msbuf{
        long mtype;
        char mtext[128];
    };

    int main(int argc, const char *argv[])
    {
        key_t key = ftok("/home/ubuntu/",2);
        if(key < 0){
            perror("ftok");
            return -1;
        }
        printf("键值创建成功 __%d__\n",__LINE__);
        int msqid = msgget(key,IPC_CREAT|0777);
        if(msqid < 0){
            perror("msgget");
            return -1;
        }
        printf("消息队列创建成功 __%d__\n",__LINE__);
        system("ipc -q");

        ssize_t res = 0;
        struct msbuf rcv;
        struct msbuf send;
        while(1){
            //读
            res = msgrcv(msqid,&rcv,sizeof(rcv.mtext),0,0);
            if(res < 0){
                perror("msgrcv");
                break;
            }
            printf("B读取到A>>> mtype=%ld : mtext=%s\n",rcv.mtype,rcv.mtext);
            
            printf("向A发送数据类型>>> ");
            scanf("%ld",&send.mtype);
            getchar();
            if(send.mtype <= 0){
                break;
            }
            printf("向A发送数据>>> ");
            fgets(send.mtext,sizeof(send.mtext),stdin);
            send.mtext[strlen(send.mtext)-1] = '\0';

            if(msgsnd(msqid,(void*)&send,sizeof(send.mtext),0) < 0){
                perror("msgsnd");
                return -1;    
            }
            printf("向A发送数据成功 __%d__",__LINE__);
            if(strcmp(send.mtext,"quit") == 0){
                system("killall -9 ./w ./r");
            }

        }
        
    /*    if(msgctl(msqid,IPC_RMID,NULL) < 0){
            perror("msgctl");
            return -1;
        }
        printf("删除消息队列成功\n");*/


        return 0;

    }

  • 相关阅读:
    27_Git&GitHub
    f-stack的源码编译安装
    UE4 / UE5 内存与性能优化
    智能AI创作系统ChatGPT详细搭建教程/AI绘画系统/支持GPT联网提问/支持Prompt应用/支持国内AI模型
    高可用之战:Redis Sentinal(哨兵模式)
    python进程池之创建子任务的函数总结
    SpringSecurity,jwt oathu sso,YeZiJie
    vue3+vite 中使用百度地图【两种方式】
    数据安全:什么是数据风险评估?等保合规为什么是企业必需品
    Rust Aya 编写 eBPF 程序
  • 原文地址:https://blog.csdn.net/m0_72040461/article/details/137940229