3-6练习题

实现AB进程对话。

A进程发送一句话后,B进程接收到打印。然后B进程发送一句话,A进程接收后打印

重复上述步骤。直到AB接收或者发送完quit后,结束AB进程

提示用两根管道

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define MSG_EXCEPT      020000       


struct msgbuf
{
    long mtype;  //消息类型,必须大于0
    char mtext[128];  //消息内容
};


int main(int argc, const char *argv[])
{

    //求key1值
    key_t key1 = ftok("/./",1);
    if(key1 < 0)
    {
        perror("ftok1");
        return -1;
    }
    printf("key = %#x\n",key1);

    //求k2的值
    key_t key2 = ftok("/./",2);
    if(key2 < 0)
    {
        perror("ftok2");
        return -1;
    }
    printf("key = %#x\n",key2);


    //通过key值找到对应的消息队列1,若消息队列1不存在,则创建消息队列
    int msqid1 = msgget(key1,IPC_CREAT|0777);
    if(msqid1 < 0)
    {
        perror("msgget1");
        return -1;
    }
    printf("msqid1 = %d\n",msqid1);

    //通过key2值找到对应的消息队列2,若消息队列2不存在,则创建消息队列2
    int msqid2 = msgget(key2,IPC_CREAT|0777);
    if(msqid2 < 0)
    {
        perror("msgget2");
        return -1;
    }
    printf("msqid2 = %d\n",msqid2);

    //创建
    pid_t cpid = fork();

    //打包数据
    struct msgbuf snd;
    struct msgbuf snd1;
    ssize_t res = 0;
    ssize_t res1 = 0;
    struct msgbuf rcv1;
    struct msgbuf rcv;
    if(cpid > 0)
    {
        while(1)
        {
            //send文件向队列中发送消息
            printf("请输入消息类型>>> ");
            scanf("%ld",&snd.mtype);
            getchar();
            if(snd.mtype <= 0)
            {
                break;
            }
            printf("请输入消息内容>>> ");
            fgets(snd.mtext,sizeof(snd.mtext),stdin);
            snd.mtext[strlen(snd.mtext)-1] = '\0';


            //将数据打包发送到消息队列
            if(msgsnd(msqid1,(void*)&snd,sizeof(snd.mtext),0) < 0)
            {
                perror("msgsnd1");
                return -1;
            }
            printf("父进程向消息队列1发送消息成功\n");

    //      system("ipcs -q");  //让代码执行shell指令


            //接收子进程向队列发送的消息
            res = msgrcv(msqid2,&rcv,sizeof(rcv.mtext),0,0);

            if(res < 0)
            {
                perror("msgrcv2");
                break;
            }
            printf("父进程成功读取到消息队列2消息:res=%ld | mtype=%ld : mtext=%s\n",res,rcv.mtype,rcv.mtext);

        }

    }
    else if(0 == cpid)
    {
        while(1)
        {

            //接收子进程向队列发送的消息
            res1 = msgrcv(msqid1,&rcv1,sizeof(rcv1.mtext),0,0);

            if(res1 < 0)
            {
                perror("msgrcv1");
                break;
            }
            printf("子进程成功接收到父进程发送到消息队列1消息:res1=%ld | mtype=%ld : mtext=%s\n",res1,rcv1.mtype,rcv1.mtext);


                //向父进程发送消息
            printf("(子进程)请输入消息类型>>> ");
            scanf("%ld",&snd1.mtype);
            getchar();
            if(snd1.mtype <= 0)
            {
                break;
            }
            printf("(子进程)请输入消息内容>>> ");
            fgets(snd1.mtext,sizeof(snd1.mtext),stdin);
            snd1.mtext[strlen(snd1.mtext)-1] = '\0';


            //将数据打包发送到消息队列                                
            if(msgsnd(msqid2,(void*)&snd1,sizeof(snd1.mtext),0) < 0)
            {
                perror("msgsnd2");
                return -1;
            }
            printf("子进程向消息队列2发送消息成功\n");

            system("ipcs -q");  //让代码执行shell指令



        }


    }



 //删除消息对列1

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

    if(msgctl(msqid1,IPC_RMID,NULL))
    {
        perror("msgctl");
        return -1;
    }

    system("ipcs -q");



    return 0;
}


                                                                                                                                                                                                               
                                                                                                                                                                                                               
                                                                                                                                                                                                               

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值