io-进程/线程--理论+实操
1、创建一个分支线程,在主线程中拷贝文件的前一部分,主线程拷贝文件的后一部分
#include <25051head.h>typedef struct{FILE* fp;FILE* fp1;int start_pos;int size;
}Args;//从指定位置开始复制指定大小的数据
void* callback(void* arg)
{Args* args=(Args*)arg;char buf[128]="";int n=args->size;// 设置文件指针到起始位置fseek(args->fp,0,SEEK_SET); fseek(args->fp1,0,SEEK_SET);while(n>0){size_t res=fread(buf,1,(n<sizeof(buf))? n:sizeof(buf),fp);if(res<=0){break;}
// 使用实际读取的字节数进行写入fwrite(buf,1,res,fp1);n-=res;} printf("前半段打印完成\n");pthread_exit(NULL);
}int main(int argc, const char *argv[])
{FILE* fp=fopen("my.txt","r");if(NULL==fp){ERRLOG("fopen error..\n");}// 获取文件大小fseek(fp,0,SEEK_END);int num=ftell(fp);int n=num/2;FILE* fp1=fopen("my1.txt","w+");if(NULL==fp1){ERRLOG("fopen error..\n"); }char buf[128]="";// 创建线程参数(前半部分)// ThreadArgs args = {fp, fp1, 0, n};pthread_t threadid;if(0 != (errno= pthread_create(&threadid,NULL,callback,&args))){perror("创建线程失败");fclose(fp);fclose(fp1);pthread_exit(NULL);}// 主线程处理后半部分
// 等待子线程完成前半部分的复制pthread_join(thread, NULL);fseek(fp,n,SEEK_SET);fseek(fp1,n,SEEK_SET);int n1=num-n;char buf[128]="";while(n1>0){size_t res=fread(buf,1,(n1<sizeof(buf))? n1:sizeof(buf),fp);if(res<=0){break;}fwrite(buf,1,n1,fp1);n1-=res;//exit(0);}printf("后半段打印完成\n");// 关闭文件fclose(fp);fclose(fp1);printf("文件复制完成\n");return 0;
}
2、解读代码
输出结果:
info1 from child process_1
info1 from child process_2
info1 from parent process
3、解读代码, - 打印多少次
打印14次
思维导图