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;
}

测试:

原文地址:https://www.cnblogs.com/electronic/p/10946501.html