嵌入式应用开发期末练习题624.pdf

上传人:深夜****等你... 文档编号:84176901 上传时间:2023-04-04 格式:PDF 页数:18 大小:608.73KB
返回 下载 相关 举报
嵌入式应用开发期末练习题624.pdf_第1页
第1页 / 共18页
嵌入式应用开发期末练习题624.pdf_第2页
第2页 / 共18页
点击查看更多>>
资源描述

《嵌入式应用开发期末练习题624.pdf》由会员分享,可在线阅读,更多相关《嵌入式应用开发期末练习题624.pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第 1 页 一、填空题 1、linux 中,对 串 口 参 数 进 行 配 置 的 数 据 结 构 名 是 _termios_。2、gcc 的编译流程分为 4 个步骤:预处理、_编译_、汇编、_链接_。3、获取当前进程 ID 的方法是 _getpid()_。4、对文件的打开操作有 open 与 fopen,它们哪个是标准库函数 _fopen()_它的返回值是 _指向 FILE 的指针_。5、一个由 c 语言占用的内存分为代码区与数据区,数据区又可以分为 _静态数据区_与动态数据区,动态数据区分为堆、_栈_。6、linux 的管道通信可以分为匿名管道、_有名管道_与 _标准管道_。7、linux

2、 中的网络编程是通过套接字接口来进行的,常见的套接字有三种类型:_流式套接字_、_数据报套接字_与 _原始套接字_。8、在 linux 中,用户空间的进程可以直接通过 _系统调用_来获取操作系统内核提供的服务。9、linux 中,对串口进行操作的函数中,激活串口配置的函数是 _tcsetattr()_。第 2 页 10、linux 中使用较多的进程间通信方式包括管道、信号、信号量、_消息队列_、_共享内存_。11、makefile 规则是 make 进行处理的依据,它包括了 _依赖文件_、_目标体_及其之间的命令语句。12、互斥锁与信号量为 linux 中的线程同步机制,其中 _信号量_适合于

3、同时可用的资源为多个的情况。13、系统调用分为进程控制、进程间通信、文件系统管理、系统管理、存储管理、网络管理、socket 管理、用户管理等。14、终端分为 3 种模式规范模式、非规范模式与原始模式 二、选择题 1.下面关于 linux 下串口操作正确的描述是【C 】A串口的奇偶校验必须使能 B 不能通过 linux api设置串口的停止位 C 串口配置好后,其读写操作与普通文件就是一样的了 D串口文件可以通过 lseek 改变读写指针 2.下列关于 makefile 说法错误的是【B 】A.创建目标体的命令必须以制表符开头 B.makefile 变量名可以包含“#”字符串 C.makefi

4、le变量对大小写敏感 D.“-C dir”表示读入指定目录 dir 下的 makefile 3.下列关于 linux 多线程编程不正确的是【D】第 3 页 A.不同进程的线程间不能用信号量来同步;B.pthread线程库符合 POSIX 接口;C.必须包含头文件 pthread.h;D.phtread_join()作用是将参数中的指定线程挂起;4.下列关于 linux 网络编程不正确的说法是【C 】A.send()既可用在 tcp 中,也可用在 udp 中;B.sendto()既可用在 tcp 中,也可用在 udp 中;C.不管是客户端还是服务器端必须调用bind;D.每一个 socket 都

5、用一个半相关描述本地地址、本地端口 5.从文件描述符 fd 中读出 200 个字节到首地址为 buff 的缓冲区的正确底层 IO 操作是【B 】A.read(buff,200,fd);B.read(fd,buff,200);C.read(fd,200,buff);D.read(200,buff,fd);6.使用下面哪条命令可以查询目标文件所依赖的动态链接库。【B 】A.nm;B.readelf;C.ld;D.objcopy 7.下面关于 linux 进程控制不正确的描述的是【A 】A.wait()调用一定会使得父进程阻塞 第 4 页 B.exit()会清理 IO 缓冲,而_exit()不会清理

6、 IO 缓冲 C.在执行 execl 函数后,原调用进程的内容除了进程号外,其他全部被新的进程替换了 D.fork()的返回值在父子进程中是不一样的 8.将 max.c 生成动态链接库的正确命令是。【B 】A.gcc c max.c B.gcc -fpic shared o libmax.so max.c C.gcc o libmax.so max.c D.gcc static o libmax.so max.c 9.下面关于 linux 进程通信正确的是【C 】A.信号量是进程间通信机制中唯一同步机制 B.消息队列读取函数 msgrcv()只能读取队头的消息 C.共享内存的实现分为两个步骤:

7、创建或打开共享内存与映射共享内存 D.信号量既可以解决进程间的同步问题,但不能解决进程间的互斥问题。10.linux 网络编程中,下面哪个函数是客户端、服务端所必须调用的。【C 】A.listen()B.accept()C.socket()D.bind()第 5 页 11.使用下面哪个函数返回值可知道文件操作已到文件末尾【C】Afopen B.ftell C.feof D.fseek 三、判断题 1.select 主要解决了多路 IO 复用的问题。()2.嵌入式 linux 的底层 IO 函数(如 read())带有缓冲区,可直接对文件进行读写操作。(X)不带缓冲区 3.嵌入式 linux 的

8、标准 IO 函数(如 fread())不带有缓冲区,可直接对文件进行读写操作。(X)不可直接对文件操作 4.linux api是linux操作系统直接提供的函数接口。(X)不是直接 5.参数“-static”的作用是告诉 gcc 及库进行静态链接。()6.internet 上的数据在网络上是以高位字节优先的顺序在网络上传输的。()7.创建线程的实质就是确定该线程函数的入口点,通常使用的函数是 pcreate_thread。(X)pthread_create 8.当 linux 线程出现错误的时候,可以使用 exit()终止线程。(X)pthread_exit 9.fork()函数是 linux

9、 中一个非常重要的函数,在子进程中其返回值等于 0。()10.linux 中不是所有的 socket 都要调用 bind 函数进行端口绑定。()11.标准 IO 函数 fread 读取成功时返回的是成功读取的记录数。第 6 页(X)记录数的数目 12.底层 IO 函数 read 读取成功返回的的时成功读取字节数()13.在 linux 中,每个 api 都会对应一个或多个系统调用(X)可以不对应 14.Internet 上的数据在网络上是以低位字节优先的顺序在网络上传输的(X)高位字节 15.select 主要解决了多路 IO 复用的问题()poll 也是 16.linux 中 socket

10、一定要调用 bind 函数进行端口绑定(X)TCP 要,UDP 不用 17.参数“-static”的作用是告诉 gcc 及库进行静态链接()“-shared”动态链接 18.fork()函数是 linux 中一个非常重要的函数,如果成功,父进程中其返回值大于 1()子进程返回 0,父进程返回子进程的进程号 19.参数“-fpic”的作用是告诉 gcc 生产及位置相关的目标代码(X)无关 20.普通可实现进程间的全双工通信(X)半双工 四、简答题 1.画图说明 linux 系统下用 TCP 协议网络编程时客户端与服务器的步骤。2.画图说明 linux 系统下用 UDP 协议网络编程时客户端与服务

11、第 7 页 器的步骤。3.简述 linux 系统调用、API 及系统命令之间的关系。系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。而实际使用过程中,我们通常调用的用户编程接口就是API;系统命令相对 API 更高了一层,它实际上一个是可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能。他们的关系:4.#简述在 linux 下实现进程通信的几种方式的各自特点?匿名管道:具有亲缘关系的进程间,半双工,数据在内存中 有名管道:可用于任意进程间,双工,有文件名,数据在内存 信号:唯一的异步通信方式 消息队列:常用于

12、 cs 模式中,按消息类型访问,可有优先级,无须同步机制。共享内存:效率最高(直接访问内存),需要同步、互斥机制 第 8 页 信号量:用于解决进程间的同步及互斥问题的一种进程间通信机制 5.#共享内存是如何实现进程通信的?它是用什么方法(函数):创建、映射、撤销映射、删除?。创建/打开共享内存.ftok(),shmget()映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问.shmat()撤销共享内存映射.shmdt()删除共享内存对象.shmctl()6.#创建守护进程的过程:调用 fork 创建子进程。父进程终止,让子进程在后台继续执行。子进程调用 setsid 产生新会话期并失

13、去控制终端 调用 setsid()使子进程成为新会话组长与新的进程组长,同时失去控制终端 改变当前工作目录为根目录chdir()一般将工作目录改变到根目录,这样进程的启动目录也可以被卸掉。重设文件创建掩码 umask()清除从父进程那里继承来的文件创建掩码,设为 0。关闭打开的文件描述符 close()用 openlog 函数建立及 syslogd 的连接 第 9 页 五、编程题 1、请使用 open、read、write、lseek、fork、pipe、sleep 与waitpid 等函数实现如下功能:1)子进程把 src.txt 文件末尾的 5 个字符读出来;2)再通过管道发送给父进程;3

14、)父进程收到后将它们输出到显示终端。注意:请自行定义运行过程中的提示信息,头文件可省略!#include#include#include#include#include#include#include#define src src.txt int main()int src_file,pipe_fd2;pid_t pid;unsigned char buff5,buff110;int real_read;src_file=open(src,O_RDONLY);第 10 页 if(src_file0)printf(open src failed!n);exit(1);if(pipe(pipe_f

15、d)0)printf(Pipe creat failed!n);exit(1);memset(buff,0,sizeof(buff);memset(buff1,0,sizeof(buff1);pid=fork();if(pid=0)close(pipe_fd0);sleep(3);lseek(src_file,-6,SEEK_END);real_read=read(src_file,buff,5);write(pipe_fd1,buff,real_read);close(pipe_fd1);exit(0);else close(pipe_fd1);sleep(1);wait();read(pi

16、pe_fd0,buff1,sizeof(buff1);第 11 页 printf(Receive data from son:%sn,buff1);close(pipe_fd0);close(src_file);exit(0);2、用 tcp 协议实现(只须编写服务器程序)服务器端首先建立起 socket,然后及本地端口进行绑定,接着就开始接收从客户端的连接请求并建立及它的连接,接下来,接收客户端发送的消息并显示出来,当收到“exit”时退出。#include#include#include#include#include#include#include#include#define PORT

17、 4321#define BUFFER_SIZE 1024#define MAX_QUE_CONN_NM 5 int main()struct sockaddr_in server_sockaddr,client_sockaddr;int sin_size,recvbytes;第 12 页 int sockfd,client_fd;char bufBUFFER_SIZE;/*建立 socket 连接*/if(sockfd=socket(AF_INET,SOCK_STREAM,0)=-1)perror(socket);exit(1);printf(Socket id=%dn,sockfd);/*

18、设置 sockaddr_in 结构体中相关参数*/server_sockaddr.sin_family=AF_INET;server_sockaddr.sin_port=htons(PORT);server_sockaddr.sin_addr.s_addr=INADDR_ANY;bzero(&(server_sockaddr.sin_zero),8);int i=1;/*允许重复使用本地地址及套接字进行绑定*/setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&i,sizeof(i);/*绑定函数 bind()*/if(bind(sockfd,(struct

19、sockaddr*)&server_sockaddr,sizeof(struct sockaddr)=-1)perror(bind);exit(1);第 13 页 printf(Bind success!n);/*调用 listen()函数,创建未处理请求的队列*/if(listen(sockfd,MAX_QUE_CONN_NM)=-1)perror(listen);exit(1);printf(Listening.n);sin_size=sizeof(struct struct sockaddr);/*调用 accept()函数,等待客户端的连接,并创建一个新的 socket 为本次连接服务

20、*/if(client_fd=accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size)=-1)perror(accept);exit(1);/*调用 recv()函数接收客户端的请求*/memset(buf,0,sizeof(buf);if(recvbytes=recv(client_fd,buf,BUFFER_SIZE,0)=-1)perror(recv);exit(1);printf(Received a message:%sn,buf);close(sockfd);第 14 页 exit(0);2、用 UDP 协议实现(只须编

21、写服务器端程序):服务器端首先建立起 socket,然后及本机 IP 与端口进行绑定,接着可循环接收客户端发送的消息并显示出来,当收到“exit”时退出。#include#include#include#include#include#include#include int main(void)int sockfd;struct sockaddr_in server,client;int port=1234;int opt=SO_REUSEADDR;int rt;int addrlen;/char sendbuf100;char rbuf100;int num;第 15 页 sockfd=so

22、cket(AF_INET,SOCK_DGRAM,0);if(sockfd=-1)perror(socket);exit(1);/避免出现地址已经使用的错误 setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt);bzero(&server,sizeof(server);server.sin_family=AF_INET;server.sin_addr.s_addr=INADDR_ANY;/回送地址,指本地机,一般用来测试使用 server.sin_port=htons(port);rt=bind(sockfd,(struct soc

23、kaddr*)&server,sizeof(server);if(rt=-1)perror(bind);exit(1);addrlen=sizeof(client);while(1)/接收客户端信息 num=recvfrom(sockfd,rbuf,sizeof(rbuf),0,(struct sockaddr*)&client,&addrlen);第 16 页 if(num0)perror(recvfrom);break;rbufnum=0;/显示客户端信息,如果客户端发来 exit 则退出循环 printf(%s:%d%sn,inet_ntoa(client.sin_addr),ntohs

24、(client.sin_port),rbuf);if(strcmp(rbuf,exit)=0)break;close(sockfd);3、利用信号量实现:主线程负责从键盘获取两个整数,子线程 1 负责对这两个整数完成求与运算并把结果打印出来,子线程 2 负责对这两个整数完成乘法运算并打印出来。三个线程要求遵循如下同步顺序:a)主线程获取两个数;b)子线程 1 计算;c)子线程 2 计算;d)转到 a。#include#include#include 第 17 页#include sem_t can_add;/能够进行加法计算的信号量 sem_t can_multiply;sem_t can_s

25、canf;/能够进行键盘输入数的信号量 double x,y;void*thread_add(void*arg)/加法线程入口函数 while(1)sem_wait(&can_add);/申请信号量 printf(x+y=%.3lfn,x+y);sem_post(&can_multiply);/释放信号量 void*thread_multiply(void*arg)/乘法线程入口函数 while(1)sem_wait(&can_multiply);printf(x*y=%.3lfn,x*y);sem_post(&can_scanf);int main()pthread_t tid1,tid2;

26、sem_init(&can_add,0,0);/初始化 can_add 信号量 sem_init(&can_multiply,0,0);sem_init(&can_scanf,0,1);/初始化 can_scanf 信号量 if(pthread_create(&tid1,NULL,thread_add,NULL)0)printf(Create thread_add failed!n);第 18 页 exit(0);if(pthread_create(&tid2,NULL,thread_multiply,NULL)0)printf(Create thread_multiply failed!n);exit(0);while(1)sem_wait(&can_scanf);/申请信号量 printf(Please input two numbers:);scanf(%lf%lf,&x,&y);if(x=0&y=0)pthread_cancel(tid1);pthread_cancel(tid2);break;sem_post(&can_add);/释放信号量 exit(0);

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

当前位置:首页 > 教育专区 > 初中资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁