模拟消息

简介

用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);
}
原文地址:https://www.cnblogs.com/cfans1993/p/5734788.html