2023/3/30作业

1、1.标准IO函数时候讲解的时钟代码,要求输入quit字符串后,结束进程

程序代码

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<time.h>
  4 #include<string.h>
  5 #include<stdlib.h>
  6 #include<unistd.h>
  7 void *callBack(void *arg)
  8 {
  9     time_t Time;
 10     struct tm *info=NULL;
 11 
 12     while(1)
 13     {
 14         system("clear");
 15         if(time(&Time) < 0)
 16         {
 17             perror("time");
 18             return NULL;
 19         }
 20         else
 21         {
 22             info = localtime(&Time);
 23             printf("%d年%d月%d日 %d:%d:%d\n",info->tm_year,info->tm_mon,info->tm_yday,info->tm_hour\                                                     
 24                     ,info->tm_min,info->tm_sec);
 25         }
 26         sleep(1);
 27     }
 28 
 29 }
 30 
 31 int main(int argc, const char *argv[])
 32 {
 33     pthread_t pid;
 34     pthread_create(&pid,NULL,callBack,NULL);
 35 
 36     while(1)
 37     {
 38         char arr[30];
 39         fscanf(stdin,"%s",arr);
 40         if(strcmp(arr,"quit") == 0)
 41             break;
 42         else
 43             fprintf(stdout,"请重新输入\n");
 44     }
 45     return 0;
 46 }
~                       

运行结果

123年2月88日 20:15:2
uit
ubuntu@ubuntu:线程$ 

2、要求定义一个全局变量char buf[]="1234567",创建两个线程,不考虑退出条件。
a.A线程循环打印buf字符串,
b.B线程循环倒置buf字符串,即buf中本来存储1234567,倒置后buf中存储7654321.不打印!!c.倒置不允许使用辅助数组。
d.要求A线程打印出来的结果只能为1234567或者7654321不允许出现7634521 7234567e.不允许使用sleep函数

程序代码

  1 #include <stdio.h>
  2 #include<pthread.h>
  3 #include<unistd.h>
  4 
  5 int flag=0;
  6 char buf[]={"1234567"};
  7 void *callBack(void *arg)
  8 {
  9     while(1)
 10     {
 11         if(1 == flag)
 12         {
 13             fprintf(stdout,"%s\n",buf);
 14         }
 15         flag = 0;
 16     }
 17 }
 18 
 19 void main()
 20 {
 21     pthread_t pid;
 22     int *b=NULL;
 23     if(pthread_create(&pid,NULL,callBack,&b)!=0)
 24     {
 25         printf("create failed\n");                                                                                                                       
 26         return ;
 27     }
 28 
 29     char i,j;
 30     while(1)
 31     {
 32         if(0 == flag)
 33         {
 34             for(i=0,j=6;i<j;i++,j--)
 35             {
 36                 buf[i]=buf[i]+buf[j];
 37                 buf[j]=buf[i]-buf[j];
 38                 buf[i]=buf[i]-buf[j];
 39             }
 40             flag = 1;
 41         }
 42     }
 43 }
~               

运行结果

ubuntu@ubuntu:线程$ gcc daoxv.c -pthread
ubuntu@ubuntu:线程$ ./a.out 
7654321
1234567
1234567
7654321
7654321
1234567
1234567
7654321
7654321
1234567
1234567
7654321
1234567
1234567
7654321
1234567

3、要求用两个线程拷贝一张图片。A线程拷贝前半部分,B线程拷贝后半部分,不允许使用sleep函数

程序代码

  1 #include<stdio.h>
  2 #include<pthread.h>
  3 #include<sys/types.h>
  4 #include<sys/stat.h>
  5 #include<fcntl.h>
  6 #include<unistd.h>
  7 
  8 //定义一个结构体,用于保存打开的文件描述符以及文件中间位置
  9 struct pic
 10 {
 11     int read_fp;
 12     int write_fp;
 13     off_t num;
 14 };
 15 
 16 //子线程打印后半部分
 17 void *callBack(void *arv)
 18 {
 19     char a;
 20     ssize_t size;
 21 
 22     //判断文件是否打印到中间位置
 23     //如果打印到中间位置,则子线程开始打印
 24     while((*(struct pic *)arv).num != lseek((*(struct pic*)arv).read_fp,0,SEEK_CUR));
 25 
 26     //开始打印
 27     while(1)
 28     {
 29         size=read((*(struct pic*)arv).read_fp,&a,1);
 30         if(size < 0)
 31         {
 32             perror("read");
 33             return NULL;
 34         }
 35         else if(size > 0)
 36         {
 37             size=write((*(struct pic*)arv).write_fp,&a,1);
 38             if(size < 0)
 39             {
 40                 perror("write");
 41                 return NULL;
 42             }
 43         }
 44         else if(size == 0)
 45         {
 46             printf("后半部分打印完毕\n");
 47             break;
 48         }
 49     }
 50     pthread_exit(NULL);
 51 }
 52 
 53 
 54 
 55 int main(int argc, const char *argv[])
 56 {
 57     //创建一个结构体
 58     struct pic pic1;
 59 
 60     //打开文件并将相关信息写入结构体
 61     pic1.read_fp=open("./2023-02-14 10-49-42 的屏幕截图.png",O_RDONLY);
 62     pic1.write_fp=open("./1.png",O_WRONLY|O_TRUNC|O_CREAT,0664);
 63     //找到文件中间位置并保存在结构体中
 64     pic1.num= lseek(pic1.read_fp,0,SEEK_END)/2;
 65     //修改文件偏移量到开头位置
 66     lseek(pic1.read_fp,0,SEEK_SET);
 67 
 68 
 69     //创建子线程并将结构体传入子线程
 70     pthread_t pid;
 71     pthread_create(&pid,NULL,callBack,&pic1);
 72 
 73     char a;
 74     ssize_t size;
 75     //主线程打印前半部分
 76     while(1)
 77     {
 78         size=read(pic1.read_fp,&a,1);
 79         if(size < 0)
 80         {
 81             perror("read");
 82             return 0;
 83         }
 84         else if(size > 0)
 85         {
 86         printf("%c",a);
 87             if(write(pic1.write_fp,&a,1) < 0)
 88             {
 89                 perror("write");
 90                 return 0;
 91             }
 92         }
 93         if(pic1.num == lseek(pic1.read_fp,0,SEEK_CUR))
 94         {
 95             printf("前半部分打印完毕\n");
 96             break;
 97         }
 98     }
 99 
100     //阻塞等待子进程后半部分打印完成
101     pthread_join(pid,NULL);
102     return 0;                                                                                                                                                                                                                                                                                                                                                               
103 }
~                                                                                                                                                                                                                                                                                                                                                                               
~                                               

运行结果

ubuntu@ubuntu:线程$ gcc copy_pthread.c -pthread
ubuntu@ubuntu:线程$ ./a.out 
前半部分打印完毕
后半部分打印完毕
ubuntu@ubuntu:线程$ ls -l
总用量 912
-rw-rw-r-- 1 ubuntu ubuntu 449749 三月 30 20:11  1.png
-rw-rw-r-- 1 ubuntu ubuntu 449749 三月 30 18:46 '2023-02-14 10-49-42 的屏幕截图.png'
-rwxrwxr-x 1 ubuntu ubuntu  12856 三月 30 20:11  a.out
-rw-rw-r-- 1 ubuntu ubuntu    726 三月 30 17:26  clock_pthread.c
-rw-rw-r-- 1 ubuntu ubuntu   1934 三月 30 20:11  copy_pthread.c
-rw-rw-r-- 1 ubuntu ubuntu    529 三月 30 18:43  daoxv.c
-rw-rw-r-- 1 ubuntu ubuntu    687 三月 30 15:10  huahua.c
ubuntu@ubuntu:线程$ diff 1.png 2023-02-14\ 10-49-42\ 的屏幕截图.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、付费专栏及课程。

余额充值