消息队列实现进程之间通信

1.消息队列号100进程端

#include
//消息结构体
struct msgbuf
{
    long int mtype;//消息类型
    char mtext[1024];//消息内容
};
不需要消息类型的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)

int main(int argc, char const *argv[])
{
    //创建键值(具体由三个只是先stat结构的st_dev,st_ino;id的低8位组成)
    //第二参数设计的意义是为了生成一个唯一可以进行通信的键值key
    key_t key=ftok("/",'k');
    if (key==-1)
    {
      perror("ftok error");
      return -1;   
    }

    int msgid;
     //根据唯一的键值创建的消息队列
    if((msgid=msgget(key,IPC_CREAT|0664))==-1)
    {
         perror("msgget error");
        return -1;
    }
     struct msgbuf buf;
    int pid=fork();
    if(pid==-1)
    {
        perror("fork error");
        return -1;
    }
    else if(pid==0)
    {
        struct msgbuf buf = {.mtype=100};
       while (1)
    {  
         //终端输入
        bzero(buf.mtext,sizeof(buf.mtext));
        fgets(buf.mtext,sizeof(buf.mtext),stdin);
        buf.mtext[strlen(buf.mtext)-1]='\0';
        //发送消息内容
        if(msgsnd(msgid,&buf,MSGSIZE,0)!=0)
        {
            perror("msgsnd error");
            return -1;
        }
        //发送消息正文为quit则退出
        if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
     exit(EXIT_SUCCESS);
    }
    else{

    while (1)
    {
       bzero(buf.mtext,sizeof(buf.mtext));
        //读取接收的消息正文
       if(msgrcv(msgid,&buf,MSGSIZE,200,0)==-1)
       {
        perror("msgrcv error");
        return -1;
       }
       printf("读取的消息为:%s\n", buf.mtext);
       //读取消息正文为quit则退出
       if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
    wait(NULL);
        
    }
    return 0;
}

 2.消息队列号200进程端

#include
//消息结构体
struct msgbuf
{
    long int mtype;//消息类型
    char mtext[1024];//消息内容
};
//不需要消息类型的大小
#define MSGSIZE sizeof(struct msgbuf)-sizeof(long int)
int main(int argc, char const *argv[])
{
    //创建键值(具体由三个只是先stat结构的st_dev,st_ino;id的低8位组成)
    //第二参数设计的意义是为了生成一个访问并进行通信的键值key
    key_t key = ftok("/", 'k');
    if(key == -1)
    {
        perror("ftok error");
        return -1;
    }
    int msgid;
    //根据唯一的键值打开创建的消息队列
    if((msgid=msgget(key, IPC_CREAT|0664)) == -1)
    {
        perror("msgget error");
        return -1;
    }
    //定义消息队列的信息结构体
    struct msgbuf buf;
    int pid=fork();
    if(pid==-1)
    {
        perror("fork error");
        return -1;
    }
    else if(pid==0)
    {
        struct msgbuf buf = {.mtype=200};
       while (1)
    {  
         //终端输入
        bzero(buf.mtext,sizeof(buf.mtext));
        fgets(buf.mtext,sizeof(buf.mtext),stdin);
        buf.mtext[strlen(buf.mtext)-1]='\0';
        //发送消息内容
        if(msgsnd(msgid,&buf,MSGSIZE,0)!=0)
        {
            perror("msgsnd error");
            return -1;
        }
        //发送消息正文为quit则退出
        if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
       exit(EXIT_SUCCESS);
    }
    else{

    while (1)
    {

        //读取接收的消息正文
       if(msgrcv(msgid,&buf,MSGSIZE,100,0)==-1)
       {
        perror("msgrcv error");
        return -1;
       }
       printf("读取的消息为:%s\n", buf.mtext);
       //读取消息正文为quit则退出
       if(strcmp(buf.mtext,"quit") == 0)
        {
            break;
        }
    }
    wait(NULL);
    }
    //管理消息队列退出时且不需要修改消息队列的类型则删除消息队列
        if(msgctl(msgid, IPC_RMID, NULL) == -1)
    {
        perror("msgctl error");
        return -1;
    }
    return 0;
}

运行效果:

你可能感兴趣的:(c,进程间通信)