zoukankan      html  css  js  c++  java
  • 模拟消息

    简介

    用write/read来简单模拟消息, 没有添加信号控制, 同时读取消息后也没有清除缓冲区
    unpipc.h在另一篇中

    mesg.h

    #ifndef _MESG_H
    #define _MESG_H
    #include "unpipc.h"
     
    #define MAXMESGDATA (PIPE_BUF -2*sizeof(long))
    #define MESGHDRSIZE (sizeof(struct mymesg)-MAXMESGDATA)
     
    struct mymesg{
        long mesg_len;
        long mesg_type;
        char mesg_data[MAXMESGDATA];
    };
     
    ssize_t mesg_send(int,struct mymesg*);
    void Mesg_send(int,struct mymesg*);
    ssize_t mesg_recv(int,struct mymesg*);
    ssize_t Mesg_recv(int,struct mymesg*);
     
    #endif
    

    mesg.c

    #include "mesg.h"
     
    ssize_t mesg_send(int fd,struct mymesg *mesg){
        return(write(fd,mesg,MESGHDRSIZE+mesg->mesg_len));
    }
    void Mesg_send(int fd,struct mymesg *mesg){
        if(write(fd,mesg,MESGHDRSIZE+mesg->mesg_len) != (MESGHDRSIZE+mesg->mesg_len))
            err_quit("mesg_send error");
    }
    ssize_t mesg_recv(int fd,struct mymesg *mesg){
        ssize_t nread;
        size_t len;
     
        if((nread=Read(fd,mesg,MESGHDRSIZE)) ==0)
            return(0);
        else if(nread != MESGHDRSIZE)
            err_quit("message header: expected %d, got %d",MESGHDRSIZE,nread);
     
        if((len=mesg->mesg_len)>0)
            if((nread=Read(fd,mesg->mesg_data,len)) != len)
                err_quit("message data: expected %d, got %d",len,nread);
        return(len);
    }
    ssize_t Mesg_recv(int fd,struct mymesg *mesg){
        return (mesg_recv(fd,mesg));
    }
    

    简单例子

    #include "mesg.h"
     
    int main(int argc, char *argv[]){
        char *pathname="./mesg.tmp";
        int fd;
        pid_t pid;
        struct mymesg mesg;
     
        if((pid=Fork()) == 0){
           fd=Open(pathname,O_RDWR|O_CREAT,0);
           Fgets(mesg.mesg_data,MAXMESGDATA,stdin);
           size_t len=strlen(mesg.mesg_data);
           if(mesg.mesg_data[len-1]=='
    ')
               len--;
           mesg.mesg_len=len;
           mesg.mesg_type=1;
           Mesg_send(fd,&mesg);
        }else{
            waitpid(pid,NULL,0);
            fd=Open(pathname,O_RDONLY,0);
            mesg.mesg_type=1;
            ssize_t n=Mesg_recv(fd,&mesg);
            mesg.mesg_data[n]='';
            char *ptr=mesg.mesg_data;
            puts(ptr);
            Unlink(pathname);
        }
        exit(0);
    }
    
  • 相关阅读:
    UVaLive 7362 Farey (数学,欧拉函数)
    UVaLive 7361 Immortal Porpoises (矩阵快速幂)
    UVaLive 7359 Sum Kind Of Problem (数学,水题)
    CodeForces 706D Vasiliy's Multiset (字典树查询+贪心)
    负载均衡服务器
    集群-如何理解集群?
    架构规划
    领域模型
    状态图
    E-R图
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5734788.html
Copyright © 2011-2022 走看看