io-进程/线程--理论+实操

1、创建一个分支线程,在主线程中拷贝文件的前一部分,主线程拷贝文件的后一部分

#include <051head.h>typedef struct{FILE* fp;FILE* fp1;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),args->fp);if(res<=0){break;}
// 使用实际读取的字节数进行写入fwrite(buf,1,res,args->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]="";// 创建线程参数(前半部分)Args args = {fp, fp1,n};pthread_t threadid;if(0 != pthread_create(&threadid,NULL,callback,&args)){perror("创建线程失败");fclose(fp);fclose(fp1);return -1;}// 主线程处理后半部分
// 等待子线程完成前半部分的复制pthread_join(threadid, 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,res,fp1);n1-=res;//exit(0);}printf("后半段打印完成\n");// 关闭文件fclose(fp);fclose(fp1);printf("文件复制完成\n");return 0;
}

输出结果:

2、解读代码

输出结果:
info1 from child process_1
info1 from parent process

3、解读代码, - 打印多少次

打印14次

思维导图