2023/3/1日作业

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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

malingshu404

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值