华清远见作业第二十四天

使用消息队列完成两个进程之间相互通信

华清远见作业第二十四天_第1张图片

代码

#include
#include
#include
#include 
#include 
#include 
#include 
#include 
#include 

//定义一个发送消息的结构体类型
struct msgbuf
{
    long mtype;         //消息类型
    char mtext[1024];    //消息正文大小
};

#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
	//1、创建key值
    key_t key = ftok("/", 'k');
    if(key == -1)
    {
        perror("key create error");
        return -1;
    }

    //此时key已经创建出来
    printf("key = %#x\n", key);

    //2、创建消息队列
    int msgid = msgget(key, IPC_CREAT|0664);
    if(msgid == -1)
    {
        perror("msgget error");
        return -1;
    }
    printf("msgid = %d\n", msgid);       //输出消息队列id号
	struct msgbuf buf;
    //需要创建两个进程,父进程从管道1中读数据,子进程向管道2中写数据
    pid_t pid = -1;
    pid = fork();

    if(pid < 0)
    {
        perror("fork error");
        return -1;
    }else if(pid == 0)
    {
        //子进程负责向中写数据

    
    while(1)
    {

	  //输入消息内容
        printf("请输入您要发送的类型:");
        scanf("%ld", &buf.mtype);
        printf("请输入消息内容:");
        scanf("%s", buf.mtext);

        //将消息放入消息队列中
        msgsnd(msgid, &buf, SIZE, 0);

        //判断退出条件
        if(strcmp(buf.mtext, "quit") == 0)
        {
            break;
        }





    }

    }else
    {
        //父进程负责向消息队列中读数据
     //3、向消息队列中存放数据

    while(1)
    {
       //将消息从消息队列中读取出来
        msgrcv(msgid, &buf, SIZE, 10, 0);
        //参数1:消息队列id
        //参数2:容器起始地址
        //参数3:消息正文大小
        //参数4:要读取的消息类型
        //参数5:是否阻塞
        
        //将读取的消息打印出来
        printf("收到消息:%s\n", buf.mtext);



    }

       
    }
	    //4、删除消息队列
    if(msgctl(msgid, IPC_RMID, NULL) == -1)
    {
        perror("msgctl error");
        return -1;
    }



    return 0;
}
#include
#include
#include
#include 
#include 
#include 
#include 
#include 
#include 

//定义一个发送消息的结构体类型
struct msgbuf
{
    long mtype;         //消息类型
    char mtext[1024];    //消息正文大小
};

#define SIZE (sizeof(struct msgbuf)-sizeof(long))
int main(int argc, const char *argv[])
{
	//1、创建key值
    key_t key = ftok("/", 'k');
    if(key == -1)
    {
        perror("key create error");
        return -1;
    }

    //此时key已经创建出来
    printf("key = %#x\n", key);

    //2、创建消息队列
    int msgid = msgget(key, IPC_CREAT|0664);
    if(msgid == -1)
    {
        perror("msgget error");
        return -1;
    }
    printf("msgid = %d\n", msgid);       //输出消息队列id号
	struct msgbuf buf;
    //需要创建两个进程,父进程从管道1中读数据,子进程向管道2中写数据
    pid_t pid = -1;
    pid = fork();

    if(pid < 0)
    {
        perror("fork error");
        return -1;
    }else if(pid == 0)
    {
        //子进程负责向中读数据

    
    while(1)
    {

        //将消息从消息队列中读取出来
        msgrcv(msgid, &buf, SIZE, 9,0);
        //参数1:消息队列id
        //参数2:容器起始地址
        //参数3:消息正文大小
        //参数4:要读取的消息类型
        //参数5:是否阻塞
        
        //将读取的消息打印出来
        printf("收到消息:%s\n", buf.mtext);

    }

    }else
    {
        //父进程负责向消息队列中写数据
     //3、向消息队列中存放数据

    while(1)
    {
        //输入消息内容
        printf("请输入您要发送的类型:");
        scanf("%ld", &buf.mtype);
        printf("请输入消息内容:");
        scanf("%s", buf.mtext);

        //将消息放入消息队列中
        msgsnd(msgid, &buf, SIZE, 0);

        //判断退出条件
        if(strcmp(buf.mtext, "quit") == 0)
        {
            break;
        }
    }

       
    }
	    //4、删除消息队列
    if(msgctl(msgid, IPC_RMID, NULL) == -1)
    {
        perror("msgctl error");
        return -1;
    }



    return 0;
}

运行效果:

华清远见作业第二十四天_第2张图片

思维导图

你可能感兴趣的:(华清远见作业,算法,c语言)