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 次。