winston 发表于 2012-2-24 14:56:51

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

邮箱通讯

声明以下全局变量
char cBuff;   //邮箱
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 64                /*每次读取大小*/

char cBuff;
int iHead;
int iTail;

int xxx_write(const char *w_path)
{

        FILE *w_fp;       
        int sizen;        /*实际读取大小*/
        int i;

        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 + 1))   /*判断邮箱是否为空*/
                {
                        continue ;
                }
               
                if((MAX - iTail) < SIZE)
                {
                        iTail = 0;
                        iHead = -1;
                }
               
                if((sizen = fread(cBuff+iTail,1,SIZE,w_fp)) == 0)/*读出数据并写入邮箱?/
                {
                                fclose(w_fp);
                       
                                pthread_exit((void *)2);
                }
       
                iTail += sizen; /*移动尾指针*/
                               
        }
       
       
}



int xxx_read(const char *r_path)
{
        FILE *fp;
        int i,j;
       
        if(NULL == (fp = fopen(r_path , "at+")))
        {
                        printf("error: Can not open %s.\n",r_path);
                       
                        pthread_exit((void *)1);
        }
               
        pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);       
       
        while(1)
        {
                if((iHead + 1) == iTail) /* 判读邮箱中是否有数据*/
                {
                        continue ;
                }
       
       
                if(fwrite(cBuff+iHead+1,1, (iTail - iHead ),fp) < 0) /*读出数据并写入另一个文件*/
                {
                        fclose(fp);
                       
                        pthread_exit((void *)2);
                }
               

                iHead = iTail - 1;/*移动头指针/
               
        }
}


int main(int argc , char *argv[])
{
        int *value_ptr;
            pthread_t wtid,rtid;
       
        iHead = MAX - 1; /*初始化头尾指针*/
        iTail = 0;

        if(argc != 3)
        {
                        printf("error:please input two files name.\n");
                        return -1;
        }
       
        if(pthread_create(&wtid,NULL,(void *)xxx_write,argv) != 0)
        {
                        printf("error: Can not create xxx_write.\n");
                        return -2;
        }
       

        if(pthread_create(&rtid,NULL,(void *)xxx_read,argv) != 0)
        {
                        printf("error: Can not create xxx_read.\n");
                        return -2;
        }

        pthread_join(wtid,(void **)&value_ptr); /*等待读线程结束*/
       
        pthread_cancel(rtid);

        printf(" over \n");
       
       
        return 0;
}


作者:jmq_0000 发表于2012-2-24 12:56:28 原文链接

页: [1]
查看完整版本: Linux 多线程文件读写操作 +实例