IPC之msgQueue测试代码

Server.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <errno.h>

struct msgmbuf     /*定义消息结构体*/
{
    int msg_type;         /*消息类型*/
    int msg_date;         /*消息发送时间*/
    char msg_text[1024];      /*消息内容*/
};

int main()
{
    int ret;
    int qid;
    key_t key;
    struct msgmbuf msg;

    msg.msg_type=100;          /*读取消息类型为100*/

    key=ftok("/usr",'a');         /*产生标准key*/
    printf("server-key:%d\n",key);
    if(key==-1)
    {
        perror("产生标准key错误!\n");
        exit(1);
    }

    qid=msgget(key,IPC_CREAT|0666);        /*创建消息队列*/
    printf("msgget`s errno:%d\n",errno);
    printf("server-qid:%d\n",qid);
    if(qid==-1)
    {
        perror("创建消息队列失败!");
        exit(1);
    }

    while(1)
    {
        /*先利用msgrcv读取demo5-1发送的消息,并添加到标准输出*/
        ret=msgrcv(qid,&msg,sizeof(msg),msg.msg_type,0);
		printf("msgrcv`s errno:%d\n",errno);
        if(ret==-1)
        {
            perror("读取消息失败!");
            exit(1);
        }
        printf("读取的内容为:\n%s\n",msg.msg_text);

        /*定义写入消息类型为200,并从键盘获取发送内容,利用msgsnd添加消息*/
#if 0
        msg.msg_type=200;
        printf("请输入发送内容:\n");
        scanf("%s",&msg.msg_text);
        msg.msg_date=system("date|cut -d' ' -f 5");
        ret=msgsnd(qid,&msg,sizeof(msg.msg_text),msg.msg_type);
        if(ret==-1)
        {
            perror("添加消息失败!");
            exit(1);
        }
#endif
    }

    msgctl(qid,IPC_RMID,NULL);      /*关闭消息队列*/
    return 0;
}


Client.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <time.h>
#include <errno.h>

struct msgmbuf    /*定义消息的结构体*/
{
    long msg_type;        /*消息类型*/
    int msg_date;           /*添加系统时间*/
    char msg_text[1024];      /*消息内容*/
};

int main()
{
    int ret;
    int qid;
    key_t key;
    struct msgmbuf msg;

    msg.msg_type=100;     /*定义写入消息类型为100*/

    key=ftok("/usr",'a');   /*产生标准key*/
    printf("client-key:%d\n",key);
    if(key==-1)
    {
        perror("产生标准key错误!\n");
        exit(1);
    }

    qid=msgget(key,IPC_CREAT|0666);      /*创建消息队列返回值为qid*/
    printf("msgget`s errno:%d\n",errno);
    printf("client-qid:%d\n",qid);
    if(qid==-1)
    {
        perror("创建消息队列失败!");
        exit(1);
    }

    while(1)
    {
		/*从键盘获取发送内容,并利用msgsnd添加消息,ret判断添加消息是否成功*/
        printf("请输入发送内容:\n");
        scanf("%s",&msg.msg_text);
        msg.msg_date=system("date|cut -d' ' -f 5");              /*添加系统时间*/
        ret=msgsnd(qid,&msg,sizeof(msg.msg_text),msg.msg_type);
		printf("msgsnd`s errno:%d\n",errno);
        if(ret<0)
        {
            perror("添加消息失败!");
            exit(1);
        }
#if 0
        /*定义读取消息类型为200利用msgrcv读取消息,并添加到标准输出*/
        msg.msg_type=200;
        msgrcv(qid,&msg,sizeof(msg),msg.msg_type,0);    
        if(ret<0)
        {
            perror("读取消息失败!");
            exit(1);
        }
        printf("读取的内容为:\n%s\n",msg.msg_text);
#endif
    }

    msgctl(qid,IPC_RMID,NULL);     /*关闭消息队列*/
    return 0;
}


编译:gcc Server.c -o s

    gcc Client.c -o c

运行:

./c

./s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值