linux下c语言多线程拷贝文件出现问题,有时候会拷贝成功,有时候会失败,求原因 40

//用多线程拷贝一个文件#include<stdio.h>#include<pthread.h>#include<unistd.h>#include<sys/stat.h... //用多线程拷贝一个文件

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

#define NUM 10

char w[20];
char r[20];

void *funcpy(void *arg)
{
int i = (int)arg;
int ret;
int fdr,fdw;
if((fdr = open(r, O_RDONLY)) == -1)
{
perror("open r");
return;
}
if(-1 == (fdw = open(w, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)))
{
perror("open w");
return;
}

int allsize = lseek(fdr, 0, SEEK_END);
//偏移
int lseek1, lseek2;
lseek1 = lseek(fdr, allsize/NUM * i , SEEK_SET);
lseek2 = lseek(fdw, allsize/NUM * i , SEEK_SET);
printf("%d,%d\n",lseek1,lseek2);
//计算该线程要复制文件的大小
int writesize = allsize/NUM;
if(i+1 == NUM)
writesize += allsize % NUM;

int nread,nwrite;
char buf[20];
while(1)
{
//读取文件的数据到buf
nread = read(fdr, buf, 20);

writesize -= nread;
if(writesize <0)
nread += writesize;

//把buf中的数据写入文件
nwrite = write(fdw, buf, nread);
if(nwrite != nread)
{
perror("write");
return;
}

// printf("[%d]nread:%d,nwrite:%d,writesize:%d\n",i,nread,nwrite,writesize);
if(nread < 20)
break;

}
close(fdr);
close(fdw);
return (void *)0;
}

int main(int argc, char **argv)
{
if(argc != 3)
{
printf("Usage:%s <src> <dst>", argv[0]);
return -1;
}
strcpy(w, argv[2]);
strcpy(r, argv[1]);

pthread_t tid[NUM];
int i;
for(i=0; i<NUM; i++)
{
pthread_create(&tid[i], 0, funcpy, (void *)i);
}

for(i=0; i<NUM; i++)
{
pthread_join(tid[i], NULL);
}

return 0;
}
还是自己解决了,1每次打开写的文件都清空了,2循环读取的最后一个判断有点问题。ps:出现问题还是要靠自己。
展开
 我来答
战慷链
2016-11-06 · TA获得超过150个赞
知道答主
回答量:318
采纳率:33%
帮助的人:131万
展开全部
如果针对问的问题来说,可以考虑使用同步机制.可以查如mutex等同步机制.另外,我会建议你应该使用单一个服务程序,用缓存空间去接收要打印的讯息,单一控制输出萤幕,这样应该会比较好.因为萤幕输出只有一个,多线直接控制,本来就不好处理.如果采用传送讯息机制,应该就有顺序分别,不易产生问题.
追问
如果用mutex,在那个地方加锁、解锁
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式