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