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、体积小、低功耗、低成本、高性能
7下面哪项不属于ARM处理器模式 A
A、管理模式(root)
B、用户模式(usr)
C、快速中断模式(fiq)
D、外部中断模式(irq)
8下面哪项为错误的说法 A
A、冯·诺依曼结构共用数据存储空间和程序存储空间,不共享存储器总线
B、哈佛结构有分离的数据和程序空间及分离的访问总线
C、哈佛结构在指令执行时,取址和取数可以进行并行操作
D、哈佛结构指令执行时效率更高
9采用下列哪项更有利于开发微型嵌入式应用系统 B
A、脚本程序语言
B、C语言或汇编语言
C、C++或SQL语言
D、HTML或XML语言 10下面哪项为一般嵌入式系统开发中不具备的环节 B
A、系统总体开发
B、数据库设计
C、嵌入式硬件开发
D、嵌入式软件开发 11在嵌入式系统开发过程中下面哪项为错误的说法 B
A、对于有些硬件和软件都可以实现的功能,需要在成本和性能上做出抉择
B、对实时性要求非常高的产品可以选择嵌入式Linux开发环境
C、嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分
D、嵌入式系统的软件开发可分为交叉编译和交叉调试两部分
12对于Linux操作系统,下面哪项说法是错误的 D
A、是一种开源的操作系统
B、提供了强大的应用程序开发环境
C、可以免费使用
D、不支持Sparc硬件平台
13使用命令chmod的数字设置,可以改变 C
A、文件的访问特权
B、目录的访问特权
C、文件/目录的访问特权
14修改文件a.txt的权限,使每个用户都可以读取和写入这个文件,相应命令为 A
A、chmod 666 a.txt
B、chmod 777 a.txt
C、chmod 755 a.txt
D、chmod 555 a.txt
15某文件的组外成员的权限为只读;所有者有全部权限;组内的权限为读与写,则该文件的权限为 D
A、467
B、674
C、476
D、764
16系统中有用户user1和user2,同属于users组。在user1用户目录下有一文件 file1,它拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,应文件拥有权限为B A、744 B、664 C、646 D、746
17某文件的权限是 -rwxr--r--,则下面描述正确的是 C
A、文件的权限值是755
B、文件的所有者对文件只有读权限
C、其他用户对文件只有读权限
D、同组用户对文件只有写权限
18某文件的原有权限是-rwxr--r--,执行chmod o+x后文件权限为 B
A、-rwxr-xr-x
B、-rwxr--r-x
C、-rwxr-xr--
D、-rw-r--r--
19 clear命令的作用是 A
A、清除终端窗口
B、关闭终端窗口
C、打开终端窗口
D、调整窗口大小 20显示当前目录中的全部文件,相应命令为 B
A、ls
B、ls -a
C、ls -l
21在Linux操作系统默认情况下,ls命令显示的可执行文件颜色为 A
A、绿色
B、蓝色
C、灰色
D、黄色
22用命令显示出文件ff的描述为-rwxr-xr-- 1 root root 599 cec 10 17:12 ff,由此可知文件ff的类型为 A
A、普通文件
B、硬链接
C、目录
D、符号链接
23用命令列出下面的文件列表,请问那一个文件是符号链接文件 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
24在Linux关机命令中,下列命令中无法实现关机的是 B
A、shutdown -h now
B、reboot
C、halt
25删除文件命令为 D
A、mkdir
B、rmdir
C、mv
D、rm
26对于tar.gz结尾的文件,采用下面哪个命令进行解压缩操作 A
A、tar xvzf
B、tar jxvf
C、tar czvf
D、tar jcvf
27对于tar.bz2结尾的文件,采用下面哪个命令进行解压缩操作 B
A、tar xvzf
B、tar jxvf
C、tar czvf
D、tar jcvf
28对于ln命令,下列哪项说法是不正确的 C
A、ln命令会保持每一处链接文件的同步性
B、软链接在用户选定的位置上生成一个文件的镜像
C、ln命令的链接文件不会重复占用磁盘空间
D、硬链接会在用户选定的位置上生成一个和源文件大小相同的文件
29在vi编辑器中执行存盘退出的命令为 D
A、:q
B、:sq
C、:q!
D、:wq
30 vi编辑器中不包括下面哪种模式 A
A、编辑模式
B、命令行模式
C、插入模式
D、底行模式
31使用vi编辑器环境时,使用:set nu显示行号,使用下面哪项命令取消行号显示 B
A、:set nuoff
B、:set nonu
C、:off nu
D、:cls nu
32在Linux内核配置过程中,下面哪项命令采用的是基于图形窗口模式的配置界面 C
A、make config
B、make menuconfig
C、make xconfig
D、make oldconfig 33在Linux内核配置过程中,下面哪项命令建立依赖关系 C
A、make config
B、make menuconfig
C、make dep
D、make clean
34交叉编译器中,下面哪项不是必需包含的 D
A、glibc
B、gcc
C、binutils
D、tmake
35内核的编译主要步骤不包括下面哪项 D
A、内核配置
B、建立依存关系
C、建立内核
D、加载内核
36内核编译时选项前的尖括号中可以是空,*,M,其中*表示 C
A、选项将编译为模块
B、不包含选项
C、包含选项
37 Bootloader的stage1阶段主要完成的工作不包括下面哪项 D
A、基本的硬件初始化
B、为加载stage2准备RAM空间
C、拷贝stage2到RAM中
D、用汇编语言跳转到main入口函数
38采用哪项运行级别为图形用户登录Linux操作系统 D
A、0
B、1
C、3
D、5
39下面关于Linux系统服务的说法哪项是错误的 B
A、INIT进程的一个重要作用就是启动Linux系统服务
B、Linux的系统服务包括独立运行的系统服务和由用户设定的服务
C、xinet能够同时监听多个指定的端口
D、xinet可以看作一个启动服务的管理服务器 40下面关于Linux系统服务的说法哪项是错误的 C
A、独立运行的系统服务的启动脚本都放在目录/etc/rc.d/init.d/中
B、不同运行级别的脚本文件目录为/etc/rc.d/rcN.d,其中N对应不用的运行级别
C、不同运行级别的脚本文件中每个对应的服务都以“C”或“S”开头,其中的C代表关闭,S代表启动
D、使用命令“service+系统服务+操作”实现对相应服务操作
41使用下面哪项命令查看系统的默认运行级别 A
A、Runlevel
B、service xinetd status
C、chkconfig --list
D、chkconfig xinetd status
42下面哪种语言GCC编译器不支持 C
A、C
B、Java
C、ASP
D、C++
43 GCC的正确编译流程为 A
A、预处理-编译-汇编-链接
B、预处理-编译-链接-汇编
C、预处理-链接-编译-汇编
D、编译-预处理-汇编-链接
44下面哪项关于GCC编译过程的说法是错误的 D
A、编译阶段GCC要检查代码规范性、是否有语法错误等,确定代码的实际要做的工作
B、汇编阶段是把编译阶段生成的.s文件转成目标文件
C、预处理阶段,GCC编译器将代码中包含的头文件编译进来
D、GCC在编译时默认使用静态库
45如需GCC提供编译过程中所有有用的报警信息,则在编译时应加入选项 B
A、-w
B、-Wall
C、-werror
D、-error
46下面哪些与GDB相关的说法是错误的 B
A、GDB能调试可执行文件
B、GDB能调试源代码
C、GDB对编译过程有要求
D、GDB支持交叉调试
47在GDB调试过程中,使用下面哪项命令设置断点,其中m代表行号 A
A、b m
B、c m
C、n m
D、s m
48一个进程启动时打开3个文件中不包括 D
A、标准输入
B、标准输出
C、标准出错处理
D、系统日志服务 49一般情况下,STDIN_FILENO对应的文件描述符为 B
A、-1
B、0
C、1
D、2
50一般情况下,STDERR_FILENO对应的文件描述符为 D
A、-1
B、0
C、1
D、2
51不带缓存的文件I/O操作函数不包括 A
A、fopen
B、read
C、write
D、open
52 open函数原型中的O_RDWR标志表示文件打开方式为 C
A、只读方式打开文件
B、可写方式打开文件
C、读写方式打开文件
D、以添加方式打开文件,在打开文件的同时,文件指针指向文件末尾
53 open函数调用错误时,函数返回值为 A
A、-1
B、0
C、1
D、2
54在Linux操作系统中,串口设备的设备名一般为 C
A、com1
B、port1
C、ttyS0
D、serl1
55串口参数主要通过设置struct termios结构体的各成员值来实现,下面哪项不是各成员值支持的设置方式 C
A、与
B、或
C、赋值
56串口参数主要通过设置struct termios结构体的各成员值来实现,下面哪项实现设置波特率参数 B A、newtio.c_cflag |= 115200 B、cfsetispeed(&newtio, B115200)
C、options.c_cflag |= B115200
D、newtio.c_cflag = ~CS115200
57当流缓冲涉及一个终端时,标准I/O典型地使用下面哪项缓冲方式 B
A、全缓冲
B、行缓冲
C、无缓冲
D、帧缓冲
58标准出错stderr产生时,标准I/O典型地使用下面哪项缓冲方式 C
A、全缓冲
B、行缓冲
C、无缓冲
D、帧缓冲
59使用fopen函数时,必需包含的头文件文件为 A
A、stdio.h
B、stdlib.h
C、errno.h
D、fcntl.h
60下面哪项是对进程概念的错误描述 D
A、进程是一个独立的可调度的活动
B、进程是一个抽象实体,当它执行某个任务时,将要分配和释放各种资源
C、进程是可以并行执行的计算部分
D、进程是保存在磁盘上的指令的有序集合
61下面哪项对进程的描述是错误的 A
A、进程是一个静态态的概念
B、进程包括动态创建、调度和消亡的整个过程。
C、进程是程序执行和资源管理的最小单位
D、当用户在系统中键入命令执行一个程序的时候,它将启动一个进程
62下面哪项对进程控制块的描述是错误的 D
A、进程控制块包含进程的描述信息
B、进程控制块包含进程的控制信息
C、进程控制块包含进程的资源信息
D、进程控制块是进程的一个静态描述
63下面哪项对进程标识的描述是错误的 B
A、PID惟一地标识一个进程
B、PPID惟一地标识一个进程
C、PID是非零的正整数
D、PPID是非零的正整数
64下面哪项对Linux操作系统下进程的模式描述是错误的 C
A、用户程序执行过程中出现系统调用或者发生中断事件,进程模式就变成内核模式
B、内核模式下运行的进程可以执行机器的特权指令
C、root用户可干扰内核模式下进程的运行
D、内核模式下运行的进程不受用户的干扰 65进程的三种状态为 C
A、准备态、执行态和退出态
B、精确态、模糊态和随机态
C、运行态、就绪态和等待态
D、手工态、自动态和自由
66下面哪项不是Linux操作系统下常见的进程调度命令 C
A、bg
B、kill
C、open
D、ps
67下面哪项对Linux操作系统下fork函数的描述是错误的 D
A、fork函数执行一次返回两个值
B、新进程称为子进程,而原进程称为父进程
C、父进程返回值为子进程的进程号
D、子进程返回值为父进程的进程号
68下面哪项对Linux操作系统下exit( )和_exit( )函数的描述是错误的 C
A、_exit( )函数的作用是直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构
B、exit()函数在调用exit退出系统之前要检查文件的打开情况
C、exit()函数直接将进程关闭,此时缓冲区中的数据将会丢失
D、想保证数据的完整性,就一定要使用exit()函数。
69下面哪项对Linux操作系统下wait和waitpid函数的描述是错误的 D
A、wait函数用于使父进程(即调用wait的进程)阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止
B、wait函数调用时,如果该父进程没有子进程或者他的子进程已经结束,则wait就会立即返回。
C、waitpid函数用于使父进程(即调用wait的进程)阻塞并可提供一个非阻塞版本的wait功能
D、waitpid函数不支持作业控制
70编写守护进程的第一步为 A
A、创建子进程,父进程退出
B、在子进程中创建新会话
C、改变当前目录为根目录
D、关闭文件描述符
71下面哪项对Linux操作系统下setsid函数的描述是错误的 D
A、用于创建一个新的会话,并担任该会话组的组长
B、让进程摆脱原会话的控制
C、让进程摆脱原进程组的控制
D、让进程摆脱init进程的控制
72 TCP/IP协议模型中不包括下面哪项 A
A、物理层
B、网络接口层
C、网络层
D、传输层
73在关于TCP/UDP的描述中,下面哪项是错误的 C
A、TCP数据传输实现了从一个应用程序到另一个应用程序的数据传递
B、TCP对话通过三次握手来完成初始化
C、UDP即用户数据报协议是一种面向连接的协议
D、一个UDP应用可同时作为应用的客户或服务器方
74常见的socket类型中不包括下面哪项 C
A、SOCK_STREAM
B、SOCK_DGRAM
C、SOCK_DTRAN
D、SOCK_RAW 75在关于ICMP协议的描述中,下面哪项是错误的 B
A、ICMP是IP层的一个协议
B、ICMP报文的最终报宿是报宿计算机上的一个用户进程
C、当一个带有错误信息的ICMP报文到达时,由IP软件模块负责处理
D、每种ICMP报文都有不同的格式
76在关于设备驱动的描述中,下面哪项是错误的 D
A、操作系统通过各种驱动程序来驾驭硬件设备
B、操作系统为硬件提供统一的操作方式
C、操作系统最基本的组成部分是硬件驱动程序
D、常见的驱动程序作为内核模块动态加载,比如声卡驱动、网卡驱动、CPU、PCI总线等 77在关于模块相关命令的描述中,下面哪项是错误的 D
A、lsmod列出当前系统中加载的模块
B、rmmod用于将当前模块卸载
C、cpmod用于将模块复制到用户空间
D、insmod用于加载当前模块
78在关于设备驱动程序的描述中,下面哪项是错误的 D
A、Linux设备驱动程序包含中断处理程序和设备服务子程序两部分
B、设备控制器需要获得系统服务时采用查询和中断两种方式
C、设备服务子程序包含了所有与设备操作相关的处理代码
D、设备服务子程序对设备控制器执行操作,不接受用户命令
79 Linux设备驱动程序与外界的接口不包括下面哪项。 B
A、驱动程序与操作系统内核的接口
B、驱动程序与用户的接口
C、驱动程序与设备的接口
D、驱动程序与系统引导的接口
80打开设备的接口函数是open ,通常情况下在open函数中要完成的工作中不包括下面哪项D A、递增计数器B、检查特定设备的特殊情况C、初始化设备D、释放设备 81在关于内存分配函数的描述中,下面哪项是错误的 B
A、kmalloc函数开辟的内存基于内存地址
B、kmalloc函数申请空间无大小限制
C、kmalloc函数不会对所获取的内存空间清零
D、kmalloc函数返回物理地址
82键盘模式中不包括下面哪项 C
A、ASCII mode(XLATE)模式模式
B、Keycode mode(MEDIUMRAW)模式
C、Multi mode(MULTI)模式
D、Scancode mode(RAW)模式
83键盘相关码表中不包括下面哪项 C
A、扫描码
B、键盘码
C、扩展码
D、Keymap表
84 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)
85 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)
86 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)
87 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)
88 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)
89 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)
90 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的访问速度比较快,但掉电后数据会丢失。
(√)ROM掉电后数据不会丢失。
(×)人们通常所说的内存即指系统中的ROM。
(√)SRAM利用双稳态触发器保存信息,只要不掉电,信息不会丢失。
(×)DRAM是利用MOS(金属氧化物半导体)电容存储电荷来储存信息,可不通过充电来维持信息。
(√)Flash具有和ROM一样掉电不会丢失的特性,因此被称为Flash ROM。
(√)ARM7处理器采用3级流水线设计。
(×)ARM9处理器采用3级流水线设计。
(×)ARM7处理器采用哈佛结构。
(√)ARM9处理器采用哈佛结构。
(√)嵌入式软件开发一般采用“宿主机-目标机”开发模式。
(×)一般把进行交叉编译的主机称为目标机。
(×)一般把程序实际的运行环境称为宿主机。
(√)嵌入式系统的软件开发与通常软件开发的区别主要在于软件实现部分。
(√)在Linux操作系统安装过程中可进行网络配置。
(×)Linux操作系统不可以与MS-DOS、Windows等其它操作系统共存于同一台机器上。
(×)Linux操作系统主要的系统配置文件主要存放在/var/目录。
(×)在Linux操作系统下,目录结构属于分区。
(√)在Linux操作系统下,文件系统是一个文件树。
(√)可以采用图形化登录和虚拟控制台登录两种方式登录Linux系统。
(√)shell是一个命令解释器。
(√)可以在shell提示下或图形方式下创建用户帐号。
(√)Shell是命令语言、命令解释程序及程序设计语言的统称。
(×)Shell拥有自己内建的命令集,不能被系统中其他应用程序所调用。
(√)Shell是一种Linux操作系统中的命令行解释程序。
(×)rm命令可删除文件或目录,其主要差别就是是否使用递归开关 -f。
(√)mv命令可以移动文件和目录,还可以为文件和目录重新命名。
(×)cp命令可以复制文件和目录,但是不可以为文件和目录重新命名。
(×)在Linux操作系统中,使用ipconfig查看和配置网络接口的地址和参数。
(√)在Linux操作系统中,使用ifconfig配置的网络设备参数不需重启就可生效。(√)在Linux操作系统中,使用ifconfig配置的网络设备参数在系统重新启动以后将会失效。 (√)在Linux操作系统中使用ping测试计算机和网络上的其他计算机是否连通。
(√)Bootloader是在操作系统内核运行之前运行的一段程序。
(√)由于Bootloader严重依赖于硬件实现,嵌入式系统中没有一个通用的Bootloader。(√)虽然Bootloader严重依赖于硬件实现,但是Bootloader的设计与实现有一些通用的概念。 (×)Bootloader仅依赖于CPU的体系结构,不依赖于具体的嵌入式板级设备配置。
(√)大多数Bootloader都包含“启动加载”和“下载”两种不同操作模式。
(×)Bootloader启动流程一般可分为stage1、stage2、stage3三个阶段。
(√)Linux内核中不同的目录结构里都有相应的Makefile。
(√)U-Boot源码结构和Linux内核源码结构非常类似。
(×)Bootloader设计与实现过程中不推荐使用C语言。
(√)FTP内部命令中使用close命令中断与远程服务器的FTP会话。
(√)FTP内部命令中使用exit命令退出FTP会话过程。
(×)FTP内部命令中使用mkdir命令在本地主机中建一目录。
(√)FTP内部命令中使用dir命令显示远程主机中的文件和目录信息。
(×)FTP内部命令中使用pwd命令显示本地主机的当前路径。
(√)FTP内部命令中使用lcd命令显示本地主机的当前路径。
(√)用户可通过进程控制相关的系统调用来创建进程、实现进程调度、进程管理等。
(×)用户进程允许访问内核数据,可以使用内核函数。
(√)系统调用规定用户进程进入内核空间的具体位置。
(√)用户程序可以通过系统调用获得操作系统内核提供的服务。
(√)Linux系统调用编程接口主要通过C库实现。
(√)一个API函数通常需要几个系统调用来共同完成函数的功能,但是还有一些API函数不需要调用相应的系统调用。
(√)Linux用户编程接口(API)遵循POSIX标准。
(√)系统命令相对API更高一层,它的内部引用用户编程接口(API)来实现相应的功能。 (√)标准I/O提供流缓冲的目的是尽可能减少使用read和write调用的数量。
(×)标准I/O提供3种类型的缓冲存储类型,包括全缓冲,行缓冲和帧缓冲。
(√)并行通信传输速度快,适用于短距离通信,但要求传输速度较高的应用场合。
(×)用户常见的数据通信的基本方式可分为网络通信与串行通信两种。
(√)串行通信通信线路简单,成本低,适用于远距离通信,但传输速度慢的应用场合。
(×)对文件的操作使用文件描述符进行,对设备的操作使用设备描述符进行。
(×)Linux中的文件主要分为4种:普通文件、目录文件、链接文件和可执行文件。
(√)当一个进程终止时,它所有已打开的文件都由内核自动关闭。
(√)文件是Linux操作系统中最常见最基础的操作对象。
(√)进程是系统的基本调度单位。
(√)进程是一个程序的一次执行的过程。
(×)进程通过文件描述符来描述。
(×)Linux操作系统中调用函数getpid获得当前进程的PID和PPID。
(×)在Linux操作系统中,进程的执行模式划分为用户模式和root模式。
(√)Linux操作系统中创建一个新进程的唯一方法是使用fork函数。
(√)fork函数使用多少次就创建多少个进程。
(√)exec函数族就提供了一个在进程中启动另一个程序执行的方法。
(√)当程序执行到exit或_exit时,进程会无条件地停止剩下的所有操作,清除包括PCB 在内的各种数据结构,并终止本进程的运行。
(√)wait函数是waitpid函数的一个特例,在Linux操作系统内部实现wait函数时直接调用的就是waitpid函数。
(√)守护进程,即通常所说的Daemon进程,是Linux操作系统中的后台服务进程。
(√)守护进程的生存期较长。
(×)守护进程常常在终端打开时启动,在终端关闭时终止。
(√)Linux系统有很多守护进程,大多数服务都通过守护进程实现。
(×)在Linux系统中,每一个系统与用户进行交流的界面称为图形用户界面。
(√)每一个从终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。
(√)守护进程不因为用户或终端或其他的变化而受影响。
(√)会话组是一个或多个进程组的集合。
(√)一个会话通常开始于用户登录,终止于用户退出,在此期间该用户运行的所有进程都属于这个会话期。
(√)syslog是Linux操作系统中的系统日志管理服务,通过守护进程syslogd来维护。
(√)在Linux系统中,每当系统发现一个孤儿进程,就会自动由init进程收养它。
(×)守护进程中用printf输出的字符可以在终端上显示出来。
(√)OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下共分为7层。 (×)TCP/IP协议模型将TCP/IP的7层协议模型简化为3层。
(√)TCP/IP协议模型是一个庞大的协议族。
(×)ping命令是基于TCP协议的。
(×)TCP协议和UDP协议都是处于网络层的协议。
(√)socket接口是一种特殊的I/O,也是一种文件描述符。
(√)有时将内核模块也称做驱动程序,因此,加载驱动时就是加载内核模块。
(√)mknod用于创建相关模块。
(×)insmod可以根据模块间依存关系以及/etc/modules.conf文件中的内容自动插入模块。(√)设备通常在/dev下面存在一个对应的逻辑设备节点,这个节点以文件的形式存在。
(√)设备文件(即设备节点)可通过mknod命令来创建,其中指定了主设备号和次设备号。
(×)大多设备以查询方式向设备驱动程序发出输入/输出请求。
(√)设备驱动程序是内核的一部分,如果驱动程序出错,则可能导致系统崩溃。
(√)设备驱动程序必须为内核或者其子系统提供一个标准接口。
(√)设备驱动程序使用一些标准的内核服务
(×)设备驱动开发时模块在调用insmod命令时被加载,此时的入口点是main函数。(√)模块在调用insmod命令时被加载,通常在init_module函数中完成设备注册。
(×)内核空间使用printk和printf函数实现信息打印。
(√)proc伪文件系统让用户可以和内核内部数据结构进行交互,获取有关进程的有用信息。 (×)proc存在于内存和硬盘上。
(√)块设备驱动程序包括一个request请求队列。
(√)Linux操作系统顶层运行的GUI系统兼容X标准的XFree86系统。
(√)Qt使用单一的API进行跨平台的编程。
(√)GUI是指计算机与其使用者之间的对话接口。
(×)Qt/E基于一个X服务器或是Xlib库。
(√)Qt的核心机制是信号和插槽。
1.嵌入式的英文为__EMBEDDED___。
2.Linux操作系统下的程序开发一般均遵守___GPL___协议。
3.Linux内核版本号格式是x.y.zz-www,数字x代表版本类型,数字y为__偶数__时是稳定版本。
4.Linux内核版本号格式是x.y.zz-www,数字x代表版本类型,数字y为__奇数__时是开发版本。
5.Linux操作系统的文件系统是一个__文件树___。
6.Linux常见的默认文件系统为__EXT3__。
7.Linux中把DOS中采用的FAT文件系统(包括FAT12,FAT16 和FAT32)称为_VFAT_文件系统。
8.硬盘可分为主分区、扩展分区、__逻辑分区__。
9.Linux系统中具有超级权限的用户称为_ROOT__用户。
10.Linux下与设备相关的文件一般都在/__DEV__目录下。
11.Linux 对目录和设备都当作_文件___来进行处理。
12.将分区与目录相对应的过程叫做__挂载__。
13.块设备文件是指数据的读写以__块__为单位的设备。
14.Linux 中文件属性第一个字符“d”表示_目录___文件。
15.Linux下软驱、光驱、硬盘的挂载点一般位于/_MNT__目录下。
16.服务的日志信息一般位于/_VAR__目录下。
17.Linux中添加用户账号的命令为__USERADD__。
18.Linux中显示当前系统中由该用户运行的进程列表的命令为__PS__。
19.Linux中改变工作目录的命令为_CD__。
20.Linux中建立符号链接的命令为__LN__。
21.Linux中对目录进行打包的命令为_TAR___。
22.Linux中显示网络连接、路由表和网络接口信息命令为__NETSTAT__。
23.FTP内部命令中使用__LCD__切换本地工作目录。
24.Linux中最常用的编译器是__GCC__编译器。
25.vi有3种模式,分别为命令行模式、插入模式及_底行___模式。
26.编辑器按功能可以分为_行___编辑器和全屏幕编辑器两大类。
27.gdb对__可执行__文件进行调试。
28.工程管理器make读入的配置文件为__MAKEFILE__。
29.工程管理器make定义了_隐式___规则和模式规则。
30.ARM处理器支持__THUMB__(16 位)/ARM(32 位)双指令集。
31.ARM处理器支持16 位/__8__位器件。
32.大端格式中,数据的高字节存储在__低__地址中。
33.小端格式中,数据的高字节存储在_高_地址中。
34.ARM7处理器采用_3_级流水线设计。
35.嵌入式软件开发所采用的编译过程为__交叉__编译。
36.在嵌入式软件开发中,将程序实际的运行环境称为_目标___机。
37.__JTAG__标准所采用的主要技术为边界扫描技术。
38.arm-linux-gcc 交叉编译工具主要包括binutils、__GCC__、glibc等软件。
39.API即__用户编程接口__。
40.API遵循UNIX中的应用编程界面标准_POSIX___。
41.操作系统提供给用户程序调用的一组“特殊”接口称为__系统调用__。
42.进行系统调用时,程序运行空间需要从用户空间进入__内核__空间,处理完后再返回到用户空间。
43.系统调用编程接口主要通过C库(_LIBC___)实现。
44.一个进程启动时,通常都会打开__3__个文件。
45.不带缓存的文件I/O操作,主要用到的5个函数为open、close、read、write和__LSEEK__。
46.fopen函数返回一个__指针__。
47._并行___通信是指利用多条数据传输线将一个资料的各位同时传送。
48.在Linux中,实现文件上锁的函数有lock和_FCNTL___。
49.Linux中最常见最基础的操作对象是_文件___。
50.当用户在系统中键入命令执行一个程序的时候,它将启动一个_进程___。
51.系统调度的单位__进程__。
52._进程控制块_包含了进程的描述信息、控制信息以及资源信息,它是进程的一个静态描述。
53.进程执行态说明该进程正在执行,即进程正在占用__CPU__。
54.Linux系统是一个__多___进程的系统。
55.Daemon进程即通常所说的_守护___进程,是Linux中的后台服务进程。。
56.在Linux中使用_FORK___函数创建一个新进程。
57.fork函数调用后出现父进程与子进程,其中_子进程___的返回值为0。
58.__EXEC__函数族就提供了一个在进程中启动另一个程序执行的方法。
59.exit()函数与_exit()函数最大的区别就在于__EXIT()__函数在exit系统调用之前要检查文件的打开情况,并将文件缓冲区中的内容写回文件。
60._WAIT_函数是用于使父进程阻塞,直到一个子进程结束或者该进程接到了一个指定的信号为止。
61.在Linux中,所有的孤儿进程自动由__INIT__进程收养。
62._SETSID___函数用于创建一个新的会话,并担任该会话组的组长。
63.系统日志文件位于/__VAR/LOG__目录下。
64.TCP/IP的协议参考模型包括网络接口层、_网络层___、传输层和应用层。
65.TCP为协议参考模型包中_传输___层的协议。
66.__TCP__对话通过三次握手来完成初始化。
67.对数据要求高可靠性的应用应选择__TCP__协议。
68.Linux中的网络编程通过__SOCKET__接口来进行。
69.SOCK_DGRAM为__数据报__套接字。
70.在实验中,实验平台采用的CPU为Intel__XSCALL__处理器。
71.在内核更新与加载实验中,设置的串口波特率为__115200__。
72.在内核更新与加载实验中,设置的串口数据位为__8__。
73.在内核更新与加载实验中,设置的数据流控制为__无__。
74.在内核更新与加载实验中,设置的数据停止位为__1__。
75.在内核更新与加载实验中,实验平台上使用的串口为COM__1__。
76.在内核更新与加载实验中,内核映像的后缀部分为__ZIMAGE__。
77.在内核更新与加载实验中,通过__USB__将内核映像下载到实验平台。
78.压缩的内核映像通常名为__ZIMAGE__。
79.未压缩的内核映像通常名为__VMLINUX__。
80.操作系统内核运行之前运行的一段程序称为__BOOTLOADER__。
程序设计选择题
1.下面的程序实现对字符串倒序输出。请选出应填写在空白处的选项。int display1 (char *string) { printf ("The 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++) ____A______ ; string2[size+1] = ' '; printf("The string afterward is %s\n",string2); } int main () { char string[] = "test"; 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]
2.下面的程序打开一个文件,并设置该文件权限为0666。请选出应填写在空白处的选项。int main(void) { int fd; if((fd = open("/tmp/hello.c", O_CREAT | O_TRUNC | O_WRONLY , 0666 ))<0) { perror("open:"); exit(1); } else { printf("Open file: hello.c %d\n",fd); } if( ____D____ ) { perror("close:"); exit(1); } else printf("Close hello.c\n"); exit(0); } A、open(fd) > 0 B、open(fd) < 0 C、close(fd) > 0 D、close(fd) < 0
3.下面的程序打开一个文件,写入字符串“Hello! I'm writing to this file!”,使用lseek 函数将文件指针移到文件开始处,并读出10个字节并将其打印出来。请选出应填写在空白处的选项。int main(void) { int i,fd,size,len; char *buf="Hello! I'm writing to this file!"; char buf_r[10]; len = strlen(buf); if((fd = open("/tmp/hello.c", O_CREAT | O_TRUNC | O_RDWR,0666 ))<0) { perror("open:"); exit(1); } else printf("open file:hello.c %d\n",fd); if((size = write( fd, buf, len)) < 0) { perror("write:"); exit(1); } else printf("Write:%s\n",buf); lseek( _____C_____ ); if((size = read( fd, buf_r, 10))<0) { perror("read:"); exit(1); } else printf("read form file:%s\n",buf_r); if( close(fd) < 0 ) { perror("close:"); exit(1); } else printf("Close hello.c\n"); exit(0); }
A、fd, 0, SEEK_CUR
B、fd, 0, SEEK_END
C、fd, 0, SEEK_SET
4.下面的程序说明文件记录锁函数。首先给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( ____B____ ) { if( lock.l_type == F_RDLCK ) printf("read lock set by %d\n",getpid()); else if( lock.l_type == F_WRLCK ) printf("write lock set by %d\n",getpid()); else if( lock.l_type == F_UNLCK ) printf("release lock by %d\n",getpid()); return; } fcntl(fd, F_GETLK, &lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf("read lock already set by %d\n",lock.l_pid); else if( lock.l_type == F_WRLCK ) printf("write lock already set by %d\n",lock.l_pid); getchar(); } } }
A、(fcntl(fd, F_SETLK, &lock)) < 0
B、(fcntl(fd, F_SETLK, &lock)) == 0
C、(fcntl(fd, F_SETLK, &lock)) > 0
5.下面的程序测试文件的写入锁。首先创建hello文件,之后对其上写入锁,最后释放写入锁。请选出应填写在空白处的选项。int main(void) { int fd; fd=open("hello",O_RDWR | O_CREAT, 0666); if(fd < 0) { perror("open"); exit(1); } _____B_____; 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("read lock set by %d\n",getpid()); else if( lock.l_type == F_WRLCK ) printf("write lock set by %d\n",getpid()); else if( lock.l_type == F_UNLCK ) printf("release lock by %d\n",getpid()); return; } fcntl(fd, F_GETLK,&lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf("read lock already set by %d\n",lock.l_pid); else if( lock.l_type == F_WRLCK ) printf("write lock already set by %d\n",lock.l_pid); 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)
6.下面的程序测试文件的读取锁。首先创建hello文件,之后对其上读取锁,最后释放读取锁。请选出应填写在空白处的选项。int main(void) { int fd; fd=open("hello",O_RDWR | O_CREAT, 0666); if(fd <0) { perror("open"); exit(1); } ____A_____; 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("read lock set by %d\n",getpid()); else if( lock.l_type == F_WRLCK ) printf("write lock set by %d\n",getpid()); else if( lock.l_type == F_UNLCK ) printf("release lock by %d\n",getpid()); return; } fcntl(fd, F_GETLK,&lock); if(lock.l_type != F_UNLCK) { if( lock.l_type == F_RDLCK ) printf("read lock already set by %d\n",lock.l_pid); else if( lock.l_type == F_WRLCK ) printf("write lock already set by %d\n",lock.l_pid); 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)
7.下面的程序打开一个文件,写入字符串并读出。请选出应填写在空白处的选项。int main() { FILE *stream; char s[3]={'a','b','c'}; stream=fopen("what","w"); i=fwrite( ___D___ ); printf("i=%d",i); fclose(stream); }
A、s,sizeof(char),nmemb,stream
B、s,char,nmemb,fd
C、s,sizeof(char),nmemb,FILE
D、s,char,nmemb,FILE
8.下面的程序获得当前进程的PID。请选出应填写在空白处的选项。int main() { printf("The PID of this process is %d\n", _____A_____ ); }
A、getpid()
B、getppid()
C、open(fd, pid)
D、fopen(stream, pid)
9.下面的程序判断fork函数返回值的情况。请选出应填写在空白处的选项。int main(void) { pid_t result; ____A____; if(result == -1) { perror("fork"); exit; } else if(result == 0) { printf("The return value is %d\nIn child process!!\nMy PID is%d\n",result,getpid()); } else { printf("The return value is %d\nIn father process!!\nMy PID is%d\n",result,getpid()); } }
A、result = fork()
B、result = fork(-1)
C、result = fork(0)
D、result = fork(1)
10.下面的程序判断fork函数返回值的情况。请选出应填写在空白处的选项。int main(void) { pid_t result; result = fork() ; if(result == -1) { perror("fork"); exit; } else if( ____D_____ ) { printf("The return value is %d\n In father process!!\nMy PID is%d\n",result,getpid()); } else { printf("The return value is %d\n In child process!!\nMy PID is%d\n",result,getpid()); } }
A、result < 0
B、result == 0
C、result > 0
D、result !== 0
11.下面的程序将环境变量添加到新建的子进程中去,这里的“env”是查看当前进程环境变量的命令使用使用完整的文件目录来查找对应的可执行文件。请选出应填写在空白处的选项。int main() { /*命令参数列表,必须以NULL结尾*/ char *arg[]={"env",NULL}; char *envp[]={"PATH=/tmp","USER=sunq",NULL}; if(fork()==0) { if( ___D____ ("/bin/env",arg,,envp)<0) perror("error!"); } }
A、execl
B、execle
C、execlp
D、execve
12.下面的程序使用文件名的方式来查找可执行文件,同时使用参数列表的方式。请选出应填写在空白处的选项。int main() { if(fork()==0) { /*此处相当于调用“ps -ef”命令*/ if( _____C_____ ("ps","ps","-ef",NULL)<0) perror("error!"); } }
A、execl
B、execle
C、execlp
D、execve
13.下面的程序使用使用完整的文件目录来查找对应的可执行文件,同时使用参数列表的方式。请选出应填写在空白处的选项。int main() { if(fork()==0) { /*注意此处已给出ps命令所在的完整路径*/ if( _____A____ ("/bin/ps","ps","-ef",NULL)<0) perror("error!"); } }
A、execl
B、execle
C、execlp
D、execve
14.下面的程序将环境变量添加到新建的子进程中去,这里的“env”是查看当前进程环境变量的命令使用使用完整的文件目录来查找对应的可执行文件,同时使用参数列表的方式。请选出应填写在空白处的选项。int main() { char *envp[]={"PATH=/tmp","USER=sunq",NULL}; if(fork()==0) { /*注意此处已给出env命令的完整路径*/ if( ____B____ ("/bin/env","env",NULL,envp)<0) perror("error!"); } }
A、execl
B、execle
C、execlp
D、execve
15.下面的程序为服务器端应用程序,首先建立起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( ____A_____ ) { perror("socket"); exit(1); } printf("socket success!,sockfd=%d\n",sockfd); /*设置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("bind"); exit(1); } printf("bind success!\n"); /*调用listen函数*/ if(listen(sockfd,BACKLOG)== -1) { perror("listen"); exit(1); } printf("listening....\n"); /*调用accept函数,等待客户端的连接*/ if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr,&sin_size))== -1) { perror("accept"); exit(1); } /*调用recv函数接收客户端的请求*/ if((recvbytes=recv(client_fd,buf,MAXDATASIZE,0))== -1) { perror("recv"); exit(1); } printf("received a connection :%s\n",buf); close(sockfd); }
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
D、(sockfd = socket(AF_INET,SOCK_STREAM,-1))== 0
16.hello.c和hello.h位于同一目录下,源代码如下所示。/*hello.c*/ int main() { printf("Hello everyone!\n"); } /*hello.h*/ #include <stdio.h> 要求编写Makefile文件实现对这两个文件的编译,Makefile文件如下所示。请选出应填写在空白处的选项。/*Makefile*/ hello:hello.c hello.h ____B______
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
17.下面的程序为客户器端应用程序,客户端在建立起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,"Please enter the server's hostname!\n"); exit(1); } /*地址解析函数*/ if((host=gethostbyname(argv[1]))==NULL) { perror("gethostbyname"); exit(1); } /*创建socket*/ if( _____B_____ ) { perror("socket"); exit(1); } /*设置sockaddr_in 结构体中相关参数*/ serv_addr.sin_family=AF_INET; serv_addr.sin_port=htons(SERVPORT); serv_addr.sin_addr=*((struct in_addr *)host->h_addr); bzero(&(serv_addr.sin_zero),8); /*调用connect函数主动发起对服务器端的连接*/ if(connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr))== -1) { perror("connect"); exit(1); } /*发送消息给服务器端*/ if((sendbytes=send(sockfd,"hello",5,0))== -1) { perror("send"); 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
18.下面的程序首先新建一子进程,然后让其子进程暂停5s。接下来对原有的父进程使用阻塞函数,并使用参数使该父进程不会阻塞。若有子进程退出,则阻塞函数返回子进程号;若没有子进程退出,则阻塞函数返回0,并且父进程每隔一秒循环判断一次。请选出应填写在空白处的选项。int main() { pid_t pc,pr; ____A____; if(pc<0) printf("Error \n"); /*子进程*/ else if(pc==0) { /*子进程暂停5s*/ sleep(5); /*子进程正常退出*/ exit(0); } /*父进程*/ else { /*循环测试子进程是否退出*/ do { /*调用waitpid,且父进程不阻塞*/ pr=waitpid(pc,NULL,WNOHANG); /*若子进程还未退出,则父进程暂停1s*/ if(pr==0) { printf("The child process has not exited\n"); sleep(1); } } while(pr==0); /*若发现子进程退出,打印出相应情况*/ if(pr==pc) printf("Get child %d\n",pr); else printf("some error occured.\n"); } }
A、pc=fork()
B、pc=open(pr)
C、pc=pr
D、pr=pc
19.下面的程序首先新建一子进程,然后让其子进程暂停5s。接下来对原有的父进程使用阻塞函数,并使用参数使该父进程不会阻塞。若有子进程退出,则阻塞函数返回子进程号;若没有子进程退出,则阻塞函数返回0,并且父进程每隔一秒循环判断一次。请选出应填写在空白处的选项。int main() { pid_t pc,pr; pc=fork() if(pc<0) printf("Error \n"); /*子进程*/ else if(pc==0) { /*子进程暂停5s*/ sleep(5); /*子进程正常退出*/ exit(0); } /*父进程*/ else { /*循环测试子进程是否退出*/ do { /*调用阻塞函数,且父进程不阻塞*/ _____D_____; /*若子进程还未退出,则父进程暂停1s*/ if(pr==0) { printf("The child process has not exited\n"); sleep(1); } } while(pr==0); /*若发现子进程退出,打印出相应情况*/ if(pr==pc) printf("Get child %d\n",pr); else printf("some error occured.\n"); } }
A、pc=wait(pc,NULL,WNOHANG)
B、pc=waitpid(pc,NULL,WNOHANG)
C、pr=wait(pc,NULL,WNOHANG)
D、pr=waitpid(pc,NULL,WNOHANG)
20.下面的程序建立一个守护进程,该守护进程每隔10s在/tmp/dameon.log中写入一个字符串。请选出应填写在空白处的选项。#define MAXFILE 65535 int main() { pid_t pc; int i,fd,len; char *buf="This is a Dameon\n"; len =strlen(buf); /*第一步*/ ____A____; if(pc<0) { printf("error \n"); exit(1); } else if(pc>0) exit(0); /*第二步*/ setsid(); /*第三步*/ chdir("/"); /*第四步*/ umask(0); /*第五步*/ for(i=0;i<MAXFILE;i++) close(i); /*这时创建完守护进程,以下开始正式进入守护进程工作*/ while(1) { if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) { perror("open"); 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)
21.下面的程序建立一个守护进程,该守护进程每隔10s在/tmp/dameon.log中写入一个字符串。请选出应填写在空白处的选项。#define MAXFILE 65535 int main() { pid_t pc; int i,fd,len; char *buf="This is a Dameon\n"; len =strlen(buf); /*第一步*/ pc=fork(); if(pc<0) { printf("error \n"); exit(1); } else if(pc>0) exit(0); /*第二步*/ setsid(); /*第三步*/ chdir("/"); /*第四步*/ umask(0); /*第五步*/ ____D___ close(i); /*守护进程创建完成,以下开始正式进入守护进程工作*/ while(1) { if((fd=open("/tmp/dameon.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) { perror("open"); 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++)
22.下面的程序建立一个守护进程,然后在该守护进程中新建一个子进程,该子进程暂停10s,然后自动退出,并由守护进程收集子进程退出的消息。子进程退出后,守护进程循环暂停,其间隔时间为10s。子进程和守护进程的退出消息均在/var/log/messages中输出。请选出应填写在空白处的选项。#define MAXFILE 65535 int main(void) { pid_t child1,child2; int i; child1 = fork(); if( _____A_____ ) { perror("child1 fork"); exit(1); } else if( child1 > 0 ) exit( 0 ); openlog("exc2_info", LOG_PID, LOG_DAEMON); setsid(); chdir( "/" ); umask( 0 ); for( i = 0 ; i < MAXFILE ; i++ ) { close( i ); } child2 = fork(); if( child2 == -1 ) { perror("child2 fork"); exit(1); } else if( child2 == 0 ) { syslog( LOG_INFO, " child2 will sleep for 10s "); 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
23.下面的程序实现对字符串倒序输出。请选出应填写在空白处的选项。int display1 (char *string) { printf ("The original string is %s \n", string); } ____B______ { char *string2; int size,i; size = strlen (string1); string2 = (char *) malloc (size + 1); for (i = 0; i< size; i++) string2[size+1] = ' '; printf("The string afterward is %s\n",string2); } int main () { char string[] = "test"; display1 (string); display2 (string); }
A、int display2 (char *string)
B、int display2 (char *string1)
C、int display2 (char *string2)