#include#include#include#include#include#include#include#defineMAX 256 /* 邮箱大小*/#defineSIZE 99 /*每次读取长度范围 小于邮箱大小*/charcBuff[MAX];/*邮箱*/intiHead;/*头指针*/intiTail;/*尾指针*/intjiangmq_read(constchar*w_path)
{
FILE*w_fp;intsizen;/*实际读入的大小*/if(NULL==(w_fp=fopen(w_path ,"r")))
{
printf("error: Can not open %s .\n",w_path);
pthread_exit((void*)1);
}while(1)
{/*判断邮箱是否已写满了*/if((iTail(iHead-SIZE)))
{continue;
}/*读取数据到邮箱中*/if((sizen=fread(cBuff+iTail,1,SIZE,w_fp))==0)
{while(1)
{if(iHead==iTail)
{
fclose(w_fp);
pthread_exit((void*)1);
}
}
}/*写完一次邮箱 移动尾指针*/iTail+=sizen;/*再次判断邮箱是否 将要 写满*/while((iHead==(iTail+sizen))||(((MAX-iTail)
{
iTail=0;
}
}
}intjiangmq_write(constchar*r_path)
{
FILE*fp;intsizen;/*实际读取的大小*/inttmp ;/*标示实际要读取内容的大小*/if(NULL==(fp=fopen(r_path ,"w")))
{
printf("error: Can not open %s.\n",r_path);
pthread_exit((void*)1);
}
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);while(1)
{/*判断邮箱是否为空*/if((iHead==iTail) )
{continue;
}
tmp=SIZE;/*当邮箱中可读内容不足标准大小*/if((iTail>iHead)&&((iTail-SIZE)
{
p=iTail-iHead;
}/*把邮箱中内容写入文件中*/if((sizen=fwrite(cBuff+iHead,1, tmp,fp))<0)
{
fclose(fp);
pthread_exit((void*)2);
}/*读完邮箱一次 移动头指针*/iHead+=sizen ;/*判断是否到邮箱尾部*/if(iHead>(MAX-SIZE))
{while(iTail==iHead){}
iHead=0;
}
}
}intmain(intargc ,char*argv[])
{int*value_ptr;
pthread_t wtid,rtid;/*初始化头尾指针*/iHead=0;
iTail=0;if(argc!=3)
{
printf("error:please input two files name.\n");return-1;
}if(pthread_create(&rtid,NULL,(void*)jiangmq_write,argv[2])!=0)
{
printf("error: Can not create jiangmq_write.\n");return-2;
}if(pthread_create(&wtid,NULL,(void*)jiangmq_read,argv[1])!=0)
{
printf("error: Can not create jiangmq_read.\n");return-2;
}/*等待线程读入结束*/pthread_join(wtid,(void**)&value_ptr);/*终止写出线程*/pthread_cancel(rtid);
printf("over \n");return0;
}