Linux 多线程文件读写操作 +实例

邮箱通讯

 声明以下全局变量

char cBuff[256];   //邮箱

int iHead;        //邮箱头指针

int iTail;        //邮箱尾指针

 

创建两个线程:XXX_Write和XXX_Read。

XXX_Write:读取一个文件(大点的),将文件内容按序写入邮箱,同时修改尾指针。即头尾指针之间的内容是提供给XXX_Read线程读取的。

XXX_Read:从邮箱中读取未读的数据,写入一个新文件,同时修改头指针。


  1. #include <stdio.h>  
  2. #include <pthread.h>  
  3. #include <stdlib.h>  
  4. #include <sys/types.h>  
  5. #include <sys/stat.h>  
  6. #include <fcntl.h>  
  7. #include <unistd.h>  
  8.   
  9.   
  10.   
  11.   
  12. #define MAX 256     /* 邮箱大小*/  
  13. #define SIZE 99     /*每次读取长度范围 小于邮箱大小*/  
  14.   
  15.   
  16. char cBuff[MAX];    /*邮箱*/  
  17. int iHead;          /*头指针*/  
  18. int iTail;          /*尾指针*/  
  19.   
  20.   
  21. int jiangmq_read(const char *w_path)  
  22. {  
  23.     FILE *w_fp;   
  24.     int sizen;      /*实际读入的大小*/   
  25.   
  26.   
  27.     if(NULL == (w_fpfopen(w_path , "r")))  
  28.     {  
  29.             printf("error: Can not open %s .\n",w_path);  
  30.               
  31.             pthread_exit((void *)1);  
  32.     }  
  33.       
  34.       
  35.     while(1)  
  36.     {  
  37.   
  38.   
  39.         /*判断邮箱是否已写满了*/  
  40.         if((iTail < iHead) && (iTail > (iHead -SIZE)))     
  41.         {  
  42.             continue ;  
  43.         }  
  44.   
  45.   
  46.         /*读取数据到邮箱中*/  
  47.         if((sizen = fread(cBuff+iTail,1,SIZE,w_fp)) == 0 )    
  48.         {  
  49.                 while(1)  
  50.                 {  
  51.                     if(iHead == iTail)  
  52.                     {     
  53.                         fclose(w_fp);  
  54.                         pthread_exit((void *)1);  
  55.                     }  
  56.                 }  
  57.         }  
  58.   
  59.   
  60.         /*写完一次邮箱 移动尾指针*/  
  61.         iTail += sizen;               
  62.           
  63.           
  64.         /*再次判断邮箱是否 将要 写满*/  
  65.         while((iHead == (iTail+sizen))||(((MAX - iTail) < SIZE)&&(iHead <= SIZE))){}  
  66.   
  67.   
  68.   
  69.   
  70.         /*判断是否到邮箱尾部*/  
  71.         if((MAX - iTail) < SIZE)  
  72.                 {                     
  73.                     iTail = 0;            
  74.                 }  
  75.   
  76.   
  77.   
  78.   
  79.     }  
  80. }  
  81.   
  82.   
  83.   
  84.   
  85.   
  86.   
  87. int jiangmq_write(const char *r_path)  
  88. {  
  89.       
  90.     FILE *fp;  
  91.     int sizen;  /*实际读取的大小*/  
  92.     int tmp ;   /*标示实际要读取内容的大小*/  
  93.       
  94.     if(NULL == (fp = fopen(r_path , "w")))  
  95.     {  
  96.             printf("error: Can not open %s.\n",r_path);  
  97.               
  98.             pthread_exit((void *)1);  
  99.     }  
  100.   
  101.   
  102.     pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);   
  103.       
  104.       
  105.     while(1)  
  106.     {  
  107.   
  108.   
  109.         /*判断邮箱是否为空*/  
  110.         if((iHead == iTail) )   
  111.         {  
  112.             continue ;  
  113.         }  
  114.           
  115.   
  116.   
  117.         tmp=SIZE;  
  118.   
  119.   
  120.         /*当邮箱中可读内容不足标准大小*/  
  121.         if((iTail > iHead)&&((iTail-SIZE) < iHead))  
  122.         {  
  123.             p = iTail-iHead;  
  124.               
  125.         }  
  126.   
  127.   
  128.   
  129.   
  130.         /*把邮箱中内容写入文件中*/  
  131.         if((sizen = fwrite(cBuff+iHead,1, tmp,fp)) < 0)   
  132.         {  
  133.             fclose(fp);  
  134.               
  135.             pthread_exit((void *)2);  
  136.         }  
  137.           
  138.   
  139.   
  140.         /*读完邮箱一次 移动头指针*/  
  141.         iHead += sizen ;   
  142.   
  143.   
  144.   
  145.   
  146.         /*判断是否到邮箱尾部*/  
  147.         if(iHead > (MAX - SIZE))  
  148.         {  
  149.                 while(iTail == iHead){}  
  150.                   
  151.                 iHead = 0;  
  152.         }  
  153.           
  154.       
  155.           
  156.           
  157.     }  
  158. }  
  159.   
  160.   
  161.   
  162.   
  163. int main(int argc , char *argv[])  
  164. {  
  165.     int *value_ptr;  
  166.     pthread_t wtid,rtid;  
  167.       
  168.   
  169.   
  170.     /*初始化头尾指针*/  
  171.     iHead = 0;   
  172.     iTail = 0;  
  173.   
  174.   
  175.   
  176.   
  177.     if(argc != 3)  
  178.     {  
  179.             printf("error:please input two files name.\n");  
  180.             return -1;  
  181.     }  
  182.       
  183.     if(pthread_create(&rtid,NULL,(void *)jiangmq_write,argv[2]) != 0)  
  184.     {  
  185.             printf("error: Can not create jiangmq_write.\n");  
  186.             return -2;  
  187.     }  
  188.       
  189.   
  190.   
  191.     if(pthread_create(&wtid,NULL,(void *)jiangmq_read,argv[1]) != 0)  
  192.     {  
  193.             printf("error: Can not create jiangmq_read.\n");  
  194.             return -2;  
  195.     }  
  196.   
  197.   
  198.     /*等待线程读入结束*/      
  199.     pthread_join(wtid,(void **)&value_ptr);   
  200.       
  201.     /*终止写出线程*/  
  202.     pthread_cancel(rtid);  
  203.   
  204.   
  205.     printf(" over \n");  
  206.           
  207.     return 0;  
  208. }  

改进的全双工通信代码下载地址

http://download.csdn.net/detail/jmq_0000/4093546

用两个进程间分别又有两个线程通过共享内存操作


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值