IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    聂文龙发表于 2015-05-03 15:44:00
    love 0

    邮箱通讯

    声明以下全局变量

    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

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



    聂文龙 2015-05-03 23:44 发表评论


沪ICP备19023445号-2号
友情链接