嵌入式Linux应用程序开发期末考试题库及答案 下载本文

1. 国内嵌入式系统行业对“嵌入式系统”的定义是什么?如何理解?

答:国内嵌入式行业一个普遍认同的定义是:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能,可靠性,成本,体积,功耗严格要求的专业计算机系统。 从这个定义可以看出嵌入式系统是与应用紧密结合的,它具有很强的专用性,必须结合实际系统需求进行合理的剪裁利用。因此有人把嵌入式系统比作是一个针对特定的应用而“量身定做”的专业计算机系统。 2.嵌入式系统是从何时产生的,简述其发展历程。

答:从20世纪70年代单片机的出现到目前各式各样的嵌入式微处理器,微控制器的大规模应用,嵌入式系统已经有了30多年的发展历史。

嵌入式系统的出现最初是基于单片机的。Intel公司1971年开发出第一片具有4位总线结构的微处理器4004,可以说是嵌入式系统的萌芽阶段。80年代初的8051是单片机历史上值得纪念的一页。20世纪80年代早期,出现了商业级的“实时操作系统内核”,在实时内核下编写应用软件可以使新产品的沿着更快,更节省资金。20世纪90年代实时内核发展为实时多任务操作系统。步入21世纪以来,嵌入式系统得到了极大的发展。在硬件上,MCU的性能得到了极大的提升,特别是ARM技术的出现与完善,为嵌入式操作系统提供了功能强大的硬件载体,将嵌入式系统推向了一个崭新的阶段。

3.当前最常用的源码开放的嵌入式操作系统有哪些,请举出两例,并分析其特点。 答:主要有嵌入式Linux和嵌入式实时操作内核uC/OS-II

嵌入式Linux操作系统是针对嵌入式微控制器的特点而量身定做的一种Linux操作系统,包括常用的嵌入式通信协议和常用驱动,支持多种文件系统。主要有以下特点:源码开放,易于移植,内核小,功能强大,运行稳定,效率高等。 uC/OS是源码工卡的实时嵌入式系统内核,主要有以下特点:源码公开,可移植性强,可固化,可剪裁,占先式,多任务,可确定性,提供系统服务等。 4.举例说明嵌入式设备在工控设备中的应用。 答:由于工业控制系统特别强调可靠性和实时性,“量身定做”的嵌入式控制系统恰能满足工业控制的需求。例如:工业过程控制,数字控制机床,电网设备监测,电力自动控制系统,石油化工监控等。

5.嵌入式技术的发展趋势有哪些?

答:未来嵌入式系统的发展趋势有:1.随着信息化与数字化的发展,嵌入式设备进行网络互联是未来发展的趋势。2.优化嵌入式系统软硬件内核,提高系统运行速度,降低功耗和硬件成本。3.指令集的并行计算技术将引入嵌入式微处理器。4.嵌入式微处理器将会向多核技术发展。5.嵌入式技术将引领信息时代。 第2章 ARM技术与ARM体系结构 1.简述ARM处理器内核调试结构原理 答:ARM处理器一般都带有嵌入式追踪宏单元ETM(Embedded Trace Macro),它是ARM公司自己推出的调试工具。ARM处理器都支持基于JTAG(Joint Test Action Group 联合测试行动小组)的调试方法。它利用芯片内部的Embedded ICE来控制ARM内核操作,可完成单步调试和断点调试等操作。当CPU处理单步执行完毕或到达断点处时,就可以在宿主机端查看处理器现场数据,但是它不能在CPU运行过程中对实时数据进行仿真。

3. ARM处理器的工作模式有哪几种,其中哪些为特权模式,哪些为异常模式,

并指出处

理器在什么情况下进入相应的模式。 答:ARM技术的设计者将ARM处理器在应用中可能产生的状态进行了分类,并针对同一类型的异常状态设定了一个固定的入口点,当异常产生时,程序会自动跳转到对应异常入口处进行异常服务。 1.用户模式:非特权模式,也就是正常程序执行的模式,大部分任务在这种模式下

执行。在用户模式下,如果没异常发生,不允许应用程序自行改变处理器的工作模式,如果有异常发生,处理器会自动切换工作模式

2.FIQ模式:也称为快速中断模式,支持高速数据传输和通道处理,当一个高优先级(fast)中断产生时将会进入这种模式。

3.IRQ模式:也称为普通中断模式,:当一个低优先级(normal)中断产生时将会进入

这种模式。在这模式下按中断的处理器方式又分为向量中断和非向量中断两种。通常的中断处理都在IRQ模式下进行。

4.SVC模式:称之为管理模式,它是一种操作系统保护模式。当复位或软中断指

令执行时处理器将进入这种模式。

5.中止模式:当存取异常时将会进入这种模式,用来处理存储器故障、实现虚拟存储或存储保护。

6.未定义指令异常模式:当执行未定义指令时会进入这种模式,主要是用来处理未

定义的指令陷阱,支持硬件协处理器的软件仿真,因为未定义指令多发生在对协处理器的操作上。

7.系统模式:使用和User模式相同寄存器组的特权模式,用来运行特权级的操作系统任务。

在这7种工作模式中,除了用户模式以外,其他6种处理器模式可以称为特权模式,

在这些模式下,程序可以访问所有的系统资源,也可以任意地进行处理器模式的切 换。

在这6种特权模式中,除了系统模式外的其他5种特权模式又称为异常模式,每种

异常都对应有自己的异常处理入口点。 名词解析,20分,5题

RISC (reduced instruction set computer,精简指令集计算机)是一种执行较少类型计算机

指令的微处理器,起源于80 年代的MIPS主机(即RISC 机),RISC机中采用的微处理器统称RISC处理器。

RTOS 实时操作系统(Real-time operating system)实时系统能够在指定或者确定的时间内

完成系统功能和外部或内部、同步或异步时间做出响应的系统。

Kernel 内核 操作系统内核操作系统内核是指大多数操作系统的核心部分。它由操作系统

中用于管理存储器、文件、外设和系统资源的那些部分组成。

CISC::Complex Instruction Set Computer 复杂指令系统计算机

ISR:Interrupt Service Routines 中断服务程序

IP 是英文Internet Protocol(网络之间互连的协议)的缩写,中文简称为“网协”,也就是

为计算机网络相互连接进行通信而设计的协议。 Non-preemptive 非抢占式

JTAG 是英文“Joint Test Action Group(联合测试行为组织)”的词头字母的简写,该组织 成立于1985 年,是由几家主要的电子制造商发起制订的PCB 和IC 测试标准。 Scheduler:调度程序,日程安排程序

IDE: Integrated Development Environment 集成开发环境 简答题30分,5题

1. 从底层硬件到上层应用软件,试分析嵌入式计算机系统的组成主要成分分为哪几个部分,并写出各部分所完成的功能。

答:⑴硬件层;⑵中间层( 嵌入式系统初始化,硬件相关的驱动程序);⑶软件层(操作系统、文件系统、GUI,网络及通用组件);⑷功能层。 2. BootLoader在嵌入式系统中主要起什么作用?完成哪些主要的工作?

答:Boot Loader是操作系统内核运行的一段小程序,负责整个系统的移植和引导加载任务。主要完成进行初始化系统硬件设置的任务,包括CPU,SDRRAM,Flash,串口等初始化,时钟的设置,存储器的映射等,还要设置堆栈指针,创建内核需要的信息等工作,最后是调用操作系统内核。(书本P151)

3. ARM核中什么寄存器用于存储PC?R13通常用来存储什么?R14通常用来存储什么?

答:R15用于程序计数寄存器PC,R13通常用来做堆栈指针寄存器,R14通常用来做链接寄存器,保存函数调用的返回地址 4. 嵌入式开发环境主要包括哪些组件?

答:嵌入式系统开发需要交叉编译和在线调试的开发环境,主要包括:宿主机;目标机(评估电路板);基于JTAG的ICD仿真器、或调试监控软件、或在线仿真器ICE;运行于宿主机的交叉编译器和链接器、以及开发工具链或软件开发环境;嵌入式操作系统。

5. 试写抢占式和非抢占式的区别。

答:执行的过程中对中断处理方式不一样,抢先式:某一中断执行完成后,如果有更高优先级的任务处于就绪状态,将执行更高优先级任务,而非抢占式不一样,一个任务只有主动放弃CPU的控制权,其他任务才能够获得CPU的控制权。

6. 根据嵌入式系统的特点,写出嵌入式系统的定义。

答:以应用为中心、以计算机技术为基础、软硬件可裁减、功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。

7. ARM处理器有几种工作模式?并做说明每种工作模式的含义。 答:ARM处理器有7种工作模式:

用户模式(USR)---正常程序执行的模式

快速中断模式(FIQ)---FIQ异常响应时进入此模式,用于高速数据传输或紧急事件的处理,以及需要快速中断服务程序的场合。

外部中断模式(IRQ)---IRQ异常响应时进入此模式,用于通用的中断处理场合。 管理模式(SVC)---操作系统使用的保护模式,用于软件中断和系统重新启动。 中止模式(ABT)---用于虚拟存储及存储保护

系统模式(SYS)---运行具有特权的操作系统任务,与用户模式共用寄存器。 未定义模式(UND)---用于处理没有定义的指令。 除了用户模式外,其他模式均可视为特权模式

8. 试说明现代计算机系统中存储器系统是如何分层的?有什么好处?

答:微机中的存储器子系统一般分为四级,即:寄存器组、高速缓存、内存和外存。

第一级寄存器组位于微处理器的内部,速度最快,但数目较少;

第二级高速缓存Cache是为了解决CPU与主存之间不匹配问题而设置的,其性能是速度快、容量小。

第三级内部存储器(即主存)容量大、速度较慢(相对于Cache),通常用于存放运行的程序和数据。

第四级外部存储器容量巨大,可读可写,单位存储成本最低,且可以脱机保存信息。

现代微机把这些不同容量、不同速度的存储器按一定的体系结构组织起来,形成一个统一的存储系统,主要是为了解决存储容量、存取速度和价格之间的矛盾。

1下列哪一项不是嵌入式操作系统的特点 D

A、占有资源少 B、低成本 C、高可靠性 D、交互性

2下列哪一项不是嵌入式系统的基本要素 C A、嵌入性 B、专用性 C、通用性 D、计算机系统

3现阶段嵌入式系统发展的主要标志为 D A、以单芯片为核心的可编程控制器

B、以嵌入式CPU为基础、以简单操作系统为核心 C、嵌入式操作系统 D、Internet

4下面哪项不是嵌入式系统的特点 D A、面向特定应用

B、软件一般都固化在存储器芯片或单片机本身中,而不存储于磁盘中 C、代码尤其要求高质量、高可靠性 D、具备二次开发能力

5下面哪项不是ARM处理器的特点 D

A、支持Thumb(16 位)/ARM(32 位)双指令集 B、兼容8位/16位器件 C、指令长度固定

D、大量使用RAM,指令执行速度更快

6下面哪项不是ARM处理器的特点 B A、大多数数据操作都在寄存器中完成 B、采用CISC指令集

C、寻址方式灵活简单,执行效率高 D、体积小、低功耗、低成本、高性能

下面哪项不属于ARM处理器模式 A A、管理模式(root) B、用户模式(usr) C、快速中断模式(fiq) D、外部中断模式(irq)

下面哪项为错误的说法 A

A、冯·诺依曼结构共用数据存储空间和程序存储空间,不共享存储器总线 B、哈佛结构有分离的数据和程序空间及分离的访问总线 C、哈佛结构在指令执行时,取址和取数可以进行并行操作 D、哈佛结构指令执行时效率更高

采用下列哪项更有利于开发微型嵌入式应用系统 B A、脚本程序语言 B、C语言或汇编语言 C、C++或SQL语言 D、HTML或XML语言

下面哪项为一般嵌入式系统开发中不具备的环节 B A、系统总体开发 B、数据库设计 C、嵌入式硬件开发 D、嵌入式软件开发

在嵌入式系统开发过程中下面哪项为错误的说法 B

A、对于有些硬件和软件都可以实现的功能,需要在成本和性能上做出抉择 B、对实时性要求非常高的产品可以选择嵌入式Linux开发环境 C、嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分

D、嵌入式系统的软件开发可分为交叉编译和交叉调试两部分

对于Linux操作系统,下面哪项说法是错误的 D A、是一种开源的操作系统 B、提供了强大的应用程序开发环境 C、可以免费使用

D、不支持Sparc硬件平台

使用命令chmod的数字设置,可以改变 C A、文件的访问特权 B、目录的访问特权 C、文件/目录的访问特权

修改文件a.txt的权限,使每个用户都可以读取和写入这个文件,相应命令为 A A、chmod 666 a.txt B、chmod 777 a.txt C、chmod 755 a.txt D、chmod 555 a.txt

某文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为 D A、467 B、674 C、476 D、764

系统中有用户user1和user2,同属于users组。在user1用户目录下有一文件file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应文件拥有权限应为 B A、744 B、664 C、646 D、746

某文件的权限是 -rwxr--r--,则下面描述正确的是 C A、文件的权限值是755

B、文件的所有者对文件只有读权限 C、其他用户对文件只有读权限 D、同组用户对文件只有写权限

某文件的原有权限是-rwxr--r--,执行chmod o+x后文件权限为 B A、-rwxr-xr-x B、-rwxr--r-x C、-rwxr-xr--

D、-rw-r--r--

clear命令的作用是 A A、清除终端窗口 B、关闭终端窗口 C、打开终端窗口 D、调整窗口大小

显示当前目录中的全部文件,相应命令为 B A、ls B、ls -a C、ls -l

在Linux操作系统默认情况下,ls命令显示的可执行文件颜色为 A A、绿色 B、蓝色 C、灰色 D、黄色

用命令显示出文件ff的描述为-rwxr-xr-- 1 root root 599 cec 10 17:12 ff,由此可知文件ff的类型为 A A、普通文件 B、硬链接 C、目录 D、符号链接

用命令列出下面的文件列表,请问那一个文件是符号链接文件 D A、-rw------- 2 hel-s users 56 Sep 09 11:05 hello B、-rw------- 2 hel-s users 56 Sep 09 11:05 goodbey C、drwx------ 1 hel users 1024 Sep 10 08:10 zhang D、lrwx------ 1 hel users 2024 Sep 12 08:12 cheng

在Linux关机命令中,下列命令中无法实现关机的是 B A、shutdown -h now B、reboot C、halt

删除文件命令为 D A、mkdir B、rmdir C、mv D、rm

对于tar.gz结尾的文件,采用下面哪个命令进行解压缩操作 A

A、tar xvzf B、tar jxvf C、tar czvf D、tar jcvf

对于tar.bz2结尾的文件,采用下面哪个命令进行解压缩操作 B A、tar xvzf B、tar jxvf C、tar czvf D、tar jcvf

对于ln命令,下列哪项说法是不正确的 C A、ln命令会保持每一处链接文件的同步性 B、软链接在用户选定的位置上生成一个文件的镜像 C、ln命令的链接文件不会重复占用磁盘空间

D、硬链接会在用户选定的位置上生成一个和源文件大小相同的文件

在vi编辑器中执行存盘退出的命令为 D A、:q B、:sq C、:q! D、:wq

vi编辑器中不包括下面哪种模式 A A、编辑模式 B、命令行模式 C、插入模式 D、底行模式

使用vi编辑器环境时,使用:set nu显示行号,使用下面哪项命令取消行号显示 B A、:set nuoff B、:set nonu C、:off nu D、:cls nu

在Linux内核配置过程中,下面哪项命令采用的是基于图形窗口模式的配置界面 C A、make config B、make menuconfig C、make xconfig D、make oldconfig

在Linux内核配置过程中,下面哪项命令建立依赖关系 C A、make config

B、make menuconfig C、make dep D、make clean

交叉编译器中,下面哪项不是必需包含的 D A、glibc B、gcc C、binutils D、tmake

内核的编译主要步骤不包括下面哪项 D A、内核配置 B、建立依存关系 C、建立内核 D、加载内核

内核编译时选项前的尖括号中可以是空,*,M,其中*表示 C A、选项将编译为模块 B、不包含选项 C、包含选项

Bootloader的stage1阶段主要完成的工作不包括下面哪项 D A、基本的硬件初始化

B、为加载stage2准备RAM空间 C、拷贝stage2到RAM中

D、用汇编语言跳转到main入口函数

采用哪项运行级别为图形用户登录Linux操作系统 D A、0 B、1 C、3 D、5

下面关于Linux系统服务的说法哪项是错误的 B A、INIT进程的一个重要作用就是启动Linux系统服务

B、Linux的系统服务包括独立运行的系统服务和由用户设定的服务 C、xinet能够同时监听多个指定的端口 D、xinet可以看作一个启动服务的管理服务器

下面关于Linux系统服务的说法哪项是错误的 C

A、独立运行的系统服务的启动脚本都放在目录/etc/rc.d/init.d/中

B、不同运行级别的脚本文件目录为/etc/rc.d/rcN.d,其中N对应不用的运行级别 C、不同运行级别的脚本文件中每个对应的服务都以“C”或“S”开头,其中的C代表关闭,S代表启动

D、使用命令“service+系统服务+操作”实现对相应服务操作

使用下面哪项命令查看系统的默认运行级别 A A、runlevel

B、service xinetd status C、chkconfig --list D、chkconfig xinetd status

下面哪种语言GCC编译器不支持 C A、C B、Java C、ASP D、C++

GCC的正确编译流程为 A A、预处理-编译-汇编-链接 B、预处理-编译-链接-汇编 C、预处理-链接-编译-汇编 D、编译-预处理-汇编-链接

下面哪项关于GCC编译过程的说法是错误的 D

A、编译阶段GCC要检查代码规范性、是否有语法错误等,确定代码的实际要做的工作 B、汇编阶段是把编译阶段生成的.s文件转成目标文件 C、预处理阶段,GCC编译器将代码中包含的头文件编译进来 D、GCC在编译时默认使用静态库

如需GCC提供编译过程中所有有用的报警信息,则在编译时应加入选项 B A、-w B、-Wall C、-werror D、-error

下面哪些与GDB相关的说法是错误的 B A、GDB能调试可执行文件 B、GDB能调试源代码 C、GDB对编译过程有要求 D、GDB支持交叉调试

在GDB调试过程中,使用下面哪项命令设置断点,其中m代表行号 A A、b m B、c m C、n m D、s m

一个进程启动时打开3个文件中不包括 D

A、标准输入 B、标准输出 C、标准出错处理 D、系统日志服务

一般情况下,STDIN_FILENO对应的文件描述符为 B A、-1 B、0 C、1 D、2

一般情况下,STDERR_FILENO对应的文件描述符为 D A、-1 B、0 C、1 D、2

不带缓存的文件I/O操作函数不包括 A A、fopen B、read C、write D、open

open函数原型中的O_RDWR标志表示文件打开方式为 C A、只读方式打开文件 B、可写方式打开文件 C、读写方式打开文件

D、以添加方式打开文件,在打开文件的同时,文件指针指向文件末尾

open函数调用错误时,函数返回值为 A A、-1 B、0 C、1 D、2

在Linux操作系统中,串口设备的设备名一般为 C A、com1 B、port1 C、ttyS0 D、serl1

串口参数主要通过设置struct termios结构体的各成员值来实现,下面哪项不是各成员值支持的设置方式 C A、与

B、或 C、赋值

串口参数主要通过设置struct termios结构体的各成员值来实现,下面哪项实现设置波特率参数 B

A、newtio.c_cflag |= 115200 B、cfsetispeed(&newtio, B115200) C、options.c_cflag |= B115200 D、newtio.c_cflag = ~CS115200

当流缓冲涉及一个终端时,标准I/O典型地使用下面哪项缓冲方式 B A、全缓冲 B、行缓冲 C、无缓冲 D、帧缓冲

标准出错stderr产生时,标准I/O典型地使用下面哪项缓冲方式 C A、全缓冲 B、行缓冲 C、无缓冲 D、帧缓冲

使用fopen函数时,必需包含的头文件文件为 A A、stdio.h B、stdlib.h C、errno.h D、fcntl.h

下面哪项是对进程概念的错误描述 D A、进程是一个独立的可调度的活动

B、进程是一个抽象实体,当它执行某个任务时,将要分配和释放各种资源 C、进程是可以并行执行的计算部分 D、进程是保存在磁盘上的指令的有序集合

下面哪项对进程的描述是错误的 A A、进程是一个静态态的概念

B、进程包括动态创建、调度和消亡的整个过程。 C、进程是程序执行和资源管理的最小单位

D、当用户在系统中键入命令执行一个程序的时候,它将启动一个进程

下面哪项对进程控制块的描述是错误的 D A、进程控制块包含进程的描述信息 B、进程控制块包含进程的控制信息 C、进程控制块包含进程的资源信息

D、进程控制块是进程的一个静态描述

下面哪项对进程标识的描述是错误的 B A、PID惟一地标识一个进程 B、PPID惟一地标识一个进程 C、PID是非零的正整数 D、PPID是非零的正整数

下面哪项对Linux操作系统下进程的模式描述是错误的 C

A、用户程序执行过程中出现系统调用或者发生中断事件,进程模式就变成内核模式 B、内核模式下运行的进程可以执行机器的特权指令 C、root用户可干扰内核模式下进程的运行 D、内核模式下运行的进程不受用户的干扰

进程的三种状态为 C A、准备态、执行态和退出态 B、精确态、模糊态和随机态 C、运行态、就绪态和等待态 D、手工态、自动态和自由态

下面哪项不是Linux操作系统下常见的进程调度命令 C A、bg B、kill C、open D、ps

下面哪项对Linux操作系统下fork函数的描述是错误的 D A、fork函数执行一次返回两个值

B、新进程称为子进程,而原进程称为父进程 C、父进程返回值为子进程的进程号 D、子进程返回值为父进程的进程号

下面哪项对Linux操作系统下exit( )和_exit( )函数的描述是错误的 C

A、_exit( )函数的作用是直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构

B、exit()函数在调用exit退出系统之前要检查文件的打开情况 C、exit()函数直接将进程关闭,此时缓冲区中的数据将会丢失 D、想保证数据的完整性,就一定要使用exit()函数。

下面哪项对Linux操作系统下wait和waitpid函数的描述是错误的 D

A、wait函数用于使父进程(即调用wait的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止

B、wait函数调用时,如果该父进程没有子进程或者他的子进程已经结束,则wait就会立即返回。

C、waitpid函数用于使父进程(即调用wait的进程)阻塞,并可提供一个非阻塞版本的wait功能

D、waitpid函数不支持作业控制

编写守护进程的第一步为 A A、创建子进程,父进程退出 B、在子进程中创建新会话 C、改变当前目录为根目录 D、关闭文件描述符

下面哪项对Linux操作系统下setsid函数的描述是错误的 D A、用于创建一个新的会话,并担任该会话组的组长 B、让进程摆脱原会话的控制 C、让进程摆脱原进程组的控制 D、让进程摆脱init进程的控制

TCP/IP协议模型中不包括下面哪项 A A、物理层 B、网络接口层 C、网络层 D、传输层

在关于TCP/UDP的描述中,下面哪项是错误的 C

A、TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递 B、TCP对话通过三次握手来完成初始化

C、UDP即用户数据报协议是一种面向连接的协议 D、一个UDP应用可同时作为应用的客户或服务器方

常见的socket类型中不包括下面哪项 C A、SOCK_STREAM B、SOCK_DGRAM C、SOCK_DTRAN D、SOCK_RAW

在关于ICMP协议的描述中,下面哪项是错误的 B A、ICMP是IP层的一个协议

B、ICMP报文的最终报宿是报宿计算机上的一个用户进程

C、当一个带有错误信息的ICMP报文到达时,由IP软件模块负责处理 D、每种ICMP报文都有不同的格式

在关于设备驱动的描述中,下面哪项是错误的 D A、操作系统通过各种驱动程序来驾驭硬件设备 B、操作系统为硬件提供统一的操作方式 C、操作系统最基本的组成部分是硬件驱动程序

D、常见的驱动程序作为内核模块动态加载,比如声卡驱动、网卡驱动、CPU、PCI总线等

在关于模块相关命令的描述中,下面哪项是错误的 D A、lsmod列出当前系统中加载的模块 B、rmmod用于将当前模块卸载 C、cpmod用于将模块复制到用户空间 D、insmod用于加载当前模块

在关于设备驱动程序的描述中,下面哪项是错误的 D

A、Linux设备驱动程序包含中断处理程序和设备服务子程序两部分 B、设备控制器需要获得系统服务时采用查询和中断两种方式 C、设备服务子程序包含了所有与设备操作相关的处理代码 D、设备服务子程序对设备控制器执行操作,不接受用户命令

Linux设备驱动程序与外界的接口不包括下面哪项。 B A、驱动程序与操作系统内核的接口 B、驱动程序与用户的接口 C、驱动程序与设备的接口 D、驱动程序与系统引导的接口

打开设备的接口函数是open,通常情况下在open函数中要完成的工作中不包括下面哪项 D A、递增计数器

B、检查特定设备的特殊情况 C、初始化设备 D、释放设备

在关于内存分配函数的描述中,下面哪项是错误的 B A、kmalloc函数开辟的内存基于内存地址 B、kmalloc函数申请空间无大小限制 C、kmalloc函数不会对所获取的内存空间清零 D、kmalloc函数返回物理地址

键盘模式中不包括下面哪项 C A、ASCII mode(XLATE)模式模式 B、Keycode mode(MEDIUMRAW)模式 C、Multi mode(MULTI)模式 D、Scancode mode(RAW)模式

键盘相关码表中不包括下面哪项 C A、扫描码 B、键盘码 C、扩展码

D、Keymap表

open函数的原型函数为说明 A

A、int open(const char *pathname,flags,int perms) B、ssize_t open(int fd,void *buf,size_t count) C、FILE *open(const char * path,const char * mode) D、off_t open(int fd,off_t offset,int whence)

read函数的原型函数为说明 B

A、int read(const char *pathname,flags,int perms) B、ssize_t read(int fd,void *buf,size_t count) C、FILE *read(const char * path,const char * mode) D、off_t read(int fd,off_t offset,int whence)

lseek函数的原型函数为说明 D

A、int lseek(const char *pathname,flags,int perms) B、ssize_t lseek(int fd,void *buf,size_t count) C、FILE *lseek(const char * path,const char * mode) D、off_t lseek(int fd,off_t offset,int whence)

fcntl函数的原型函数为说明 B

A、int fcntl(const char *pathname,flags,int perms) B、int fcnt1(int fd,int cmd,struct flock *lock) C、FILE *fcntl(const char * path,const char * mode)

D、int fcntl(int numfds,fd_set *readfds,fd_set *writefds,fd_set *exeptfds,struct timeval *timeout)

select函数的原型函数为说明 B

A、int select(const char *pathname,flags,int perms) B、int select(int fd,int cmd,struct flock *lock) C、FILE *select(const char * path,const char * mode)

D、int select(int numfds,fd_set *readfds,fd_set *writefds,fd_set *exeptfds,struct timeval *timeout)

fopen的原型函数为 A

A、FILE * fopen(const char * path,const char * mode) B、int fopen(FILE * stream)

C、size_t fopen(void * ptr,size_t size,size_t nmemb,FILE * stream) D、size_t fopen(const void * ptr,size_t size,size_t nmemb,FILE * stream)

socket函数的函数原型是 A

A、int socket(int family, int type, int protocol)

B、int socket(int sockfd,struct sockaddr *my_addr, int addrlen) C、int socket(int sockfd, int backlog)

D、int socket(int sockfd, struct sockaddr *serv_addr, int addrlen)

判断题

RAM的访问速度比较快,但掉电后数据会丢失。

1

ROM掉电后数据不会丢失。

1

人们通常所说的内存即指系统中的ROM。 2

SRAM利用双稳态触发器保存信息,只要不掉电,信息不会丢失。 1

DRAM是利用MOS(金属氧化物半导体)电容存储电荷来储存信息,可不通过充电来维持信息。 2

Flash具有和ROM一样掉电不会丢失的特性,因此被称为Flash ROM。 1

ARM7处理器采用3级流水线设计。 1

ARM9处理器采用3级流水线设计。 2

ARM7处理器采用哈佛结构。 2

ARM9处理器采用哈佛结构。 1

嵌入式软件开发一般采用“宿主机-目标机”开发模式。 1

一般把进行交叉编译的主机称为目标机。 2

一般把程序实际的运行环境称为宿主机。 2

嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分。 1

在Linux操作系统安装过程中可进行网络配置。 1

Linux操作系统不可以与MS-DOS、Windows等其它操作系统共存于同一台机器上。 2

Linux操作系统主要的系统配置文件主要存放在/var/目录。 2

在Linux操作系统下,目录结构属于分区。 2

在Linux操作系统下,文件系统是一个文件树。 1

可以采用图形化登录和虚拟控制台登录两种方式登录Linux系统。 1

shell是一个命令解释器。 1

可以在shell提示下或图形方式下创建用户帐号。 1

Shell是命令语言、命令解释程序及程序设计语言的统称。 1

Shell拥有自己内建的命令集,不能被系统中其他应用程序所调用。 2

Shell是一种Linux操作系统中的命令行解释程序。 1

rm命令可删除文件或目录,其主要差别就是是否使用递归开关 -f。 2

mv命令可以移动文件和目录,还可以为文件和目录重新命名。 1

cp命令可以复制文件和目录,但是不可以为文件和目录重新命名。 2

在Linux操作系统中,使用ipconfig查看和配置网络接口的地址和参数。 2

在Linux操作系统中,使用ifconfig配置的网络设备参数不需重启就可生效。 1

在Linux操作系统中,使用ifconfig配置的网络设备参数在系统重新启动以后将会失效。 1

在Linux操作系统中使用ping测试计算机和网络上的其他计算机是否连通。 1

Bootloader是在操作系统内核运行之前运行的一段程序。 1

由于Bootloader严重依赖于硬件实现,嵌入式系统中没有一个通用的Bootloader。 1

虽然Bootloader严重依赖于硬件实现,但是Bootloader的设计与实现有一些通用的概念。 1

Bootloader仅依赖于CPU的体系结构,不依赖于具体的嵌入式板级设备配置。 2

大多数Bootloader都包含“启动加载”和“下载”两种不同操作模式。 1

Bootloader启动流程一般可分为stage1、stage2、stage3三个阶段。 2

Linux内核中不同的目录结构里都有相应的Makefile。 1

U-Boot源码结构和Linux内核源码结构非常类似。 1

Bootloader设计与实现过程中不推荐使用C语言。 2

FTP内部命令中使用close命令中断与远程服务器的FTP会话。

1

FTP内部命令中使用exit命令退出FTP会话过程。 1

FTP内部命令中使用mkdir命令在本地主机中建一目录。 2

FTP内部命令中使用dir命令显示远程主机中的文件和目录信息。 1

FTP内部命令中使用pwd命令显示本地主机的当前路径。 2

FTP内部命令中使用lcd命令显示本地主机的当前路径。 1

用户可通过进程控制相关的系统调用来创建进程、实现进程调度、进程管理等。 1

用户进程允许访问内核数据,可以使用内核函数。 2

系统调用规定用户进程进入内核空间的具体位置。 1

用户程序可以通过系统调用获得操作系统内核提供的服务。 1

Linux系统调用编程接口主要通过C库实现。 1

一个API函数通常需要几个系统调用来共同完成函数的功能,但是还有一些API函数不需要调用相应的系统调用。( 1

Linux用户编程接口(API)遵循POSIX标准。 1

系统命令相对API更高一层,它的内部引用用户编程接口(API)来实现相应的功能。 1

标准I/O提供流缓冲的目的是尽可能减少使用read和write调用的数量。 1

标准I/O提供3种类型的缓冲存储类型,包括全缓冲,行缓冲和帧缓冲。 2

并行通信传输速度快,适用于短距离通信,但要求传输速度较高的应用场合。 1

用户常见的数据通信的基本方式可分为网络通信与串行通信两种。 2

串行通信通信线路简单,成本低,适用于远距离通信,但传输速度慢的应用场合。 1

对文件的操作使用文件描述符进行,对设备的操作使用设备描述符进行。 2

Linux中的文件主要分为4种:普通文件、目录文件、链接文件和可执行文件。 2

当一个进程终止时,它所有已打开的文件都由内核自动关闭。 1

文件是Linux操作系统中最常见最基础的操作对象。 1

进程是系统的基本调度单位。 1

进程是一个程序的一次执行的过程。 1

进程通过文件描述符来描述。 2

Linux操作系统中调用函数getpid获得当前进程的PID和PPID。 2

在Linux操作系统中,进程的执行模式划分为用户模式和root模式。 2

Linux操作系统中创建一个新进程的唯一方法是使用fork函数。 1

Linux操作系统中,fork函数用于从已存在进程中创建一个新进程。

使用fork函数得到的子进程是父进程的一个复制品,它从父进程处继承了整个进程的地址空间。 1

fork函数使用多少次就创建多少个进程。 1

exec函数族就提供了一个在进程中启动另一个程序执行的方法。 1

当程序执行到exit或_exit时,进程会无条件地停止剩下的所有操作,清除包括PCB在内的各种数据结构,并终止本进程的运行。 1

wait函数是waitpid函数的一个特例,在Linux操作系统内部实现wait函数时直接调用的就是waitpid函数。 1

守护进程,即通常所说的Daemon进程,是Linux操作系统中的后台服务进程。 1

守护进程的生存期较长。 1

守护进程常常在终端打开时启动,在终端关闭时终止。 2

Linux系统有很多守护进程,大多数服务都通过守护进程实现。 1

在Linux系统中,每一个系统与用户进行交流的界面称为图形用户界面。 2

每一个从终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。 1

守护进程不因为用户或终端或其他的变化而受影响。 1

会话组是一个或多个进程组的集合。 1

一个会话通常开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。 1

syslog是Linux操作系统中的系统日志管理服务,通过守护进程syslogd来维护。 1

在Linux系统中,每当系统发现一个孤儿进程,就会自动由init进程收养它。 1

守护进程中用printf输出的字符可以在终端上显示出来。 2

OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下共分为7层。 1

TCP/IP协议模型将TCP/IP的7层协议模型简化为3层。 2

TCP/IP协议模型是一个庞大的协议族。 1

ping命令是基于TCP协议的。 2

TCP协议和UDP协议都是处于网络层的协议。 2

socket接口是一种特殊的I/O,也是一种文件描述符。 1

有时将内核模块也称做驱动程序,因此,加载驱动时就是加载内核模块。 1

mknod用于创建相关模块。 1

insmod可以根据模块间依存关系以及/etc/modules.conf文件中的内容自动插入模块。 2

设备通常在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在。 1

设备文件(即设备节点)可通过mknod命令来创建,其中指定了主设备号和次设备号。 1

大多设备以查询方式向设备驱动程序发出输入/输出请求。 2

设备驱动程序是内核的一部分,如果驱动程序出错,则可能导致系统崩溃。 1

设备驱动程序必须为内核或者其子系统提供一个标准接口。 1

设备驱动程序使用一些标准的内核服务

1

设备驱动开发时模块在调用insmod命令时被加载,此时的入口点是main函数。

2

模块在调用insmod命令时被加载,通常在init_module函数中完成设备注册。 1

内核空间使用printk和printf函数实现信息打印。 2

proc伪文件系统让用户可以和内核内部数据结构进行交互,获取有关进程的有用信息。 1

proc存在于内存和硬盘上。 2

块设备驱动程序包括一个request请求队列。 1

Linux操作系统顶层运行的GUI系统兼容X标准的XFree86系统。 1

Qt使用单一的API进行跨平台的编程。 1

GUI是指计算机与其使用者之间的对话接口。 1

Qt/E基于一个X服务器或是Xlib库。 2

Qt的核心机制是信号和插槽。 1

填空题

嵌入式的英文为____。 EMBEDDED

Linux操作系统下的程序开发一般均遵守____协议。

GPL

Linux内核版本号格式是x.y.zz-www,数字x代表版本类型,数字y为____时是稳定版本。 偶数

Linux内核版本号格式是x.y.zz-www,数字x代表版本类型,数字y为____时是开发版本。 奇数

Linux操作系统的文件系统是一个____。 文件树

Linux常见的默认文件系统为____。 EXT3

Linux中把DOS中采用的FAT文件系统(包括FAT12,FAT16 和FAT32)称为____文件系统。 VFAT

硬盘可分为主分区、扩展分区、____。 逻辑分区

Linux系统中具有超级权限的用户称为____用户。 ROOT

Linux下与设备相关的文件一般都在/____目录下。 DEV

Linux 对目录和设备都当作____来进行处理。 文件

将分区与目录相对应的过程叫做____。 挂载

块设备文件是指数据的读写以____为单位的设备。 块

Linux 中文件属性第一个字符“d”表示____文件。 目录

Linux下软驱、光驱、硬盘的挂载点一般位于/____目录下。 MNT

服务的日志信息一般位于/____目录下。 VAR

Linux中添加用户账号的命令为____。 USERADD

Linux中显示当前系统中由该用户运行的进程列表的命令为____。 PS

Linux中改变工作目录的命令为____。 CD

Linux中建立符号链接的命令为____。 LN

Linux中对目录进行打包的命令为____。 TAR

Linux中显示网络连接、路由表和网络接口信息命令为____。 NETSTAT

FTP内部命令中使用____切换本地工作目录。 LCD

Linux中最常用的编译器是____编译器。 GCC

vi有3种模式,分别为命令行模式、插入模式及____模式。 底行

编辑器按功能可以分为____编辑器和全屏幕编辑器两大类。 行

gdb对____文件进行调试。 可执行

工程管理器make读入的配置文件为____。 MAKEFILE

工程管理器make定义了____规则和模式规则。 隐式

ARM处理器支持____(16 位)/ARM(32 位)双指令集。 THUMB

ARM处理器支持16 位/____位器件。 8

大端格式中,数据的高字节存储在____地址中 。 低

小端格式中,数据的高字节存储在____地址中 。 高

ARM7处理器采用____级流水线设计。 3

嵌入式软件开发所采用的编译过程为____编译。 交叉

在嵌入式软件开发中,将程序实际的运行环境称为____机。 目标

____标准所采用的主要技术为边界扫描技术。 JTAG

arm-linux-gcc 交叉编译工具主要包括binutils、____、glibc等软件。 GCC API即____。 用户编程接口

API遵循UNIX中的应用编程界面标准____。 POSIX

操作系统提供给用户程序调用的一组“特殊”接口称为____。 系统调用

进行系统调用时,程序运行空间需要从用户空间进入____空间,处理完后再返回到用户空间。 内核

系统调用编程接口主要通过C库(____)实现。 LIBC

一个进程启动时,通常都会打开____个文件。 3

不带缓存的文件I/O操作,主要用到的5个函数为open、close、read、write和____。 LSEEK

fopen函数返回一个____。 指针

____通信是指利用多条数据传输线将一个资料的各位同时传送。 并行

在Linux中,实现文件上锁的函数有lock和____。 FCNTL

Linux中最常见最基础的操作对象是____。 文件

当用户在系统中键入命令执行一个程序的时候,它将启动一个____。 进程

系统调度的单位____。 进程

____包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。 进程控制块

进程执行态说明该进程正在执行,即进程正在占用____。 CPU

Linux系统是一个____进程的系统。

Daemon进程即通常所说的____进程,是Linux中的后台服务进程。。 守护

在Linux中使用____函数创建一个新进程。 FORK

fork函数调用后出现父进程与子进程,其中____的返回值为0。 子进程

____函数族就提供了一个在进程中启动另一个程序执行的方法。 EXEC

exit()函数与_exit()函数最大的区别就在于____函数在exit系统调用之前要检查文件的打开情况,并将文件缓冲区中的内容写回文件。 EXIT()

____函数是用于使父进程阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。 WAIT

在Linux中,所有的孤儿进程自动由____进程收养。 INIT

____函数用于创建一个新的会话,并担任该会话组的组长。 SETSID

系统日志文件位于/____目录下。 VAR/LOG

TCP/IP的协议参考模型包括网络接口层、____、传输层和应用层。 网络层

TCP为协议参考模型包中____层的协议。 传输

____对话通过三次握手来完成初始化。 TCP

对数据要求高可靠性的应用应选择____协议。 TCP

Linux中的网络编程通过____接口来进行。 SOCKET

SOCK_DGRAM为____套接字。 数据报

在实验中,实验平台采用的CPU为Intel____处理器。 XSCALL

在内核更新与加载实验中,设置的串口波特率为____。 115200

在内核更新与加载实验中,设置的串口数据位为____。 8

在内核更新与加载实验中,设置的数据流控制为____。 无

在内核更新与加载实验中,设置的数据停止位为____。 1

在内核更新与加载实验中,实验平台上使用的串口为COM____。 1

在内核更新与加载实验中,内核映像的后缀部分为____。 ZIMAGE

在内核更新与加载实验中,通过____将内核映像下载到实验平台。

USB

压缩的内核映像通常名为____。 ZIMAGE

未压缩的内核映像通常名为____。 VMLINUX

操作系统内核运行之前运行的一段程序称为____。 BOOTLOADER

程序设计题

下面的程序打开一个文件,并设置该文件权限为0666。请选出应填写在空白处的选项。 int main(void) { int fd; if((fd = open(\O_CREAT | O_TRUNC | O_WRONLY , 0666 ))<0) { perror(\ exit(1); } else { printf(\file: hello.c %d\\n\ } if( __________ ) { perror(\ exit(1); } else printf(\ exit(0); }

A、open(fd) > 0 B、open(fd) < 0 C、close(fd) > 0 D、close(fd) < 0 4

下面的程序打开一个文件,写入字符串“Hello! I'm writing to this file!”,使用lseek 函数将文件指针移到文件开始处,并读出10个字节并将其打印出来。请选出应填写在空白处的选项。 int main(void) { int i,fd,size,len; char *buf=\ char buf_r[10]; len = strlen(buf); if((fd = open(\O_RDWR,0666 ))<0) { perror(\ exit(1); } else printf(\file:hello.c %d\\n\ if((size = write( fd, buf, len)) < 0) { perror(\ exit(1); } else printf(\ lseek( __________ ); if((size = read( fd, buf_r, 10))<0) { perror(\ exit(1); } else printf(\form file:%s\\n\ if( close(fd) < 0 ) { perror(\ exit(1); } else printf(\ exit(0); } A、fd, 0, SEEK_CUR B、fd, 0, SEEK_END C、fd, 0, SEEK_SET 3

下面的程序说明文件记录锁函数。首先给flock 结构体的对应位赋相应值,接着使用两次fcntl函数分别用于给相关文件上锁和判断文件是否可以上锁,这里用到的cmd值分别为F_SETLK 和F_GETLK。请选出应填写在空白处的选项。 void lock_set(int fd, int type) { struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len =0; while(1) { lock.l_type = type; if( __________ ) { if( lock.l_type == F_RDLCK ) printf(\lock set by %d\\n\ else if( lock.l_type == F_WRLCK ) printf(\lock set by %d\\n\ else if( lock.l_type == F_UNLCK ) printf(\lock by %d\\n\ return; } fcntl(fd, F_GETLK, &lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf(\lock already set by %d\\n\ else if( lock.l_type == F_WRLCK ) printf(\ getchar(); } } } A、(fcntl(fd, F_SETLK, &lock)) < 0 B、(fcntl(fd, F_SETLK, &lock)) == 0 C、(fcntl(fd, F_SETLK, &lock)) > 0 2

下面的程序测试文件的写入锁。首先创建hello文件,之后对其上写入锁,最后释放写入锁。请选出应填写在空白处的选项。 int main(void) { int fd; fd=open(\| O_CREAT, 0666); if(fd < 0) { perror(\ exit(1); } __________; getchar(); lock_set(fd, F_UNLCK); getchar(); close(fd); exit(0); } void lock_set(int fd, int type) { struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len =0; while(1) { lock.l_type = type; if((fcntl(fd, F_SETLK, &lock)) == 0 ) { if( lock.l_type == F_RDLCK ) printf(\

by %d\\n\ else if( lock.l_type == F_WRLCK ) printf(\lock set by %d\\n\ else if( lock.l_type == F_UNLCK ) printf(\lock by %d\\n\ return; } fcntl(fd, F_GETLK,&lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf(\lock already set by %d\\n\ else if( lock.l_type == F_WRLCK ) printf(\set by %d\\n\ getchar(); } } } A、lock_set(fd, F_RDLCK) B、lock_set(fd, F_WRLCK) C、lock_set(fd, O_RDONLY) D、lock_set(fd, O_WRONLY) 2

下面的程序测试文件的读取锁。首先创建hello文件,之后对其上读取锁,最后释放读取锁。请选出应填写在空白处的选项。 int main(void) { int fd; fd=open(\| O_CREAT, 0666); if(fd <0) { perror(\ exit(1); } __________; getchar(); lock_set(fd, F_UNLCK); getchar(); close(fd); exit(0); } void lock_set(int fd, int type) { struct flock lock; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len =0; while(1) { lock.l_type = type; if((fcntl(fd, F_SETLK, &lock)) == 0 ) { if( lock.l_type == F_RDLCK ) printf(\by %d\\n\ else if( lock.l_type == F_WRLCK ) printf(\lock set by %d\\n\ else if( lock.l_type == F_UNLCK ) printf(\lock by %d\\n\ return; } fcntl(fd, F_GETLK,&lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf(\lock already set by %d\\n\ else if( lock.l_type == F_WRLCK ) printf(\set by %d\\n\ getchar(); } } } A、lock_set(fd, F_RDLCK) B、lock_set(fd, F_WRLCK) C、lock_set(fd, O_RDONLY) D、lock_set(fd, O_WRONLY) 1

下面的程序打开一个文件,写入字符串并读出。请选出应填写在空白处的选项。 int main() {

FILE

*stream;

char

s[3]={'a','b','c'};

stream=fopen(\

i=fwrite( __________ ); printf(\ fclose(stream); } A、s,sizeof(char),nmemb,stream B、s,char,nmemb,fd

C、s,sizeof(char),nmemb,FILE D、s,char,nmemb,FILE 4

下面的程序获得当前进程的PID。请选出应填写在空白处的选项。 int main() { printf(\A、getpid() B、getppid()

C、open(fd, pid) D、fopen(stream, pid) 1

下面的程序判断fork函数返回值的情况。请选出应填写在空白处的选项。 int main(void) { pid_t result; __________; if(result == -1) { perror(\ exit; } else if(result == 0) { printf(\return value is %d\\nIn child process!!\\nMy PID is%d\\n\ } else { printf(\return value is %d\\nIn father process!!\\nMy PID is%d\\n\ } } A、result = fork() B、result = fork(-1) C、result = fork(0) D、result = fork(1) 1

下面的程序判断fork函数返回值的情况。请选出应填写在空白处的选项。 int main(void) { pid_t result; result = fork() ; if(result == -1) { perror(\ exit; } else if( __________ ) { printf(\return value is %d\\n In father process!!\\nMy PID is%d\\n\ } else { printf(\return value is %d\\n In child process!!\\nMy PID is%d\\n\ } } A、result < 0 B、result == 0 C、result > 0 D、result !== 0 4

下面的程序使用文件名的方式来查找可执行文件,同时使用参数列表的方式。请选出应填写在空白处的选项。 int main() { if(fork()==0) { /*此处相当于调用“ps -ef”命令*/ if( __________ (\ perror(\ } } A、execl B、execle C、execlp D、execve 3

下面的程序使用使用完整的文件目录来查找对应的可执行文件,同时使用参数列表的方式。请选出应填写在空白处的选项。 int main() { if(fork()==0) { /*注意此处已给出ps命令所在的完整路径*/ if( __________ (\ perror(\ } } A、execl B、execle C、execlp D、execve 1

下面的程序将环境变量添加到新建的子进程中去,这里的“env”是查看当前进程环境变量的命令使用使用完整的文件目录来查找对应的可执行文件,同时使用参数列表的方式。请选出应填写在空白处的选项。 命令的完整路径*/ perror(\ } } A、execl B、execle C、execlp D、execve 2

下面的程序将环境变量添加到新建的子进程中去,这里的“env”是查看当前进程环境变量的命令使用使用完整的文件目录来查找对应的可执行文件。请选出应填写在空白处的选项。 int main() { /*命令参数列表,必须以NULL结尾*/ char *arg[]={\ char *envp[]={\ if(fork()==0) { if( __________ (\ perror(\ } } A、execl B、execle C、execlp D、execve 4

下面的程序为服务器端应用程序,首先建立起socket,然后调用本地端口进行绑定,接着开始与客户端建立联系,并接收客户端发送的消息。请选出应填写在空白处的选项。 #define SERVPORT 3333 #define BACKLOG 10 #define MAX_CONNECTED_NO 10 #define MAXDATASIZE 5 int main() { struct sockaddr_in server_sockaddr,client_sockaddr; int sin_size,recvbytes; int sockfd,client_fd; char buf[MAXDATASIZE]; /*建立socket连接*/ if( __________ ) { perror(\ exit(1); } printf(\success!,sockfd=%d\\n\ /*设置sockaddr_in 结构体中相关参数*/ server_sockaddr.sin_family=AF_INET;

server_sockaddr.sin_port=htons(SERVPORT);

server_sockaddr.sin_addr.s_addr=INADDR_ANY; bzero(&(server_sockaddr.sin_zero),8); /*绑定函数bind*/ if(bind(sockfd,(struct sockaddr *)&server_sockaddr,sizeof(struct sockaddr))== -1) { perror(\ exit(1); } printf(\success!\\n\ /*调用listen函数*/ if(listen(sockfd,BACKLOG)== -1) { perror(\ exit(1); } printf(\ /*调用if((client_fd=accept(sockfd,(struct

acceptsockaddr

函数,等待客户端的连接*/ *)&client_sockaddr,&sin_size))==

-1)

{

-1)

if(

__________

int

main()

{

char

*envp[]={\ if(fork()==0) { /*注意此处已给出env

(\

{ perror(\ exit(1); } /*调用recv函数接收客户端的请求*/ if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))== A、(sockfd = socket(AF_INET,SOCK_STREAM,0))== -1 B、(sockfd = socket(AF_INET,SOCK_STREAM,0))== 0 C、(sockfd = socket(AF_INET,SOCK_STREAM,-1))== -1

perror(\

exit(1); } printf(\ close(sockfd); }

D、(sockfd = socket(AF_INET,SOCK_STREAM,-1))== 0 1

下面的程序为客户器端应用程序,客户端在建立起socket之后调用connect函数来建立连接。请选出应填写在空白处的选项。 #define SERVPORT 3333 #define MAXDATASIZE 100 main(int argc,char *argv[]) { int sockfd,sendbytes; char buf[MAXDATASIZE]; struct hostent *host; struct sockaddr_in serv_addr; if(argc < 2) { fprintf(stderr,\enter the server's hostname!\\n\ exit(1); } /*地址解析函数*/ if((host=gethostbyname(argv[1]))==NULL) { perror(\ exit(1); } /*创建socket*/ if( __________ ) { perror(\ exit(1); } /*设置sockaddr_in

结构体中相关参数*/

serv_addr.sin_family=AF_INET;

in_addr

serv_addr.sin_port=htons(SERVPORT);

serv_addr.sin_addr=*((struct

*)host->h_addr); bzero(&(serv_addr.sin_zero),8); /*调用connect函数主动发起对服务器端的连接*/ if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))== -1) { perror(\ exit(1); } /*发送消息给服务器端*/ if((sendbytes=send(sockfd,\-1) { perror(\ exit(1); } close(sockfd); }

A、(sockfd = socket(AF_INET,SOCK_STREAM,0))== 0 B、(sockfd = socket(AF_INET,SOCK_STREAM,0))== -1 C、(sockfd = socket(AF_INET,SOCK_STREAM,-1))== 0 D、(sockfd = socket(AF_INET,SOCK_STREAM,-1))== -1 2

下面的程序首先新建一子进程,然后让其子进程暂停5s。接下来对原有的父进程使用阻塞函数,并使用参数使该父进程不会阻塞。若有子进程退出,则阻塞函数返回子进程号;若没有子进程退出,则阻塞函数返回0,并且父进程每隔一秒循环判断一次。请选出应填写在空白处的选项。 int main() { pid_t pc,pr; __________; if(pc<0) printf(\\\n\ /*子进程*/ else if(pc==0) { /*子进程暂停5s*/ sleep(5); /*子进程正常退出*/ exit(0); } /*父进程*/ else { /*循环测试子进程是否退出*/ do { /*调用waitpid,且父进程不阻塞*/ pr=waitpid(pc,NULL,WNOHANG); /*若子进程还未退出,则父进程暂停1s*/ if(pr==0) { printf(\not exited\\n\ sleep(1); } } while(pr==0); /*若发现子进程退出,打印出相应情况*/ if(pr==pc) printf(\child %d\\n\ else printf(\error occured.\\n\ } } A、pc=fork() B、pc=open(pr) C、pc=pr D、pr=pc 1

下面的程序首先新建一子进程,然后让其子进程暂停5s。接下来对原有的父进程使用阻塞函数,并使用参数使该父进程不会阻塞。若有子进程退出,则阻塞函数返回子进程号;若没有子进程退出,则阻塞函数返回0,并且父进程每隔一秒循环判断一次。请选出应填写在空白处的选项。 int main() { pid_t pc,pr; pc=fork() if(pc<0) printf(\

/*子进程*/ else if(pc==0) { /*子进程暂停5s*/ sleep(5); /*子进程正常退出*/ exit(0); } /*父进程*/ else { /*循环测试子进程是否退出*/ do { /*调用阻塞函数,且父进程不阻塞*/ __________; /*若子进程还未退出,则父进程暂停1s*/ if(pr==0) { printf(\child process has not exited\\n\ sleep(1); } } while(pr==0); /*若发现子进程退出,打印出相应情况*/ if(pr==pc) printf(\ else printf(\ } } A、pc=wait(pc,NULL,WNOHANG) B、pc=waitpid(pc,NULL,WNOHANG) C、pr=wait(pc,NULL,WNOHANG) D、pr=waitpid(pc,NULL,WNOHANG) 4

下面的程序建立一个守护进程,该守护进程每隔10s在/tmp/dameon.log中写入一个字符串。请选出应填写在空白处的选项。 #define MAXFILE 65535 int main() { pid_t pc; int i,fd,len; char *buf=\is a Dameon\\n\ len =strlen(buf); /*第一步*/ __________; if(pc<0) { printf(\\\n\ exit(1); } else if(pc>0) exit(0); /*第二步*/ setsid(); /*第三步*/ chdir(\ /*第四步*/ umask(0); /*第五步*/ for(i=0;i

*/

while(1)

if((fd=open(\

{ perror(\ exit(1); } write(fd, buf, len+1); close(fd); sleep(10); } } A、pc=fork() B、fd=open(pc) C、pc=fd D、pc=open(buf) 1

下面的程序建立一个守护进程,该守护进程每隔10s在/tmp/dameon.log中写入一个字符串。请选出应填写在空白处的选项。 #define MAXFILE 65535 int main() { pid_t pc; int i,fd,len; char *buf=\is a Dameon\\n\ len =strlen(buf); /*第一步*/ pc=fork(); if(pc<0) { printf(\\\n\ exit(1); } else if(pc>0) exit(0); /*第二步*/ setsid(); /*第三步*/ chdir(\ /*第四步*/ umask(0); /*第五步*/ __________ close(i); /*守护进程创建完成,以下开始正式进入守护进程工作*/ while(1) {

if((fd=open(\

{ perror(\ exit(1); } write(fd, buf, len+1); close(fd); sleep(10); } } A、for(i=3;i< MAXFILE;i--) B、for(i=0;i< MAXFILE;i--) C、for(i=3;i< MAXFILE;i++) D、for(i=0;i< MAXFILE;i++) 4

hello.c和hello.h位于同一目录下,源代码如下所示。 /*hello.c*/ int main() { printf(\everyone!\\n\} /*hello.h*/ #include 要求编写Makefile文件实现对这两个文件的编译,Makefile文件如下所示。请选出应填写在空白处的选项。 /*Makefile*/

hello:hello.c hello.h __________ A、gcc hello.c&hello.h -o hello B、gcc hello.c hello.h -o hello C、make hello.c&hello.h -o hello D、make hello.c hello.h -o hello 2

下面的程序建立一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。子进程退出后,守护进程循环暂停,其间隔时间为10s。子进程和守护进程的退出消息均在/var/log/messages中输出。请选出应填写在空白处的选项。 #define MAXFILE 65535 int main(void) { pid_t child1,child2; int i; child1 = fork(); if( __________ ) { perror(\fork\ exit(1); } else if( child1 > 0 ) exit( 0 ); openlog(\LOG_PID, LOG_DAEMON); setsid(); chdir( \ umask( 0 ); for( i = 0 ; i < MAXFILE ; i++ ) { close( i ); } child2 = fork(); if( child2 == -1 ) { perror(\fork\ exit(1); } else if( child2 == 0 ) { syslog( LOG_INFO, \ sleep(10); syslog( LOG_INFO, \child2 is going to exit! \ exit(0); } else { waitpid( child2, NULL, 0); syslog( LOG_INFO , \child1 noticed that child2 has exited \ closelog(); while(1) { sleep(10); } } } A、child1 == -1 B、child1 == 0 C、child1 > 0 D、child1 >= 0 1

下面的程序实现对文件属性的查询。请选出应填写在空白处的选项。 static int get_file_size_time(const

char

*filename) { {

struct

stat stat

statbuf; on %s }

if(stat(filename,&statbuf)==-1) if(S_ISDIR(statbuf.st_mode))

printf(\

Error:%s\\n\return(-1);

return(1); if(S_ISREG(statbuf.st_mode))

printf(\ return(0); } int main(int argc,char **argv) { DIR *dirp; struct dirent *direntp; int stats; if( __________ ) { printf(\filename\\n\\a\ exit(1); } if(((stats=get_file_size_time(argv1))==0)||(stats==-1))exit(1); if((dirp=opendir(argv1))==NULL) { printf(\Directory %s Error:%s\\n\

exit(1);

}

while((direntp=readdir(dirp))!=NULL) if(get_file_size_time(direntp->d_name)==-1) break; closedir(dirp); exit(1); } A、argc!=1 B、argc!=2 C、argv!=1 D、argv!=2 1

程序设计题4

下面的程序实现文件的拷贝。请选出应填写在空白处的选项。 #define BUFFER_SIZE 1024 int main(int argc,char **argv) { int from_fd,to_fd; int bytes_read,bytes_write; char bufferBUFFER_SIZE; char *ptr; if( __________ ) { fprintf(stderr,\fromfile

tofile\\n\\a\

exit(1);

} }

if((from_fd=open(argv1,O_RDONLY))==-1) { fprintf(stderr,\%s Error:%s\\n\

exit(1);

if((to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1)

{ fprintf(stderr,\%s Error:%s\\n\ exit(1); } while(bytes_read=read(from_fd,buffer,BUFFER_SIZE))

{ if((bytes_read==-1)&&(errno!=EINTR)) break; else if(bytes_read>0) { ptr=buffer; while(bytes_write=write(to_fd,ptr,bytes_read)) { if((bytes_write==-1)&&(errno!=EINTR)) break; else

if(bytes_write==bytes_read) break; else if(bytes_write>0) {

ptr+=bytes_write;

bytes_read-=bytes_write; } } if(bytes_write==-1) break; } } close(from_fd); close(to_fd); exit(0); } A、argc!=0 B、argc!=1 C、argc!=2 D、argc!=3 4

下面的程序实现对字符串倒序输出。请选出应填写在空白处的选项。 int display1 (char *string) { printf (\ __________ { char *string2; int size,i; size = strlen (string1); string2 = (char *) malloc (size + 1); for (i = 0; i< size; i++) string2[size+1] = ' '; printf(\{ char string[] = \ display1 (string); display2 (string); } A、int display2 (char *string) B、int display2 (char *string1) C、int display2 (char *string2) 2

下面的程序实现对字符串倒序输出。请选出应填写在空白处的选项。 int display1 (char *string) { printf (\original string is %s \\n\string); } int display2 (char *string1) { char *string2; int size,i; size = strlen (string1); string2 = (char *) malloc (size + 1); for (i = 0; i< size; i++) __________ ; string2[size+1] = ' '; printf(\string afterward is %s\\n\} int main () { char string[] = \ display1 (string); display2 (string); }

A、string2[size - i -1] = string1[i] B、string2[size - i ] = string1[i] C、string2[size - i + 1] = string1[i] D、string2[size - i ] = string1[i+1] 1