使用mmap实现自己的PIPE

程序没有仔细测试,如果有BUG请留言,谢谢!

//pipe.h #ifndef __HEAD_H #define __HEAD_H #define BUFSIZE 4000 //读写标志 typedef enum { READ, WRITE }RDWRFLAG; //缓冲区和控制标志 typedef struct { char buf[BUFSIZE]; int head; int tail; int existnum;//缓冲区中存在待读取的数据的个数 pid_t rpid; pid_t wpid; } PIPE; //创建自己的PIPE int createPipe(PIPE** pip); //设置进程的读写标志,每个进程要么只读,要么只写 void setRDWRflag(PIPE *pip, RDWRFLAG flag); //每次从缓冲区中读取一个byte的数据 int readAbye(PIPE* pip, int* c); //每次向缓冲区中写入一个byte的数据 int writeAbye(PIPE* pip, int c); //从缓冲区中读取数据 int readPipe(PIPE *pip, char *buf, int size); //向缓冲区中写入数据 int writePipe(PIPE *pip, const char *buf, int size); //销毁自己的PIPE int closePipe(PIPE *pip); #endif

 

//pipe.c //使用mmap实现父子进程间通信 #include #include #include #include #include #include #include "pipe.h" //创建共享区 int createPipe(PIPE** pip) { *pip=(PIPE*)mmap(NULL, sizeof(PIPE), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0 ); if( MAP_FAILED==*pip ) { perror("mmap"); return -1; } (*pip)->head=0; (*pip)->tail=0; (*pip)->existnum=0; return 0; } //设置调用进程的读写属性,一个进程要么是读,要么是写 void setRDWRflag(PIPE* pip, RDWRFLAG flag) { if( READ==flag ) { pip->rpid=getpid(); } else { pip->wpid=getpid(); } } //从共享缓冲区中读取一个数据 int readAbye(PIPE* pip, int* c) { if( 0==pip->existnum )//当缓冲区为空时,返回读错误 { return -1; } else { *c=(pip->buf)[pip->head]; (pip->existnum)--; if( ++(pip->head)==BUFSIZE ) { pip->head=0; } return 0; } } //向共享缓冲区中写入一个数据 int writeAbye(PIPE* pip, int c) { //缓冲区已满,无法写入 if( BUFSIZE==pip->existnum ) { return -1; } else { (pip->buf)[pip->tail]=c; (pip->existnum)++; if( BUFSIZE==++(pip->tail) ) { pip->tail=0; } return 0; } } int readPipe(PIPE* pip, char* buf, int size) { int i=0; int cnt=size; int c; if( getpid()!=pip->rpid ) { return -1; } while( cnt-- ) { if( -1!=readAbye(pip, &c) ) { buf[i++]=c; } else { break; } } if( cnt==0 ) { return size; } else { return i; } } int writePipe(PIPE* pip, const char* buf, int size) { int i=0; int cnt=size; if( getpid()!=pip->wpid ) { return -1; } while( cnt-- ) { if( -1==writeAbye(pip, buf[i++]) ) { break; } } if( 0==cnt ) { return size; } else { return i; } } int closePipe(PIPE* pip) { return munmap(pip, sizeof(PIPE)); } //测试代码 int main(int argc, char *argv[]) { char srcbuf[20]="Hello World!"; char desbuf[20]; memset(desbuf, 0, 20); pid_t pid; PIPE* pip=NULL; if( -1==createPipe(&pip) ) { printf("createPipe error!/n"); exit(1); } pid=fork(); if( pid<0 ) { perror("fork"); exit(1); } else if( pid==0 )//设置子进程为写端 { setRDWRflag(pip, WRITE); if( -1==writePipe(pip, srcbuf, 20) ) { printf("writePipe error!/n"); exit(1); } exit(0); } else//设置父进程为读端 { sleep(1); setRDWRflag(pip, READ); if( -1==readPipe(pip, desbuf, 20) ) { printf("readPipe error!/n"); exit(1); } printf("%s/n", desbuf); } closePipe(pip); exit(0); }

你可能感兴趣的:(Linux编程)