linux多线程读写硬盘,Linux 多线程文件读写操作 +实例

#include #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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值