【无标题】

发送端

#include <myhead.h>
struct msgbuf
{
long mtype;//消息的类型
char mtext[1000];//消息的正文,长度不是1,可以自定义
};
#define leng sizeof(struct msgbuf)-sizeof(long);
int main (int argc, const char *argv[])
{
/*1、将消息队列发送接收端实现一遍。
2、将共享内存发送接收实现一遍。
3、建立两个.c 建立子父进程,父进程发送消息到队列,子进程读取队列,另一个同样。*/
    key_t key=ftok("./",'B');
    if(key==-1)
    {
        perror("ftok");
        return -1;
    }
    printf("键 %#x\n",key);
    int msgID=msgget(key,IPC_CREAT|0664);
    if(msgID==-1)
    {
        perror("msgget");
        return -1;
    }
    printf("msgid=%d\n",msgID);
    struct msgbuf send;
    while(1)
    {
        printf("输入消息的类型");
        scanf("%ld",&send.mtype);
        getchar();
        printf("输入信息的内容");
        fgets(send.mtext,sizeof(send.mtext),stdin);
        send.mtext[strlen(send.mtext)-1]='\0';
        msgsnd(msgID,&send,leng,0);//发送消息
        if(strcmp(send.mtext,"quit")==0)
        {
            break;
        }
    }
    if(msgctl(msgID,IPC_RMID,NULL)==-1)
    {
        printf("删除队列失败\n");
        return -1;
    }
    


    return 0;
}  
 

接收端

struct 
{
    long mtype;
    char mtext[1000];
};
int main (int argc, const char *argv[])
{
    key_t key=ftok("./",'B');
    if(key==-1)
    {
        perror("ftok");
        return -1;
    }
    printf("键%#x\n",key);
    int msgID=msgget(key,IPC_CREAT|0664);
    if(msgID==-1)
    {
        perror("msgget");
        return -1;
    }
    printf("msgid=%d\n",msgID);
    struct msgbuf res;
    while(1)
    {
        msgrcv(msgID,&res,,leng,0);
        printf("%s\n",rev.mtext);
        if(strcmp(res.mtext,"quit")==0)
        {
            break;
        }
    }
    

    return 0;
}  

共享内存发送端

#include <myhead.h>
#define PAGE_SIZE 4096

int main(int argc, const char *argv[])
{
    key_t key = ftok("./",'W');
    if(key==-1)
    {
        perror("ftok");
        return -1;
    }
    int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);
    if(shmID==-1)
    {
        perror("shmget");
        return -1;
    }
    char *shmADD = shmat(shmID,NULL,0);
    if(shmADD==(void *)-1)
    {
        perror("shmat");
        return -1;
    }
    char buff[1024];
    while(1)
    {
        printf("请输入共享内存的数据:");
        fgets(buff,sizeof(buff),stdin);//
        strcpy(shmADD,buff);
        if(strcmp(shmADD,"quit\n")==0)//
        {
            break;
        }
    }    

    if(shmdt(shmADD)==-1)//
    {
        perror("shmdt");
        return -1;
    }

    if(shmctl(shmID,IPC_RMID,NULL)==-1)

    {
        perror("shmctl");
        return -1;
    }
    return 0;
}
 

发送端

#include<myhead.h>
#define PAGE_SIZE 4096

int main(int argc, const char *argv[])
{
    key_t key = ftok("./",'W');
    if(key==-1)
    {
        perror("ftok");
        return -1;
    }
    int shmID = shmget(key,PAGE_SIZE,IPC_CREAT|0664);//获取内存段的id
    if(shmID==-1)
    {
        perror("shmget");
        return -1;
    }
    char *shmADD = shmat(shmID,NULL,0);
    if(shmADD==(void *)-1)
    {
        perror("shmat");
        return -1;
    }
    while(1)
    {
        printf("%s\n",shmADD);
        if(strcmp(shmADD,"quit\n")==0)
        {
            break;
        }
    }    
    if(shmdt(shmADD)==-1)
    {
        perror("shmdt");
        return -1;
    }
    return 0;
}
 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值