收藏 分享(赏)

linux考试复习题.doc

上传人:wspkg9802 文档编号:5884570 上传时间:2019-03-20 格式:DOC 页数:19 大小:101KB
下载 相关 举报
linux考试复习题.doc_第1页
第1页 / 共19页
linux考试复习题.doc_第2页
第2页 / 共19页
linux考试复习题.doc_第3页
第3页 / 共19页
linux考试复习题.doc_第4页
第4页 / 共19页
linux考试复习题.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、第一章1什么是嵌入式系统?它由哪几部分组成?嵌入式系统是一应用为中心,以计算机技术为基础,切软硬件可裁减,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。嵌入式系统一般有3 个主要的组成部分:硬件、实时操作系统以及应用软件。 硬件:包括处理器、存储器(ROM、RAM)、输入输出设备、其他部分辅助系统等。 实时操作系统(Real-Time Operating System、RTOS):用于管理应用软件,并提供一种机制,使得处理器分时地执行各个任务并完成一定的时限要求 。 应用软件:实现具体业务逻辑功能2嵌入式系统的三要素是什么?嵌入式系统的三要素是嵌入、专用、计算机。其中嵌入性指的是

2、嵌入到对象体系中,有对象环境要求;专用性是指软、硬件按对象要求裁减;计算机指实现对象的智能化功能。3列出5中以上的嵌入式实时操作系统。嵌入式实时操作系统(Real-Time Operating System,RTOS)是指操作系统本身要能在一个固定时限内对程序调用(或外部事件)做出正确的反应 亦即对时序与稳定性的要求十分严格。目前国际较为知名的有:VxWorks、NeutrinoRTOS、Nucleus Plus、 OS/9、VRTX、LynuxOS、RTLinux、BlueCat RT 等。4嵌入式系统一般由几层组成?简单介绍其作用。嵌入式系统一般由硬件层、中间层、软件层和功能层组成。其作用

3、分别如下:(1)硬件层 :由嵌入式微处理器、外围电路和外设组成。外围电路有:电源电路、复位电路、调试接口和存储器电路,就构成一个嵌入式核心控制模块。操作系统和应用程序都可以固化在ROM 或者Flash 中。为方便使用,有的模块在此基础上增加了LCD、键盘、USB 接口 以及其他一些功能的扩展电路。(2)中间层 :硬件层与软件层之间为中间层,也称为BSP(BoardSupporPackage,板级支持包)。作用:将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关。功能:一般应具有相关硬件的初始化、数据的输入/输出操作和硬件设备的配置等功能。BSP 是主板硬件环境和操作系统的中间接

4、口,是软件平台中具有硬件依赖性的那一部分。主要目的是为了支持操作系统,使之能够更好地运行于硬件主板上。(3)软件层 :主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。操作系统是一个标准的内核 将中断、I/O、定时器等资源都封装起来,以方便用户使用。(4)功能层 :由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。功能层是面向被控对象和用户的,为了方便用户操作,往往需要具有友好的人机界面。5简述嵌入式系统中非占先式与占先式调度法的区别。非占先式调度法也称作合作型多任务(cooperative multitasking),各个任务彼此合作共享一个CPU。中断服务可以使一

5、个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU 的使用权时,那个高优先级的任务才能获得CPU 的使用权。当系统响应时间很重要时,要使用占先式(preemptive)内核。最高优先级的任务一旦就绪 总能得到CPU 的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU 使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU 的控制权。6简述什么是硬实时操作系统、软实时操作系统以及两者的区别。在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称

6、为强实时系统或硬实时系统。强实时系统响应时间一般在毫秒或微秒级。在弱实时系统中,虽然响应时间同样重要,但是超时却不会发生致命的错误。其系统响应时间在毫秒至秒的数量级上,其实时性的要求比强实时系统要差一些。7嵌入式系统的设计步骤有哪些?各部分主要工作是什么?嵌入式系统的设计步骤及各部分的主要工作如下。(1)需求分析阶段,罗列出用户的需求。(2)体系结构设计阶段,描述系统的功能如何实现。(3)详细设计阶段,进行硬件系统与软件系统的分类划分,以决定哪些功能用硬件实现,哪些用软件实现。(4)系统集成 把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进在设计过程中的错误。(5)系统测试 对设计

7、好的系统进行测试 看其是否满足给定的要求。8.Linux作为嵌入式操作系统的优势有哪些?Linux 作为嵌入式操作系统的优势主要有以下几点:(1)可应用于多种硬件平台。Linux 已经被移植到多种硬件平台,这对于经费、时间受限制的研究与开发项目是很有吸引力的。原型可以在标准平台上开发后移植到 具体的硬件上,加快了软件与硬件的开发过程。Linux 采用一个统一的框架对硬件进行管理,从一个硬件平台到另一个硬件平台的改动与上层应用无关。(2)Linux 的高度模块化使添加部件非常容易。本身内置网络支持,而目前嵌入式系统对网络支持要求越来越高。(3)Linux 是一个和Unix 相似、以内核为基础的、

8、具有完全的内存访问控制,支持大量硬件(包括X86、Alpha、ARM 和Motorola 等现有的大 部分芯片)等特性的一种通用操作系统。(4)Linux 可以随意地配置,不需要任何的许可证或商家的合作关系。其程序源码全部公开 任何人可以修改并在GUN 通用公共许可证(GNU General Public License)下发行。这样,开发人员可以对操作系统进行定制,适应其特殊需要。(5)Linux 带有Unix 用户熟悉的完善的开发工具,几乎所有的Unix 系统的应用软件都已移植到了Linux 上。其强大的语言编译器GCC、C+等也可以很容易得到,不但成熟完善,而且使用方便。9简述Linux

9、需要进行进程调度的时机。Linux 执行进程调度一般是在以下情况发生的:(1)正在执行的进程运行完毕。(2)正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态。(3)正在执行的进程调用了P 原语操作 从而因资源不足而被阻塞,或调用了V 原语操作激活了等待资源的进程队列。(4)执行中的进程提出I/O 请求后被阻塞。(5)系统分配的时间片已经用完。以上都是CPU 为不可剥夺方式下的引起进程调度的原因。在CPU 方式是可剥夺时 还有下面的原因:(6)就绪队列中的某个进程的优先级变得高于当前运行进程的优先级,从而也将引起进程调度。第二章1、(man)命令可以知道Shell命令的用法。2、Linux分

10、区类型默认的是(Ext2/Ext3)。3、(shutdown r now)命令行可用来马上关闭正在运行的Linux系统。4、重定向的符号“”表示(输出重定向,原来的文件会被改写)。5、下面(touch myfile)命令可用来确保文件myfile存在。6、要给文件file1加上其他人可执行属性的命令是(chmod o+x)。7、用“useradd jerry”命令添加一个用户,这个用户的主目录是(/home/jerry)。8、如果忘记了ls命令的用法,可以采用(man ls)命令获得帮助。9、某文件的组外成员的权限为只读;所有者有全部权限,组内权限为读写,则该文件的权限为(764)。10、删除

11、当前目录abc以及下面的所有子目录和文件,并不要求提示任何确认信息的命令是(rm rf abc)。11、文件exer1的访问权限为rw-rr-,现在要添加所有用户的执行权限和同组用户的写权限,命令是(chmod a+x g+w exer1)、(chmod 0775 exerl)12、在/home/stud1/wang 目录下有一个文件file,使用(cat filefile.copy)可实现在后台执行命令,此命令将file文件中的内容输出到file.copy文件中。13、删除文件命令为(rm)。14、(chmod)命令可更改一个文件的权限设置。15、系统中有用户user1和user2,同属于u

12、sers组。在user1用户目录下有一个文件file1,他拥有644的权限,如果user2用户想修改user1用户目录下的file1文件,file1应拥有(664)。16、为查看linux启动信息,可以用(dmesg)命令。17、可用(cat /proc/meminfo)命令查看linux使用了多少内存。18、下列说法是正确的是(D)。A.ln s a.txt b.txt ,作用是制作文件b.txt的符号链接,其名称为a.txt。Bdf命令可以查看当前目录占用磁盘空间的大小。C.comm命令用来打印两个文本文件中的相同内容。D.rm命令可以用来删除目录。19、为了查找当前用户运行的所有进程的信

13、息,可以使用(ps -u)命令。20.为了保证在启动服务器时自动启动DHCP进程,应对(/etc/rc.d/inet1)文件进行编辑。 第三章二、综合应用题1、已知C语言程序有主要程序模块prog.c、proc.h,其中调用了另一模块subr.c、subr.h中的功能。试写出一个可将这两个模块编译成可执行文件pr1的Makefile。pr1:prog.o subr.ogcc o pr1 prog.o subr.oprog.o:prog.c prog.hgcc c o prog.o prog.csubr.o:subr.c subr.hgcc c o subr.o subr.c2、假定目录/hom

14、e/arm下有一个C语言程序,它由几个单独的文件组成,而这几个文件又分别包含了其他文件,如下表所示。文件 包含文件main.c stdio.h,table.hlist.c list.hsymbol.c symbol.htable.c table.htable.h symbol.h,list.h完成下列任务(1) 编写Makefile文件,最终的目标文件为hello,交叉编译器为arm-linux-gcc。hello:main.o list.o symbol.o table.oarm-linux-gcc o hello main.o list.o symbol.o table.omain.o:m

15、ain.c stdio.h table.h symbol.h list.harm-linux-gcc -c o main.o main.clist.o:list.c list.harm-linux-gcc c o list.o list.csymbol.o:symbol.c symbol.h arm-linux-gcc c o symbol.o symbol.ctable.o:table.c table.h symbol.h list.harm-linux-gcc c o table.o table.cclear:rm f hello *.o(2) 在目标机上通过网络文件系统挂载/mnt到宿主

16、机上的/home/arm目录。mount t nfs o nolock IP地址:/home/arm /mnt3.在Linux操作系统下,编程实现以下功能。(1)主程序hello.c(打印“hello world!”)。(2)主程序通过头文件hello.h调用message函数。(3)message函数有message.c定义(打印“This is a message!”)。/hello.h#ifndef HELLO_H#define HELLO_Hvoid message();#endif/message.c#include#include”hello.h”void message()pri

17、ntf(“this is a message!”);/hello.c#include#include#include#include”hello.h”void main(int argc,char *argv)printf(“hello world!n”);message();return 0;三、选择题1、一般可以用(make)实现自动编译。2假使当前目录下有文件Makefile,其内容如下。pr1:prog.o subr.ogcc o pr1 prog.o subr.oprog.o:prog.c prog.hgcc c o prog.o prog.csubr.o:subr.c subr.h

18、gcc c o subr.o subr.cclear:rm f pr1 *.o现在执行命令make clear,实际执行的命令是(rm f pr1 *.o)。3、嵌入式系统应用软件一般在宿主机上开发,在目标机上运行,因此需要的一个(交叉编译)环境。4、假设用vi编辑器编写了一个脚本文件shell.sh,现想将该文件名称修改为shell2.sh,(mv shell.sh shell2.sh)命令可以实现。5、在使用GCC编辑器的过程中,(-o)选项可用来指定生成的目标文件名。6、假设当前目录下有文件Makefile,其内容如下。pr1:prog.o subr.ogcc o pr1 prog.o

19、subr.oprog.o:prog.c prog.hgcc c o prog.o prog.csubr.o:subr.c subr.hgcc c o subr.o subr.cclear:rm f pr1 *.o现在执行命令make subr.o,实际执行的命令是(gcc c o subr.o subr.c)。7、为了使生成的目标文件能够用于GDB调试,在编译时GCC应使用(-g)选项。8、存盘并退出vi的指令是(wq)。9、在Linux下使用GCC编译器时,有命令gcc g test.c o test,其中参数-g的作用是(生成文件包含调试信息)。10、fstab文件存放在(/ect)目录中

20、。11、init启动进程需要读取(/etc/inittab)配置文件。第四章1. LINUX支持网络文件系统NFS, (mount -t nfs 192.168.1.4:/opt/sirnfs /mnt/sirnfs)命令实现了将位于 192.168.1.4机器上的 /opt/sirnfs 目录挂载到本机/mnt/sirnfs下。2、以下叙述中正确的是(C)A、宿主机与目标机之间只需要建立逻辑连接即可。B、在嵌入式系统中,调试器与被调试程序一般位于同一台机器上C、在嵌入式系统开发中,通常采用的是交叉编译器。D、宿主机与目标机之间的通信方式只有串口和并口两种3、以下做法不利于嵌入式应用软件的移植

21、的是 D 。A) 在软件设计上,采用层次化设计和模块化设计B) 在软件体系结构上,在操作系统和应用软件之间引入一个虚拟机层,把一些通用的、共性的操作系统API接口函数封装起来C) 将不可移植的部分局域化,集中在某几个特定的文件之中D) 在数据类型上,尽量直接使用C语言的数据类型4. 如果Boot Loader、内核、启动参数以及其他的系统映像四部分在固态存储设备上分别独立存放,则其存储结构的分配顺序应当是(Bootloader、启动参数、内核、文件系统)。 5. Boot Loader 的stage2通常使用C语言实现,以完成复杂的功能,并增加可读性和可移植性,以下哪一步骤属于stage2的内

22、容:(D) A . 为加载 Boot Loader 的 stage2 准备 RAM 空间B . 设置好堆栈C . 硬件设备初始化D . 将 kernel 映像和根文件系统映像从 flash 上读到 RAM 空间中6、在Linux 2.4或者2.6内核中,和ARM体系结构相关的中断处理程序的C代码在源码树的(arch/arm/kernel/irq.c)文件中7、下面对于BootLoader的描述不正确的是(C)A、上电后运行的第一个程序B、改变系统时钟C、BootLoader的两种模式对开发人员没有意义D、向内核传递启动参数8、(make menuconfig)命令以文本菜单方式界面配置内核选项

23、。9、在ARM Linux启动的过程中,开启MMU的时候,如何实现从实地址空间到虚拟地址空间的过度?DA、开启MMU,在内存中创建页表(映射内核到3G以上的虚拟地址空间)并继续运行。B、开启MMU,在内存中创建页表(映射内核到3G以上的虚拟地址空间),跳转到虚拟地址空间继续运行。C、在内存中创建页表(映射内核到3G以上的虚拟地址空间),开启MMU,跳转到虚拟地址空间继续运行。D、在内存中创建页表(映射内核到3G以上的虚拟地址空间,同时把内核所在的前1MB空间映射到和其实地址相同的虚拟地址空间),开启MMU,跳转到虚拟地址空间继续运行。10、下面属于blob运行过程第一阶段的是(C) A.外围的

24、硬件初始化(串口,USB等);B. 根据用户选择,进入命令行模块或启动kernel。C. 寄存器的初始化D .堆栈的初始化11、能在Linux下,用mkfs.jffs2命令创建JFFS2文件系统(基本上是使用JFFS2的Ramdisk),关于mkfs.jffs2下列说法错误的是: (C)A-e 选项确定闪存的擦除扇区大小(通常是 64 千字节)B-p 选项用来在映像的剩余空间用零填充。C-f 选项用于输出文件,通常是 JFFS2 文件系统映像D一旦创建了 JFFS2 文件系统,它就被装入闪存中适当的位置(引导装载程序告知内核查找文件系统的地址)以便内核能挂装它。12、在ARM系统结构中,MMU

25、映射最大的单元空间是(1M)13、通过修改下面文件哪个文件 ,可以设定开机时候自动安装的文件系统(/etc/fstab )14、嵌入式系统由硬件部分和软件部分构成,以下不属于嵌入式系统软件的是(C)A、系统内核 B、驱动程序 C、FPGA编程软件 D、嵌入式中间件15、通过修改文件(/etc/fstab),可以设定开机时候自动安装的文件系统。第六章一简答题1、 何为虚拟内存?虚拟内存的管理有何作用?使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。MMU 便是实现虚拟内存的必要条件。嵌入式处理器如果存在MMU ,由于在MMU 具备内存地址映射和寻址功能,操作系统会使用它

26、完成从虚拟地址到物理地址的转换, 所有的应用程序只需要使用虚拟地址寻址数据。虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。2、 进程内存区域涉及哪几种数据段?进程内存区域涉及到5 种数据段,即: 码段:代码段是用来存放可执行文件的操作指令,也就是说是它是可执行程序在内存中的镜像。数据段:数据段用来存放可执行文件中已初始化全局变量,换句话说就是存放程序静态分配的变量和全局变量。BSS 段:BSS 段包含了程序中未初始化的全局变量,在内存中 BSS 段全部置零。堆:堆是用于存放进程运行中被动态分配的内存段

27、,它的大小并不固定,可动态扩张或缩减。当进程调用malloc 等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free 等函数释放内存时,被释放的内存从堆中被剔除,堆被缩减。栈:栈是用户存放程序临时创建的局部变量,也就是说函数括弧“”中定义的变量(但不包括static 声明的变量,static 意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。3、 简述内核空间和用户空间的区别。在Linux 系统中,内核在最高级执行,也称为“系统态”,在这一级任何操作都可以执行。而应用程序则执行在最低

28、级,即所谓的“用户态”。在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间”中运行的。它们分别引用不同的内存映射,也就是程序代码使用不同的“地址空间”。4、简述共享内存的作用?共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。这块共享虚拟内存的页面,出现在每一个共享该页面的进程的页表中

29、。但是它不需要在所有进程的虚拟内存中都有相同的虚拟地址。5、简述内存管理与虚拟文件系统之间的关系。内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时挂起当前正在运行的进程。第七章1、Linux文件权限一共10位长度,分成四段,第三段表示的内容是(文件所有者所在组的权限)。2、文件系统的主要功能是 A 。A) 实现对文件的按名存取 B) 实现虚拟存储C) 提高外存的读写速度 D) 用于保存系统文档3、下列文件系统中,采用了inode来标识文件的是(C)A、NTFS

30、B、FAT16 C、FAT32 D、Ext34、通过文件名存取文件时,文件系统内部的操作过程是通过(D)。 A文件在目录中查找文件数据存取位置 B文件名直接找到文件的数据,进行存取操作 C文件名在目录中查找对应的I节点,通过I节点存取文件数据 D文件名在中查找对应的超级块,在超级块查找对应i节点,通过i节点存取文件数据5、Linux将存储设备和输入/输出设备均看做文件来操作,下列选项(C)不是以文件的形式出现。A. 目录 B. 软链接C. i节点表 D. 硬链接二、编程题1、用C语言编写一个源程序main.c,实现以下功能。(1)打开当前目录下的文件“test.txt”,如果没有则创建该文件,

31、并使其具体读写属性。Void main(void)int fid;fid = open(“./test.txt”,O_RDWR|O_CREAT);if(fid=-1)Printf(“open or create error n”);exit(0);Close(fid);(2)编写一个makefile实现自动编译,生成可执行文件 main。objects = main.oexec = mainall:$(objects)gcc o $(exec) $(objects)main.o:main.cgcc c main.cclean:rm r $(exec) $(objects)2、编写一个程序实现把

32、一个文件内容复制到另一个文件中。2.参考程序:#include #include #include #include #include #include #define BUFFER_SIZE 1024int main(int argc,char *argv)int from_fd,to_fd;int bytes_read,bytes_write;char bufferBUFFER_SIZE;char *ptr;if(argc!=3) fprintf(stderr,“Usage:%s fromfile tofilena“,argv0);exit(1);/* 打开源文件 */if(from_fd

33、=open(argv1,O_RDONLY)=-1) fprintf(stderr,“Open %s Error:%sn“,argv1,strerror(errno);exit(1);/* 创建目的文件 */if(to_fd=open(argv2,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR)=-1)fprintf(stderr,“Open %s Error:%sn“,argv2,strerror(errno);exit(1);/* 以下代码是一个经典的拷贝文件的代码 */while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)if(

34、bytes_read=-1) /*发生读错误,退出循环*/else if(bytes_read0)ptr=buffer;while(bytes_write=write(to_fd,ptr,bytes_read)if(bytes_write=-1) /*若写错误,退出循环*/* 写完了所有读的字节 */else if(bytes_write=bytes_read) break;/*读写字节不等退出循环*/else if(bytes_write0) /* 只写了一部分,继续写 */ptr+=bytes_write;bytes_read-=bytes_write;if(bytes_write=-1)

35、break; /* 写的时候发生的致命错误 */close(from_fd);close(to_fd);exit(0);4、 从键盘上输入两个学生的基本信息,然后写入一个到文件中,最后读出这两个学生的数据,并显示在屏幕上。#include struct student char name10;int age;int main()FILE *fp;int i;struct student boya2, boyb2, *pp, *qq;if(fp = fopen(“7-6.txt“,“w+“)= NULL) /打开文件printf(“Can not open file, exit .n“);ret

36、urn -1;pp = boya;qq = boyb;printf(“please input data:n“); /输入学生信息for (i = 0; i name, pp = boya;fwrite(pp, sizeof(struct student), 2, fp); /把学生信息写入文件rewind(fp); /重定位文件fread(qq, sizeof(struct student), 2, fp); /从文件中读取学生信息printf(“namettagen“);for(i = 0; i name, qq-age);fclose(fp);return 0;4、编写一个对文件加写入锁

37、的程序。写入锁是互斥锁,一个时刻只能有一个写入锁存在。并在两个终端分别运行,验证先运行的那个终端能成功上锁,后运行的那个无效。/*fcntl_write.c 测试文件写入锁主函数部分*/#i nclude unistd.h#i nclude sys/file.h#i nclude sys/types.h#i nclude sys/stat.h#i nclude stdio.h#i nclude stdlib.h/*lock_set 函数*/void lock_set(int fd, int type)struct flock lock;lock.l_whence = SEEK_SET;/赋值l

38、ock 结构体lock.l_start = 0;lock.l_len =0;while(1)lock.l_type = type;/*根据不同的type 值给文件上锁或解锁*/if(fcntl(fd, F_SETLK, 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,/*判断文件不

39、能上锁的原因*/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();int main(void)int fd;/*首先打开文件*/fd=open(“hello“,O_RDWR | O_CREAT, 0666

40、);if(fd 0)perror(“open“);exit(1);/*给文件上写入锁*/lock_set(fd, F_WRLCK);getchar();/*给文件接锁*/lock_set(fd, F_UNLCK);getchar();close(fd);exit(0);第八章1、以下关于Init进程的描述不正确的是(A)A、一个通用进程B、可以产生新的进程C、在某些程序退出时能重启他们D、负责在系统启动是运行一系列程序和脚本文件2、启动init程序前,不需要经过(D)步骤。A、加载内核 B、检测内存 C、加载文件系统 D、启动网络支持3、有若干并发进程均将一个共享变量count中的值加1一次,

41、那么有关count中的值说法正确的是(C)A、肯定有不正确的结果 B、肯定有正确的结果C、若控制这些并发进程互斥执行count加1操作,count中的值正确D、A B C均不对4、下面哪一个选项不是linux系统的进程类型(C)A. 交互进程 B. 批处理进程 C. 就绪进程 D. 守护进程7、进程有3种状态(运行、就绪和等待)。8、内核不包括的子系统是(D)。A、进程管理系统 B、内存管理系统 C、I/O管理系统 D、硬件管理系统三、编程题1、编程创建一个特定的IPC结构的关键字和一个信号量,建立此信号量的索引,修改索引指向的信号量的值,最后清除信号量(注:利用函数frok生成上文所说的唯一

42、IPC关键字。)void main() key_t unique_key; /* 定义一个IPC 关键字*/int id;struct sembuf lock_it;union semun options;int i;unique_key = ftok(“.“, a); /* 生成关键字 字符a是一个随机种子*/* 创建一个新的信号量集合*/id = semget(unique_key, 1, IPC_CREAT | IPC_EXCL | 0666);printf(“semaphore id=%dn“, id);options.val = 1; /*设置变量值*/semctl(id, 0, S

43、ETVAL, options); /*设置索引0 的信号量*/*打印出信号量的值*/i = semctl(id, 0, GETVAL, 0);printf(“value of semaphore at index 0 is %dn“, i);/*下面重新设置信号量*/lock_it.sem_num = 0; /*设置哪个信号量*/lock_it.sem_op = -1; /*定义操作*/lock_it.sem_flg = IPC_NOWAIT; /*操作方式*/if (semop(id, exit(1);i = semctl(id, 0, GETVAL, 0);printf(“value of

44、 semaphore at index 0 is %dn“, i);/*清除信号量*/semctl(id, 0, IPC_RMID, 0);2、守护进程编程。守护进程实例包括两部分:主程序test.c和初始化程序init.c。主程序每隔一分钟向/temp目录的日志test.log报告运行状态;初始化程序中的init_daemon函数负责生成守护进程。可以利用init_daemon函数生成自己的守护进程。void init_daemon(void)int pid;int i;if (pid=fork()exit(0);/是父进程,结束父进程else if (pid#include void in

45、it_daemon(void);/守护进程初始化函数main()FILE *fp;time_t t;init_daemon();/初始化为Daemonwhile (1)/每隔一分钟向test.log报告运行状态sleep(60);/睡眠一分钟if (fp=fopen(“test.log“,“a“) =0)t=time(0);fprintf(fp,“Im here at %sn“,asctime(localtime(fclose(fp);3、编程实现父进程和子进程间的通信。程序包括:创建无名管道、子进程向父进程写数据及关闭管道的读端、父进程从管道读取子进程写的数据及关闭管道的写端、读有名管道和写

46、有名管道。void main() int file_descriptors2;/*定义子进程号 */pid_t pid;char buf256;int returned_count;/*创建无名管道*/pipe(file_descriptors);/*创建子进程*/if(pid = fork() = -1) printf(“Error in forkn“);exit(1);/*执行子进程*/if(pid = 0) printf(“in the spawned (child) process.n“);/*子进程向父进程写数据 关闭管道的读端*/close(file_descriptorsINPU

47、T);write(file_descriptorsOUTPUT, “test data“, strlen(“test data“);exit(0); else /*执行父进程*/printf(“in the spawning (parent) process.n“);/*父进程从管道读取子进程写的数据 关闭管道的写端*/close(file_descriptorsOUTPUT);returned_count = read(file_descriptorsINPUT, buf, sizeof(buf);printf(“%d bytes of data received from spawned

48、process: %sn“,returned_count, buf);在Linux 系统下,有名管道可由两种方式创建,命令行方式mknod 系统调用和函数mkfifo。下面的两种途径都在当前目录下生成了一个名为myfifo 的有名管道,方式一,mkfifo(“myfifo“,“rw“);方式二,mknod myfifo p生成了有名管道后,就可以使用一般的文件I/O 函数如open、close、read、write 等来对它进行操作。下面即是一个简单的例子,假设我们已经创建了一个名为myfifo 的有名管道。/* 进程一,读有名管道*/#define INPUT 1#define OUTPUT 0void main() FILE * in_file;int count = 1;char buf80;in_file = fopen(“mypipe“, “r“);if (in_file = NULL) printf(“Error in fdopen.n“);exit(1);while (count = fread(buf, 1, 80, in_file) 0)printf(“received from pipe: %sn“, buf);fclose(in_file);/* 进程二,写有名管道*/#include#

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 试题课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报