Linux 编程题

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\n", 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!\n");
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!\n");
54     //对共享变量自加10次
55     for(i=0;i<10;i++)
56     {
57         mv++;
58     }
59     printf("pthread_Add 10 to num:%d\n",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\n!\n");
71     //对共享变量自减5次
72     for(i=0;i<5;i++)
73     {
74         mv--;
75     }
76     printf("pthread_Sub 5 to num:%d\n",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整除\n");
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\n",a[i]);
14     }
15     for(i=0;i<10;i++)
16     {
17         printf("%d ",a[i]);
18     }
19     printf("\n");
20     return 0;
21 }

 

posted @ 2019-07-11 18:20  小鱼儿的梦呓  阅读(1150)  评论(0编辑  收藏  举报