1. 产生一个进程树,父进程有2个子进程,这2个子进程分别又有2个子进程,每个进程休眠5秒后退出,并在退出前打印自己的进程id号。
1 # include<stdio.h> 2 # include<stdlib.h> 3 # include<unistd.h> 4 int main() 5 { 6 int reg,i; 7 for(i=0;i<2;i++) 8 { 9 reg=fork(); if(reg==0) break; 10 } 11 if(reg==0) 12 { 13 for(i=0;i<2;i++) 14 { 15 reg=fork(); 16 if(reg==0) break; 17 } 18 } 19 sleep(5); 20 printf("this is %d process ", getpid()); 21 }
2.设计一个程序,使用read函数从源文件sc1.dat读取数据,再用write函数写入到目标文件,目标文件名都由键盘输入。另外,输出目标文件的内容。
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<unistd.h> 4 #include<sys/types.h> 5 #include<sys/stat.h> 6 #include<fcntl.h> 7 #include<stdio.h> 8 int main() 9 { 10 int fdsrc,fddes,nbytes; 11 int flags=0_CREAT | 0_TRUNC | 0_WRONLY; 12 int z; 13 char buf[20],src[20],des[20]; 14 printf("请输入目标文件名:"); 15 scanf("%s",des); 16 fdsrc=open("sc1.dat",0_RDONLY); 17 if(fdsrc<0) 18 { 19 exit(1); 20 } 21 fddes=open(des,flags,0644); 22 if(fddes<0) 23 { 24 exit(1); 25 } 26 while((nbytes=read(fdsrc,buf,20))>0) //用read函数从源文件读数据 27 { 28 z=write(fddes,buf,nbytes);//用write函数写入到目标文件 29 if(z<0) 30 { 31 perror("写目标文件出错"); 32 } 33 } 34 close(fdsrc); 35 close(fddes); 36 printf("写入目标文件成功!"); 37 38 //输出目标文件内容 39 int i; 40 fddes=open(des,0_RDONLY); 41 if(fddes<0) 42 { 43 exit(1); 44 } 45 while((nbytes=read(fddes,buf,20))>0) 46 { 47 for(i=0;i<sizeof(buf);i++) 48 { 49 printf("%c",buf[i]); 50 } 51 } 52 close(fddes); 53 exit(0); 54 }
3.利用互斥锁pthread_mutex_t编写互斥访问临界资源的多线程程序。程序完成的功能要求:主函数初始化共享内存变量mv(初值为10),创建互斥锁,创建两个线程并等待两个线程执行完毕,之后输出mv的值并释放互斥锁;两个线程分别实现通过获取互斥锁的方式完成对内存变量mv自加10次和自减5次的功能。
1 #include<stdlib.h> 2 #include<stdio.h> 3 #include<pthread.h> 4 #include<errno.h> 5 6 //共享内存变量mv 7 int mv=10; 8 //创建互斥锁 9 pthread_mutex_t mutex; 10 //线程服务程序 11 static void pthread_funAdd(void);//做加法 12 static void pthread_funSub(void);//做减法 13 //主函数 14 int main(void) 15 { 16 //线程标识符 17 pthread_t pt_Add=0; //加操作线程 18 pthread_t pt_Sub=0; //减操作线程 19 int ret=0; 20 //初始化互斥量 21 pthread_mutex_init(&mutex,NULL); 22 //分别创建线程Add、Sub 23 ret=pthread_create(&pt_Add, //线程标识符指针 24 NULL, //默认属性 25 (void*)pthread_funAdd, //运行加操作 26 NULL); //无参数 27 if(ret != 0) 28 { 29 perror("pthread_Add_create"); 30 } 31 32 ret=pthread_create(&pt_Sub, //线程标识符指针 33 NULL, //默认属性 34 (void*)pthread_funSub, //运行减操作 35 NULL); //无参数 36 if(ret != 0) 37 { 38 perror("pthread_Sub_create"); 39 } 40 //等待线程Add、Sub结束 41 pthread_join(pt_Add,NULL); 42 pthread_join(pt_Sub,NULL); 43 printf("main program exit! "); 44 return 0; 45 } 46 47 //线程Add的服务程序 48 static void pthread_funAdd(void) 49 { 50 int i=0; 51 pthread_mutex_lock(&mutex); //获取互斥锁 52 sleep(1); 53 printf("This is pthread_Add! "); 54 //对共享变量自加10次 55 for(i=0;i<10;i++) 56 { 57 mv++; 58 } 59 printf("pthread_Add 10 to num:%d ",mv); 60 pthread_mutex_unlock(&mutex); //释放互斥锁 61 pthread_exit(NULL); 62 } 63 64 //线程Sub的服务程序 65 static void pthread_funSub(void) 66 { 67 int i=0; 68 pthread_mutex_lock(&mutex); //获取互斥锁 69 sleep(1); 70 printf("This is pthread_Sub ! "); 71 //对共享变量自减5次 72 for(i=0;i<5;i++) 73 { 74 mv--; 75 } 76 printf("pthread_Sub 5 to num:%d ",mv); 77 pthread_mutex_unlock(&mutex); //释放互斥锁 78 pthread_exit(NULL); 79 }
4.编程实现随机产生10个100以内的整数,并输出其中能被7整除的数。并为其编写一个Makefile文件。(两种方法)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<math.h> 4 //主函数 5 int main() 6 { 7 int i,j; 8 for(i=0;i<10;i++) 9 { 10 j=1+(int)(100.0*rand()/(RAND_MAX+1.0)); 11 if(j%7==0) 12 { 13 printf("%d能被7整除 "); 14 } 15 } 16 } 17 18 MakeFile文件: 19 testrand:main.o 20 gcc main.o -o testrand 21 main.o:main.c 22 gcc main.c -o main.o
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 int main() 6 { 7 int a[10],i; 8 srand((unsigned int)time(NULL)); 9 for(i=0;i<10;i++) 10 { 11 a[i]=rand()%100+1; 12 if(a[i]%7==0) 13 printf("ok :%d ",a[i]); 14 } 15 for(i=0;i<10;i++) 16 { 17 printf("%d ",a[i]); 18 } 19 printf(" "); 20 return 0; 21 }