linux系统编程试卷(答案)-.pdf

上传人:索**** 文档编号:76260602 上传时间:2023-03-08 格式:PDF 页数:9 大小:51.85KB
返回 下载 相关 举报
linux系统编程试卷(答案)-.pdf_第1页
第1页 / 共9页
linux系统编程试卷(答案)-.pdf_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《linux系统编程试卷(答案)-.pdf》由会员分享,可在线阅读,更多相关《linux系统编程试卷(答案)-.pdf(9页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、凌阳教育嵌入式培训系统编程部分测试试题注:考试为闭卷,程序题需上机操作运行出结果,考试时间为120 分钟一:选择题(本题共4 小题,每题3 分共 12 分)1)下列不是Linux 系统进程类型的是(D)A 交互进程B 批处理进程C 守护进程D 就绪进程(进程状态)2)以下对信号的理解不正确的是(B)A 信号是一种异步通信方式B 信号只用在用户空间进程通信,不能和内核空间交互C 信号是可以被屏蔽的D 信号是通过软中断实现的3)进程有三种状态(C)A 准备态、执行态和退出态B 精确态、模糊态和随机态C 运行态、就绪态和等待态D 手工态、自动态和自由态4)不是进程和程序的区别(B)A 程序是一组有序

2、的静态指令,进程是一次程序的执行过程B 程序只能在前台运行,而进程可以在前台或后台运行C 程序可以长期保存,进程是暂时的D 程序没有状态,而进程是有状态的二:填空题(本题共6 小题,2)、3)两题每空四分,其余每空一分。共23 分)1)列举八种常见的进程间通信方式无名管道、有名管道、消息队列、信号量、共享内存、信号、套接字网络上两个主机的进程间通信方式为套接字2)命名管道比无名管道的优势提供了一个可以访问的路径名,实现没亲缘关系的进程间通信3)消息队列比命名管道和无名管道的优势可以按类型实现消息的随机查询,没必要先进先出4)按照逻辑结构不同进行数据库划分,Sqlite 数据库属于哪一类关系型数

3、据库5)在 C 语言中操作sqlite数据库,常用的2 中方式是sqlite_exec(回调)、sqlite_gettable(非回调)6)列举四种进程调度算法先来先调度(FCFS)、短进程优先调度(SPF)、高优先级调度(HPF)、时间片轮转调度三:问答题(本题共7 题,每题5 分,共 35 分)1)什么是系统调用?系统调用是通过什么方式陷入内核态的?请写出你对系统调用的理解。什么是文件I/O 和标准 I/O 库?文件I/O 和标准 I/O 库的区别?系统调用是指操作系统提供给用户程序调用的一组特殊接口,用户程序可以通过这组接口获得操作系统内核提供的服务。系统调用是通过软件中断方式陷入内核的

4、linux的文件 I/O 是由操作系统提供的基本IO 服务,标准 I/O 库通过封装系统调用,提供了一个到底层I/O 的接口。标准 I O默认采用了缓冲机制,还创建了一个包含文件和缓冲区相关数据的数据结构;文件 I/O 一般没有采用缓冲模式,需要自己创建缓冲区。一种是标准库封装系统调用而成,更高级,一种是系统提供的,比较低级;标准I O可移植性高、文件I/O 可移植性低。2)什么是进程?用fork()创建一个子进程时,系统会做什么工作进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的单位,不仅是系统内部独立运行的实体也是独立竞争资源的实体。用 fork()时系统会分

5、配子进程一个ID 号 然后继承父进程的地址空间,包括进程上下文进程堆栈打开的文件描述符等等,他就是父进程的一个复制品。3)进程和线程有什么区别?每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在进程程中,由进程提供多个线程执行的控制。进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是 CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可

6、以并发执行。4)什么是线程的互斥和同步,程序应怎样写才能达到互斥或同步?互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。在写程序时可以用互斥锁和信号量实现线程同步,一个线程访问共享资源时给这个资源上锁其他线程就不能访问了直到上锁的进程释放互斥锁为止。5)什么是僵尸进程?孤儿进程?守护进程?僵尸进程:僵尸进程是指它的父进程已

7、经退出(父进程没有等待(调用 wait/waitpid)它),而该进程dead 之后没有进程接受,就成为僵尸进程,也就是(zombie)进程。孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。守护进程:是指在UNIX或其他多任务操作系统中在后台执行的电脑程序,并不会接受电脑用户的直接操控。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。通常,守护进程没有任何存在的父进程(即PPID=1),且在 UN

8、IX系统进程层级中直接位于init之下。守护进程程序通常通过如下方法使自己成为守护进程:对一个子进程调用fork,然后使其父进程立即终止,使得这个子进程能在init下运行。这种方法通常被称为“脱壳”6)有 3 个线程:A、B、C,现要求 A 先执行,然后B 再执行,最后C 再执行,之后A-B-C 循环执行,请说出大体的思路?创建 3 个信号量sem_A、sem_B、sem_C,分别用来给A、B、C 3 个线程,启动sem_A信号量的初始值为1,其余 2 个信号量初始值为0,当主线程创建3 个子线程后,因为sem_A的值大于0,所以只有A线程执行相关的代码,B、C线程堵塞在对sem_B、sem_

9、C信号量的p 操作;当 A线程执行完相应的代码后,给sem_B信号量加1,之后 B线程开始执行相关操作,在此时 A线程堵塞在对sem_A信号量的p 操作,C线程继续堵塞;当B线程执行完毕相关操作后,给sem_C进行 V操作,B线程堵塞,C线程执行相关操作;以上是从 A-B-C 线程执行的流程.7)exit()、_exit()和 return()的区别?exit():结束当前的进程,并且会刷新缓存区,关闭没有关闭的文件等_exit():结束当前的进程,不对缓存区刷新return:1:在 main 函数中会结束当前进程2:在子函数中,会返回调用当前函数的调用位置,进程从下个C语句开始执行四:程序题

10、(本小题共3 题,每题10 分 共 30 分)1)用多线程、信号量实现生产者和消费者的模拟,仓库容量为10,仓库中开始有3件产品,消费者每3 秒消费一件产品,生产者每两秒生产一个产品,生产者和消费者不能同时进入仓库(需要互斥)/信号量-线程间通信/“生产者消费者”问题#include#include#include#include#include#define msleep(x)usleep(x*1000)#define PRODUCT_SPEED 3/生产速度#define CONSUM_SPEED 1/消费速度#define INIT_NUM 3/仓库原有产品数#define TOTAL_

11、NUM 10/仓库容量sem_t p_sem,c_sem,sh_sem;int num=INIT_NUM;void product(void)/生产产品 sleep(PRODUCT_SPEED);int add_to_lib()/添加产品到仓库 num+;/仓库中的产品增加一个msleep(500);return num;void consum()/消费 sleep(CONSUM_SPEED);int sub_from_lib()/从仓库中取出产品 num-;/仓库中的产品数量减一msleep(500);return num;void*productor(void*arg)/生产者线程 whi

12、le(1)sem_wait(&p_sem);/生产信号量减一product();/生产延时sem_wait(&sh_sem);/这个信号量是用来互斥的printf(push into!tatol_num=%dn,add_to_lib();sem_post(&sh_sem);sem_post(&c_sem);/消费信号量加一 void*consumer(void*arg)/消费者线程 while(1)sem_wait(&c_sem);/消费者信号量减一sem_wait(&sh_sem);printf(pop out!tatol_num=%dn,sub_from_lib();sem_post(&s

13、h_sem);sem_post(&p_sem);/生产者信号量加一consum();/消费延时 int main()pthread_t tid1,tid2;sem_init(&p_sem,0,TOTAL_NUM-INIT_NUM);sem_init(&c_sem,0,INIT_NUM);sem_init(&sh_sem,0,1);pthread_create(&tid1,NULL,productor,NULL);pthread_create(&tid2,NULL,consumer,NULL);pthread_join(tid1,NULL);pthread_join(tid2,NULL);ret

14、urn 0;2)编写一个多线程的程序:要求:1、创建 2 个子线程,主进程要传递3 个参数给线程1,传递另一个参数给线程2;2、线程 1、线程 2 中对每个传给线程的参数加1,等线程都执行完毕后,进程打印出四个参数的值。3、传给线程1 参数的值必需要能够改变,传给线程2 参数的值必需不能改变#include#include#include typedef struct int A;int B;int C;DATA;/*传参方法1*/void*thread_1(void*arg)DATA*rec;sleep(1);rec=(DATA*)arg;rec-A+=1;rec-B+=1;rec-C+=1

15、;return NULL;/*传参方法2*/void*thread_2(void*arg)int rec=0;sleep(1);rec=(int)(arg);rec+;return NULL;int main(int argc,char*argv)pthread_t tid1,tid2;DATA test;int D=100;test.A=100;test.B=100;test.C=100;/*创建两个线程*/pthread_create(&tid1,NULL,(void*)thread_1,(void*)(&test);pthread_create(&tid2,NULL,(void*)thr

16、ead_2,(void*)D);pthread_join(tid1,NULL);pthread_join(tid2,NULL);printf(A=%dn,test.A);printf(B=%dn,test.B);printf(C=%dn,test.C);printf(D=%dn,D);return 0;3)编制一段程序,实现进程的管道通信:使用系统调用pipe()建立一条管道线,2 个子进程 分别向管道各写一句话:Child process 1 is sending a message!Child process 2 is sending a message!而父进程则从管道中读出来自于2个子

17、进程的信息,显示在屏幕上。要求:父进程先接收子进程P1发来的消息,然后再接收子进程P2发来的消息。#include#include#include#include int main(int argc,char*argv)int fd2;pid_t pid;pid_t pid_sec;char buf7;pipe(fd);if(pid=fork()0)printf(fork error!);exit(1);else if(pid=0)close(fd0);write(fd1,first1,7);close(fd1);exit(0);else if(pid_sec=fork()0)printf(fork second error!);exit(1);else if(pid_sec=0)close(fd0);write(fd1,Child1,7);close(fd1);exit(0);else wait(0);close(fd1);read(fd0,buf,7);printf(%sn,buf);wait(0);close(fd1);read(fd0,buf,7);close(fd0);printf(%sn,buf);exit(0);return 0;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 实施方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com