01.思维导图
02.创建一个分支线程,在主线程中拷贝文件的前一部分,主线程拷贝文件的后一部分
#include <25051head.h>
void* callback(void *arg)
{off_t size=*(off_t*)arg;//打开一个文件读//打开一个文件写int fd_r2=open("./my.txt",O_RDONLY);int fd_w2=open("./my2.txt",O_WRONLY|O_CREAT|O_TRUNC,0777);if(fd_r2==-1||fd_w2==-1){printf("open_error2");}//分支线程拷贝lseek(fd_r2,size/2,SEEK_SET);lseek(fd_w2,size/2,SEEK_SET);char buf;for(int i=size/2;i<size;++i){read(fd_r2,&buf,1);write(fd_w2,&buf,1);}printf("子线程后半部分拷贝结束..\n");//关闭文件描述符close(fd_r2);close(fd_w2);//结束调用者线程pthread_exit(NULL);}int main(int argc, const char *argv[])
{//打开一个文件读//打开一个文件写int fd_r=open("./my.txt",O_RDONLY);int fd_w=open("./my2.txt",O_WRONLY|O_CREAT|O_TRUNC,0777);if(fd_r==-1||fd_w==-1){ERRLOG("open_error");}//计算文件大小off_t size=lseek(fd_r,0,SEEK_END);//创建线程pthread_t threadid;if(0!=(errno=pthread_create(&threadid,NULL,callback,&size))){ERRLOG("pthread_create_error");}printf("threadid=%ld pthread_create_success..\n",threadid);//设置分离态//pthread_detach(threadid);//设置几秒钟分支线程去死sleep(3);//设置不阻塞pthread_join(threadid,NULL);//主线程拷贝lseek(fd_r,0,SEEK_SET);lseek(fd_w,0,SEEK_SET);//循环读取size/2次,每次读取一个字符char buf;for(int i=0;i<size/2;++i){read(fd_r,&buf,1);write(fd_w,&buf,1);}printf("前半部分拷贝结束..\n");//关闭文件描述符close(fd_r);close(fd_w);return 0;
}
03.解读代码
#include <25051head.h>
int main(int argc, const char *argv[])
{pid_t pid1,pid2;if((pid1=fork())==0)//子进程1{printf("info1 from child process_1\n");sleep(1);printf("info2 from child process_1");_exit(0);}else//主线程或者错误<0||>0{if((pid2=fork())==0)//子线程2{ sleep(4);printf("info from child process_2");fflush(stderr);_exit(0);}else{//主线程或者错误<0||>0 wait(NULL);printf("info1 from parent process\n");exit(0);}}return 0;
}
输出结果:
info1 from child process_1
info1 from parent process
解析过程:
04.解读代码, - 打印多少次
#include <25051head.h>
int main(int argc, const char *argv[])
{for(int i=0;i<3;i++){fork();printf("打印次数%d:",i);printf("-\n"); }return 0;
}
输出结果:打印次数为:14
解析过程:
- 第一次循环(i = 0):
主进程调用 fork(),创建一个子进程。此时有 2 个进程,每个进程都会执行后续的 printf 语句,所以打印 2 次。- 第二次循环(i = 1):
上一步的 2 个进程各自调用 fork(),创建 2 个子进程,此时共有 4 个进程,每个进程都会执行后续的 printf 语句,所以打印 4 次。- 第三次循环(i = 2):
上一步的 4 个进程各自调用 fork(),创建 4 个子进程,此时共有 8 个进程,每个进程都会执行后续的 printf 语句,所以打印 8 次。