嵌入式Linux应用程序开发测试题(14级嵌入式方向专用)一、选择题1、下列哪一项不是嵌入式操作系统的特点DA、占有资源少B、低成本C、高可靠性D、交互性2、在Linux内核配置过程中,下面哪项命令采用的是基于图形窗口模式的配置界面CA、make configB、make menuconfigC、make xconfigD、make oldconfig3、在Linux内核配置过程中,下面哪项命令建立依赖关系CA、make configB、make menuconfigC、make depD、make clean4、交叉编译器中,下面哪项不是必需包含的DA、glibcB、gccC、binutilsD、tmake5、内核的编译主要步骤不包括下面哪项DA、内核配置B、建立依存关系C、建立内核D、加载内核6、内核编译时选项前的尖括号中可以是空,*,M,其中*表示CA、选项将编译为模块B、不包含选项C、包含选项7、Bootloader的stage1阶段主要完成的工作不包括下面哪项DA、基本的硬件初始化B、为加载stage2准备RAM空间C、拷贝stage2到RAM中D、用汇编语言跳转到main入口函数8、GCC的正确编译流程为AA、预处理-编译-汇编-链接B、预处理-编译-链接-汇编C、预处理-链接-编译-汇编D、编译-预处理-汇编-链接9、如需GCC提供编译过程中所有有用的报警信息,则在编译时应加入选项BA、-wB、-WallC、-werrorD、-error10、下面哪些与GDB相关的说法是错误的BA、GDB能调试可执行文件B、GDB能调试源代码C、GDB对编译过程有要求D、GDB支持交叉调试11、在GDB调试过程中,使用下面哪项命令设置断点,其中m代表行号AA、b mB、c mC、n mD、s m12、open函数原型中的O_RDWR标志表示文件打开方式为CA、只读方式打开文件B、可写方式打开文件C、读写方式打开文件D、以添加方式打开文件,在打开文件的同时,文件指针指向文件末尾13、在Linux操作系统中,串口设备的设备名一般为CA、com1B、port1C、ttyS0D、serl114、下面哪项对Linux操作系统下fork函数的描述是错误的DA、fork函数执行一次返回两个值B、新进程称为子进程,而原进程称为父进程C、父进程返回值为子进程的进程号D、子进程返回值为父进程的进程号15、编写守护进程的第一步为AA、创建子进程,父进程退出B、在子进程中创建新会话C、改变当前目录为根目录D、关闭文件描述符16、在关于TCP/UDP的描述中,下面哪项是错误的CA、TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递B、TCP对话通过三次握手来完成初始化C、UDP即用户数据报协议是一种面向连接的协议D、一个UDP应用可同时作为应用的客户或服务器方17、常见的socket类型中不包括下面哪项CA、SOCK_STREAMB、SOCK_DGRAMC、SOCK_DTRAND、SOCK_RAW18、以下哪项不是autotools系列工具之中的一种。
CA、automakeB、autoconfC、autocleanD、autoscan19、下列关于网络编程的叙述中,错误的是 B 。
A.一个完整的网络程序应该包含两个独立的程序,它们分别运行在客户端和服务器端。
B.当使用UDP编程时,如果函数sendto( )函数成功返回,表示系统发出的数据被通讯的对方准确接收到了。
C.相同条件下UDP发送数据的速度要比TCP快。
D.端口号是16bit的地址码,端口号和IP地址构成一个插口(socket)。
20、下列makefile自动变量中,表示目标文件完整名称的是A、$@B、$<C、$^D、$%二、填空题1、Linux中最常用的编译器是____编译器。
答案:gcc2、gdb对____文件进行调试。
答案:可执行3、工程管理器make读入的配置文件为____。
答案:Makefile或makefile4、工程管理器make定义了____规则和模式规则。
答案:隐含5、嵌入式软件开发所采用的编译过程为____编译。
答案:交叉6、在嵌入式软件开发中,将程序实际的运行环境称为____机。
答案:目标7、一个进程启动时,通常都会打开____个文件。
答案:38、在Linux中,实现文件上锁的函数有lock和____。
答案:fcntl9、Daemon进程即通常所说的____进程,是Linux中的后台服务进程。
答案:守护10、在Linux中使用____函数创建一个新进程。
答案:fork11、fork函数调用后出现父进程与子进程,其中____的返回值为0。
答案:子进程12、____函数族就提供了一个在进程中启动另一个程序执行的方法。
答案:exec13、exit()函数与_exit()函数最大的区别就在于____函数在exit系统调用之前要检查文件的打开情况,并将文件缓冲区中的内容写回文件。
答案:exit14、____函数是用于使父进程阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。
答案:wait15、在Linux中,所有的孤儿进程自动由____进程收养。
答案:init16、Linux中的网络编程通过____接口来进行。
答案:socket17、SOCK_DGRAM为____套接字。
答案:数据报三、程序填空和阅读分析题1、下列程序在父子进程之间创建了一个管道,,实现父进程向子进程写数据的功能。
阅读下列程序,并写出标号所示的功能。
#include <unistd.h>#include <sys/types.h>#include <errno.h>#include <stdio.h>#include <stdlib.h>int main(){int pipe_fd[2];pid_t pid;char buf_r[100];char* p_wbuf;int r_num;memset(buf_r,0,sizeof(buf_r)); (1) 将数据缓冲区清0if(pipe(pipe_fd)<0) (2) 创建管道{printf("pipe create error\n");return -1;}if((pid=fork())==0) (3)创建子进程{printf("\n");close(pipe_fd[1]); (4)关闭子进程写描述符sleep(2);if((r_num=read(pipe_fd[0],buf_r,100))>0) (5) 子进程读取管道内容{printf( "%d numbers read from the pipe is %s\n",r_num,buf_r);}close(pipe_fd[0]); (6)关闭子进程读描述符exit(0);}else if(pid>0) (7) 父进程运行控制语句{close(pipe_fd[0]); (8)关闭父进程的读描述符if(write(pipe_fd[1],"Hello",5)!=-1) (9)将数据写入缓冲区printf("parent write1 success!\n");if(write(pipe_fd[1]," Pipe",5)!=-1)printf("parent write2 success!\n");close(pipe_fd[1]); (10)关闭父进程写描述符sleep(3);waitpid(pid,NULL,0);阻塞方式等待子进程结束exit(0);}}2、阅读程序,写出程序的执行结果,并分析程序的执行过程。
(假设父子进程均可在一个时间片内执行完,且操作系统每次均先调度子进程。
)#include<sys/types.h>#include <unistd.h>int main() {pid_t result;int count=5;printf("before fork,count=%d\n",count);result=fork();if(result<0)printf("fork fail\n");else if(result>0) {count++;printf("This is parent!\n”);}else{count--;printf("This is child!\n");}printf("after fork count=%d\n",count);return 0;}before fork,count=5This is childafter fork count=4This is parent!after fork count=6程序的执行过程如下:程序先定义了两个变量result和count,然后输出变量count的值,得到"before fork count=5"这一行输出。
当执行到result=fork()时程序分叉,产生父子两个进程。
系统首先调度子进程执行,直至子进程结束。
而在子进程中result为0,故走的是条件分支的最后一个分支,输出:This is child.after fork count=4子进程执行完了之后调度父进程执行,直至父进程结束。
而在父进程中result 为子进程号,大于0,于是走条件分支的第二个个分支,输出:This is parentafter fork count=6四、编程题1、编写一个C语言源程序ex.c,(1)用以在打开当前目录下的文件“ex.txt”,如果没有则创建该文件,并使其具有读写属性,(2)编写一个makefile实现自动编译,生成可执行文件ex。
void main(void){int fid;fid = open(“./ex.txt”,O_RDWR|O_CREAT);if(fid==-1){printf(“open or create error \n”);exit(0);}close(fid);}objects = ex.oexec = exall:$(objects)gcc –o $(exec) $(objects)ex.o:ex.cgcc –c ex.cclean:rm –r $(exec) $(objects)2、假定你在目录/root/arm下有一个C程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下图所示:CC=arm-linux-gccex1: main.o list.o symbol.o table.o$(CC) -o ex1 main.o list.o symbol.o table.omain.o: main.c table.h symbol.h list.h$(CC) -c -o main.o main.clist.o: list.c list.h$(CC) -c -o list.o list.csymbol.o: symbol.c symbol.h$(CC) -c -o symbol.o symbol.ctable.o: table.c table.h symbol.h list.h$(CC) -c -o table.o table.cclean:rm ex *.o五、简答题1、什么是交叉编译?嵌入式交叉编译怎么实现?2、Bootloader启动流程是怎么样的?3、比较全缓冲、行缓冲和不带缓冲,并说明标准输入输出、标准错误各使用哪种类型的缓冲?4、编写守护进程包括哪几个步骤,每个步骤分别怎么实现?5、进程的信号与信号量通信有什么区别?6、无名管道和有名管道在使用时有什么区别?分别使用什么函数创建无名管道和有名管道?。