邮箱通讯
声明以下全局变量
char cBuff[256]; //邮箱
int iHead; //邮箱头指针
int iTail; //邮箱尾指针
创建两个线程:XXX_Write和XXX_Read。
XXX_Write:读取一个文件(大点的),将文件内容按序写入邮箱,同时修改尾指针。即头尾指针之间的内容是提供给XXX_Read线程读取的。
XXX_Read:从邮箱中读取未读的数据,写入一个新文件,同时修改头指针。
- #include <stdio.h>
- #include <pthread.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #define MAX 256 /* 邮箱大小*/
- #define SIZE 99 /*每次读取长度范围 小于邮箱大小*/
- char cBuff[MAX]; /*邮箱*/
- int iHead; /*头指针*/
- int iTail; /*尾指针*/
- int jiangmq_read(const char *w_path)
- {
- FILE *w_fp;
- int sizen; /*实际读入的大小*/
- 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) && (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) < SIZE)&&(iHead <= SIZE))){}
- /*判断是否到邮箱尾部*/
- if((MAX - iTail) < SIZE)
- {
- iTail = 0;
- }
- }
- }
- int jiangmq_write(const char *r_path)
- {
- FILE *fp;
- int sizen; /*实际读取的大小*/
- int tmp ; /*标示实际要读取内容的大小*/
- 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) < iHead))
- {
- 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;
- }
- }
- }
- int main(int argc , 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");
- return 0;
- }
改进的全双工通信代码下载地址
http://download.csdn.net/detail/jmq_0000/4093546
用两个进程间分别又有两个线程通过共享内存操作