• 模拟消息


    简介

    用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);
    }
    
  • 相关阅读:
    简单的ajax的结构
    Sencha touch 中的一段源码匿名中定义Function并调用
    js使用闭包时,内部函数是直接访问外部函数的实际变量而非复制一份新变量
    rd /q /s 删除文件
    两种定义Function的方式 JavaScript
    DOC @echo off call
    Function 对象,javascript中双括号的运行机制
    抽象的力量
    Hash算法,及HashMap使用
    如何使用EnumSet实现基于bit field的enum set?
  • 原文地址:https://www.cnblogs.com/cfans1993/p/5734788.html
Copyright © 2020-2023  润新知