嵌入式应用开发期末练习题.doc_第1页
嵌入式应用开发期末练习题.doc_第2页
嵌入式应用开发期末练习题.doc_第3页
嵌入式应用开发期末练习题.doc_第4页
嵌入式应用开发期末练习题.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、填空题1、 linux中,对串口参数进行配置的数据结构名是 _termios_。2、 gcc的编译流程分为4个步骤:预处理、 _编译_、汇编、 _链接_。3、 获取当前进程ID的方法是 _getpid()_。4、 对文件的打开操作有open和fopen,它们哪个是标准库函数 _fopen()_它的返回值是 _指向FILE的指针_。5、 一个由c语言占用的内存分为代码区和数据区,数据区又可以分为 _静态数据区_和动态数据区,动态数据区分为堆、 _栈_。6、 linux的管道通信可以分为匿名管道、 _有名管道_和 _标准管道_。7、 linux中的网络编程是通过套接字接口来进行的,常见的套接字有三种类型: _流式套接字_、 _数据报套接字_和 _原始套接字_。8、 在linux中,用户空间的进程可以直接通过 _系统调用_来获取操作系统内核提供的服务。9、 linux中,对串口进行操作的函数中,激活串口配置的函数是 _tcsetattr()_。10、 linux中使用较多的进程间通信方式包括管道、信号、信号量、 _消息队列_、 _共享内存_。11、 makefile规则是make进行处理的依据,它包括了 _依赖文件_、 _目标体_及其之间的命令语句。12、 互斥锁和信号量为linux中的线程同步机制,其中 _信号量_适合于同时可用的资源为多个的情况。13、 系统调用分为进程控制、进程间通信、文件系统管理、系统管理、存储管理、网络管理、socket管理、用户管理等。14、 终端分为3种模式规范模式、非规范模式和原始模式二、选择题1. 下面关于linux下串口操作正确的描述是【 C 】A串口的奇偶校验必须使能B不能通过linux api设置串口的停止位C串口配置好后,其读写操作和普通文件就是一样的了D串口文件可以通过lseek改变读写指针2. 下列关于makefile说法错误的是【 B 】A.创建目标体的命令必须以制表符开头 B. makefile变量名可以包含“#”字符串C. makefile变量对大小写敏感D. “-C dir”表示读入指定目录dir下的makefile3. 下列关于linux多线程编程不正确的是【 D 】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. 从文件描述符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. objcopy7. 下面关于linux进程控制不正确的描述的是【 A 】A. wait( )调用一定会使得父进程阻塞B. exit()会清理IO缓冲,而_exit()不会清理IO缓冲C. 在执行execl函数后,原调用进程的内容除了进程号外,其他全部被新的进程替换了D. fork( )的返回值在父子进程中是不一样的8. 将max.c生成动态链接库的正确命令是。【 B 】A. gcc c max.cB. gcc -fpic shared o libmax.so max.cC. gcc o libmax.so max.cD. gcc static o libmax.so max.c 9. 下面关于linux进程通信正确的是【 C 】A.信号量是进程间通信机制中唯一同步机制B.消息队列读取函数msgrcv()只能读取队头的消息C.共享内存的实现分为两个步骤:创建或打开共享内存和映射共享内存D.信号量既可以解决进程间的同步问题,但不能解决进程间的互斥问题。10. linux网络编程中,下面哪个函数是客户端、服务端所必须调用的。【 C 】A. listen( )B. accept( )C. socket( )D. bind( )11.使用下面哪个函数返回值可知道文件操作已到文件末尾【C】Afopen B.ftell C.feof D.fseek三、判断题1. select主要解决了多路IO复用的问题。( )2. 嵌入式linux的底层IO函数(如read())带有缓冲区,可直接对文件进行读写操作。( X) 不带缓冲区3. 嵌入式linux的标准IO函数(如fread())不带有缓冲区,可直接对文件进行读写操作。( X) 不可直接对文件操作4. linux api是linux操作系统直接提供的函数接口。(X ) 不是直接5. 参数“-static”的作用是告诉gcc与库进行静态链接。( )6. internet上的数据在网络上是以高位字节优先的顺序在网络上传输的。( )7. 创建线程的实质就是确定该线程函数的入口点,通常使用的函数是pcreate_thread。( X) pthread_create8. 当linux线程出现错误的时候,可以使用exit( )终止线程。(X ) pthread_exit9. fork( )函数是linux中一个非常重要的函数,在子进程中其返回值等于0。( ) 10. linux中不是所有的socket都要调用bind函数进行端口绑定。( )11. 标准IO函数fread读取成功时返回的是成功读取的记录数。(X ) 记录数的数目12. 底层IO函数read读取成功返回的的时成功读取字节数()13. 在linux中,每个api都会对应一个或多个系统调用(X) 可以不对应14. Internet上的数据在网络上是以低位字节优先的顺序在网络上传输的(X) 高位字节15. select主要解决了多路IO复用的问题() poll也是16. linux中socket一定要调用bind函数进行端口绑定(X) TCP要,UDP不用17. 参数“-static”的作用是告诉gcc与库进行静态链接() “-shared”动态链接18. fork()函数是linux中一个非常重要的函数,如果成功,父进程中其返回值大于1() 子进程返回0,父进程返回子进程的进程号19. 参数“-fpic”的作用是告诉gcc生产与位置相关的目标代码(X) 无关20. 普通可实现进程间的全双工通信(X) 半双工4、 简答题1. 画图说明linux系统下用TCP协议网络编程时客户端和服务器的步骤。2. 画图说明linux系统下用UDP协议网络编程时客户端和服务器的步骤。3. 简述linux系统调用、API及系统命令之间的关系。系统调用是指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。而实际使用过程中,我们通常调用的用户编程接口就是API;系统命令相对API更高了一层,它实际上一个是可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能。他们的关系:4. #简述在linux下实现进程通信的几种方式的各自特点?匿名管道: 具有亲缘关系的进程间,半双工,数据在内存中有名管道: 可用于任意进程间,双工,有文件名,数据在内存信号: 唯一的异步通信方式消息队列:常用于cs模式中, 按消息类型访问 ,可有优先级,无须同步机制。共享内存:效率最高(直接访问内存) ,需要同步、互斥机制信号量:用于解决进程间的同步与互斥问题的一种进程间通信机制5. #共享内存是如何实现进程通信的?它是用什么方法(函数):创建、映射、撤销映射、删除?。创建/打开共享内存. ftok(),shmget()映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问. shmat()撤销共享内存映射. shmdt()删除共享内存对象. shmctl()6. #创建守护进程的过程:调用fork创建子进程。父进程终止,让子进程在后台继续执行。子进程调用setsid产生新会话期并失去控制终端调用setsid()使子进程成为新会话组长和新的进程组长,同时失去控制终端改变当前工作目录为根目录chdir()一般将工作目录改变到根目录,这样进程的启动目录也可以被卸掉。重设文件创建掩码umask()清除从父进程那里继承来的文件创建掩码,设为0。关闭打开的文件描述符close()用openlog函数建立与syslogd的连接五、编程题1、请使用open、read、write、lseek、fork、pipe、sleep和waitpid等函数实现如下功能:1) 子进程把src.txt文件末尾的5个字符读出来;2) 再通过管道发送给父进程;3) 父进程收到后将它们输出到显示终端。注意:请自行定义运行过程中的提示信息,头文件可省略!#include#include#include#include#include#include#include #define src src.txtint main()int src_file,pipe_fd2;pid_t pid;unsigned char buff5,buff110;int real_read;src_file=open(src,O_RDONLY);if(src_file0)printf(open src failed!n);exit(1);if(pipe(pipe_fd)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);elseclose(pipe_fd1);sleep(1);wait();read(pipe_fd0,buff1,sizeof(buff1);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 4321#define BUFFER_SIZE 1024#define MAX_QUE_CONN_NM 5int main() struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes; 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); /*设置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 sockaddr *)&server_sockaddr, sizeof(struct sockaddr) = -1) perror(bind); exit(1); 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为本次连接服务*/ 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); exit(0);2、用UDP协议实现(只须编写服务器端程序):服务器端首先建立起socket,然后与本机IP和端口进行绑定,接着可循环接收客户端发送的消息并显示出来,当收到“exit”时退出。#include #include #include #include #include #include #includeint 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;sockfd=socket(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 sockaddr *)& 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);if(num0) perror(recvfrom); break; rbufnum=0;/显示客户端信息,如果客户端发来exit则退出循环printf(%s:%d %sn,inet_ntoa(client.sin_addr),ntohs(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 #include sem_t can_add;/能够进行加法计算的信号量sem_t can_multipl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论