管道实例
mypipe.h文件内容
#ifndef MYPIPE_H__
#define MYPIPE_H__
#define MYPIPE_READ 0x00000001UL
#define MYPIPE_WRITE 0x00000002UL
#define PIPESIZE 1024
typedef void mypipe_t;
int mypipe_register(mypipe_t *,int opmap);
int mypipe_unregister(mypipe_t *,int opmap);
mypipe_t * mypipe_init(void);
int mypipe_read(mypipe_t *,void *buf,size_t count);
int mypipe_write(mypipe_t *,const void *buf,size_t size);
int mypipe_destory(mypipe_t *);
#endif
mypipe.c文件内容
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "mypipe.h"
struct mypipe_st
{
int head;
int tail;
char data[PIPESIZE];
int datasize;
int count_rd;
int count_wr;
pthread_mutex_t mut;
pthread_cond_t cond;
};
mypipe_t *mypipe_init(void)
{
struct mypipe_st *me;
me=malloc(sizeof(*me));
if(me==NULL)
return NULL;
me->head=0;
me->tail=0;
me->datasize=0;
me->count_rd=0;
me->count_wr=0;
pthread_mutex-init(&me->mut,NULL);
pthread_cond init(&me->cond,NULL);
}
int mypipe_register(mypipe_t *ptr,int opmap)
{
/*if error*/
pthread_mutex_lock(&me->mut);
if(opmap & MYPIPE_READ)
me->count_rd++;
if(opmap & MYPIPE_WRITE)
me->count_wr++;
pthread_cond_broadcast(&me->cond);
while(me->count_rd<=0||me->count_wr<=0)
{
pthread_cond_wait(&me->cond,&me->mut);
}
pthread_mutex_unlock(&me->mut);
return 0;
}
int mypipe_unregister(mypipe_t *ptr,int opmap)
{
/* if error */
pthread_mutex_lock(&me->mut)
if(opmap & MYPIPE_READ)
me->count_rd--;
if(opmap & MYPIPE_WRITE)
me->count_wr--;
pthread_cond_broadcast();
pthread_mutex_unlock(&me->mut);
return 0;
}
static int mypipe_readbyte_unlock(struct mypipe_st *me,char *datap)
{
if(me->datasize <=0 )
return -1;
*datap=me->data[me->head];
me->head=next(me->head);
me->dataszie--;
return 0;
}
int mypipe_read(mypipe_t *ptr,void *buf,size_t count)
{
struct mypipe_st *me=ptr;
pthread_mutex_lock(&me->mut);
while(me->datasize <= 0&& me->count_wr>0)
pthread_cond_wait(&me->cond,&me->mut);
if(me->datasize<=0 && me->count_er <= 0)
{
pthread_mutex_unlock(&me->mut);
return 0;
}
for(i=0;i<count;i++)
{
if(mypipe_readbyte_unlock(me,buf+i)!=0)
break;
}
pthread_cond_broadcast(&me->cond);
pthread_mutex_unlock(&me->mut);
return i;
}
int mypipe_write(mypipe_t *,const void *buf,size_t size)
{
}
int mypipe_destory(mypipe_t *)
{
struct mypipe_st *me=ptr;
pthread_mutex_destroy(&me->mut);
pthread_cond_destroy(&me->cond);
free(ptr);
return 0;
}