1、要求用两个线程拷贝一张图片,A线程拷贝前半部分,B线程拷贝后半部分,不允许使用sleep函数。
一、两个线程分别创建创建两个流指针,完成复制
二(未完成)、主线程创建一个只读流指针打开目标文件,把只读流指针传递给子线程,阻塞等待子线程返回,子线程拷贝前半部分(w+),拷贝结束后主线程不用偏移即可拷贝后半部分(a+)。
程序代码
9 {
10 FILE *fp1=fopen("./2023-02-14 10-49-42 的屏幕截图.png","r");
11 if(NULL==fp1)
12 {
13 perror("open");
14 }
15 FILE *fp2=fopen("./copy_pic.png","w");
16 if(NULL==fp2)
17 {
18 perror("open");
19 }
20 struct stat pp;
21 if(stat("./2023-02-14 10-49-42 的屏幕截图.png",&pp))
22 {
23 perror("stat");
24 }
25 int size=pp.st_size;
26 int flag=size%2;
27 char arr[32]="";
28 char a;
29 int i;
30 for(i=0;i<size/2;i++)
31 {
32 a=fgetc(fp1);
33 fputc(a,fp2);
34 }
35
36 fclose(fp1);
37 fclose(fp2);
38 printf("子线程前半部分打印完成\n");
39 pthread_exit(NULL);
40 }
41
42 int main(int argc, const char *argv[])
43 {
44 //创建子线程
45 //子线程拷贝前半部分,拷贝完成后返回给主线程
46 pthread_t ttid;//保存子线程的tid号
47 if(pthread_create(&ttid,NULL,callBack,NULL)!=0)
48 {
49 fprintf(stderr,"pthread_creat failed __%d__",__LINE__);
50 return -1;
51 }
52 //主线程,阻塞等待子线程拷贝完成后拷贝后半部分
53 pthread_join(ttid,NULL);
54
55 FILE *fp1=fopen("./2023-02-14 10-49-42 的屏幕截图.png","r");
56 if(NULL==fp1)
57 {
58 perror("open");
59 return -1;
60 }
61 FILE *fp2=fopen("./copy_pic.png","a+");
62 if(NULL==fp2)
63 {
64 perror("open");
65 return -1;
66 }
67 struct stat pp;
68 if(stat("./2023-02-14 10-49-42 的屏幕截图.png",&pp))
69 {
70 perror("stat");
71 return -1;
72 }
73
74 int size=pp.st_size;
75
76 int flag=size%2;
77 fseek(fp1,size/2,SEEK_SET);
78
79 fseek(fp2,size/2,SEEK_SET);
80
81 char b;
82 int i;
83
84 for(i=size/2+flag;i<=size;i++)
85 {
86 b=fgetc(fp1);
87 fputc(b,fp2);
88 }
89
90
91 printf("主线程后半部分打印完成\n");
92 fclose(fp1);
93 fclose(fp2);
94 return 0;
95 }
~
~
运行结果
ubuntu@ubuntu:作业$ gcc copy_pic_doubleline.c -pthread
ubuntu@ubuntu:作业$ ./a.out
子线程前半部分打印完成
主线程后半部分打印完成
ubuntu@ubuntu:作业$ diff 2023-02-14\ 10-49-42\ 的屏幕截图.png copy_pic.png