模拟消息
简介
用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]=='\n')
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]='\0';
char *ptr=mesg.mesg_data;
puts(ptr);
Unlink(pathname);
}
exit(0);
}