1、第 1 页(共 9 页)Linux 编程环境期末考试样题及参考答案一. 给出完成下列各项功能所需要的 UNIX 系统命令。要求:给出实现这一功能的完整命令;不能给出完整命令可以仅给出所需要的命令名称。必须陈述利用了这个命令的哪个功能或选项。每题 2 分,共 24 分。1. 删除文件为-i 的文件。答:使用 rm 命令,由于命令会默认以减号开始的命令行参数为命令处理的选项而不是处理对象,所以需要使用特殊的选项-以显式的方式说明选项的结束。命令为 rm - -i2. 命令 netstat 有很多选项,如何得知使用哪个选项可以打印出 ip的路由表?答:使用 man 命令,man 命令可以在线查阅命令
2、的使用手册,使用命令 man netstat 查出 netstat 命令的使用手册,看看哪个选项和什么命令格式用来打印出 ip 的路由表。3. 删除当前目录下的子目录 tmp 及该目录下属的所有文件和子孙目录。答:使用 rm 命令,rm 命令有个选项可以递归地删除一个子目录,命令为rm r tmp 4. 在你完成上机作业过程中,使用什么命令将源程序文件 myrm.c编译、链接生成可执行文件?可执行文件是什么名字?如何运行?答:使用 gcc 命令或者 make,实现编译和链接gcc myrm.c o myrm或者:make myram生成的可执行文件名按照惯例为 myrm,一般情况下当前环境变量
3、 PATH 不包括当前目录,所以,运行这个可执行程序应当加上当前路径,命令为:./myrm 命令有个选项可以递归地删除一个子目录,命令为./myrm r tmp 5. 检索目录 src 以及其子孙目录中的所有文件名后缀为.c 和.h 文件,查找哪些文件中含有字符串 TPDU,并列出在这文件中的行号。答:使用 find 命令和 grep 命令。 find 命令可以在指定的目录第 2 页(共 9 页)树中查找满足某个条件的文件或目录,并对查找到的满足条件的对象执行一个动作。指定查找条件为“文件名后缀为.c 和 .h”,动作为“ 查找哪些文件中含有字符串 TPDU,并列出在这文件中的行号”,分别是
4、find 的 -name 和-exec 选项。完整的命令为:find src name ”*.ch” exec grep n TPDU /dev/null ;6. 统计出由用户 liu 创建并且正在运行的进程数目。答:使用 ps 命令列表出系统中所有进程,过滤后仅保留用户liu 创建的进程(用 grep) ,每个进程占一行,用 wc 命令统计一共有多少行即可。ps ef | grep liu | wc l7. 去掉文件 list.txt 中的所有空行(所谓空行指:行内不含有任何除空格之外的字符),存为新文件 list-new.txt。答:使用 grep 命令可以用正则表达式对文本文件过滤,-v
5、选项用于筛选掉能匹配指定正则表达式的行,描述一个空行的正则表达式为 *$,即:从行首开始 (),有零个到多个空格( *),然后是行尾($),命令为:grep v *$ list.txt list-new.txt8. 程序文件 fexc.c 约有 2000 行,保留了一个备份 fexc0.c 后另个程序员在 fexc.c 中作了多处修改,如何找出他在原先程序的基础上作了哪些修改?答: diff 命令可以对文本文件进行比较,找出两个文件的差别。由于 C 语言源程序文件为文本文件,可以用 diff 完成上述功能。完整的命令为:diff fexc0.c fexc.c9. 目录 mywork.dir 上
6、周的备份目录为 mywork.bak,其中仅有一小部分文件作了修改,仅仅将被修改过的文件和新创建的文件拷贝到备份目录。答: cp 命令实现了增量拷贝的功能,增量拷贝的基本功能就是检查源目录下的文件和目的目录下的同名文件的最后一次修改时间,当源文件的最后一次修改时间晚于目的文件的最后一次修改时间,或者同名的目的文件不存在时,才执行复制操作。完整的命令为:cp ur mywork.dir mywork.bak第 3 页(共 9 页)10. 程序 xserverd 正在运行,随时间的变化,系统的内存资源越来越少。如何判断是否是该程序在运行过程中存在内存泄漏导致内存资源越来越少?答:ps 命令的-l
7、选项,可以打印出进程当前的 SZ 属性,即:进程的虚拟内存空间大小。当进程在运行过程中存在内存泄漏时,进程的虚拟内存空间大小会逐渐随时间增大。使用 ps l | grep xserverd 可以看出进程 xserverd 属性。11. 系统在当前一段时间内出现 CPU 负载很重现象,系统的响应时间明显增大。怎样判断是哪些程序的运行占用了过多的 CPU 而导致的系统负载过重?答:ps 命令可以打印出进程当前的 TIME 属性,即:进程运行占用的 CPU 时间(不计睡眠时间) 。使用 ps 命令观察哪些进程的 TIME 属性随时间在同步增长,就可以判断出哪些程序的运行占用了过多的 CPU 而导致的
8、系统负载过重。12. df h /opt 命令的执行格式如下:Filesystem Size Used Avail Use% Mounted on/dev/sda6 90G 47G 39G 55% /opt命令列出了磁盘使用情况,如何自动地在终端上每 1 分钟给出一次报告?答:自动地重复执行一个命令,利用 shell 的循环机制。让shell 睡眠 60 秒钟的命令为 sleep 60。整个命令为:while true; do df h /opt; sleep 60;done二、 判断题 每题 2 分共 20 分, 下列说法是否正确,并简述理由。注意:理由陈述不正确不得分。1. UNIX 文件
9、权限设计为简单的三级控制,用户 liu 对用户 sun 的文件 data.txt 要么具有全部的读权限,要么不可以读。因此,没有办法限制 liu 只对文件的指定部分读。答:错误。可以利用 SUID 权限,用户 sun 将文件 data.txt的读写权限设置为 rw-,由文件所有者 sun 自己编写程序以实现对文件的访问,程序中的访问当然可以限制只对文件的指定部分读,但是该程序文件的属性应当为 rws-x-x,用户 liu 只有执行这个可程序程序文件才能实现对文件 data.txt 的访问。2. 命令 ln 仅允许对普通文件实现硬连接,对目录不许硬连接操作。所以,所有目录的 link 数总为 1
10、。答:错误。尽管命令 ln 仅允许对普通文件实现硬连接,对目录不许硬连接操作,但是,目录的硬连接由系统自动实现,当前第 4 页(共 9 页)目录下的.文件和子目录中的. 文件,均是指向当前目录的硬连接,在创建新目录时系统自动实现。所以,目录的 link 数会大于1,一般情况下目录的 link 数 =直属子目录数+2 。3. 如果父进程不对僵尸进程进行处理,那么,僵尸进程过多,即使系统有足够内存,也可能导致系统无法正常工作。答:正确。进程执行的结束阶段产生僵尸进程,原进程所占有的数据段、指令段、堆栈段内存都已经释放,系统仅为僵尸进程保存一个进程表表项。但是,僵尸进程过多会因为占用光内核中全部的进
11、程表表项,导致无法启动新的进程。4. fork 后得到两个几乎完全相同的进程,父子进程可以共享代码段,但是父子进程必须有独立的数据段和堆栈段。设代码段,数据段和堆栈段的大小分别为 a,b,c,那么,fork() 后父子进程占用的物理内存总大小是 a+2(b+c)。答:错误。尽管 fork 后,从逻辑上可以得到两个几乎完全相同的进程,父子进程有独立的数据段、堆栈段和指令段,但是,操作系统可以通过使用 copy-on-write 技术等方式,使得父子进程共享同一段物理内存,除了代码段可以共享之外,也可以共享数据段和堆栈段。5. unix 的进程调度程序能做到保证大部分进程处于运行状态,只有少数进程
12、处于阻塞状态,否则,系统的性能将大大下降。答:错误。事实上,恰恰相反,大部分进程处于“阻塞”状态,只有所等待的条件满足后才能转换为“运行状态” 。进程调度程序仅调度那些运行状态的进程。将进程的状态从“阻塞”转换为“运行”不是调度程序的任务,仅取决于外部条件的变化。6. 如果某个文件的权限设置为文件主不许读写,那么其他任何人都不可读写该文件。答:错误。超级用户 root 不受权限的限制。UNIX 在验证一个普通用户的进程对文件的访问权限严格按照下列三步进行:如果文件主与进程主相同,那么,使用文件主权限,不再查组和其他用户的权限;如果文件主与进程主不同,但文件主与进程主同组,那么,只使用组权限,不
13、使用关于其他用户的权限;如果文件主与进程主不同,文件主与进程主又不同组,那么,使用文件关于其他用户的权限。 所以,可把文件许可权置为文件主不可读写但同组用户可读第 5 页(共 9 页)写,即使文件主是该组用户之一也不行事实上;而且无论权限怎么设置,都不妨碍 root 用户操作它。7. 使用 socket 利用 TCP 协议编写通信程序,bind 调用只允许在服务端使用,客户端使用这一调用没有任何意义。答:错误。bind 调用的目的是指定一个网络连接的本地端点名,事实上,恰恰相反,大部分进程处于“阻塞”状态,只有所等待的条件满足后才能转换为“运行状态” 。进程调度程序仅调度那些运行状态的进程。将
14、进程的状态从“阻塞”转换为“运行”不是调度程序的任务,仅取决于外部条件的变化。8. UNIX 操作系统被设计得非常健壮,所以程序在运行过程中不会产生死锁。答:错误。像信号量等,UNIX 仅给出了一组信号量操作的机制,如果应用程序设计的多个进程之间对信号量的操作处置不当,仍然可能导致死锁。操作系统没有办法检测出应用进程之间的逻辑操作不正确产生的死锁。使用管道等其他的进程之间通信的系统调用,也可能产生死锁。9. UDP 不能保证可靠递交,在局域网环境下,假设通信线路是可靠的,尽管如此,两台计算机用 UDP 交换数据也有可能会丢失数据。答:正确。尽管通信没有任何故障,但是 UDP 通信的双方并没有流
15、量控制,所以,可能会由于接收缓冲区溢出的原因导致操作系统被迫丢弃数据。10. Windows 用户使用命令行命令 ftp 从 Unix 下载文件 ftas.c,即使没有病毒破坏,成功下载结束后,下载的文件与原文件也有可能在文件大小(字节数)上不符。答:正确。这种情况是可能存在的, FTP 支持 ASCII 方式和 BINARY 方式的文件传输。前者会把数据文件理解为文本文件,会在通信的两个机器之间进行文本文件格式的转换。UNIX 和Windows 对文本文件的定义方式不同,Windows 行间保留“换行”和“回车”两个字符,但是 UNIX 行间仅包括“换行 ”一个字符。所以在使用 ASCII
16、方式在 Windows 和 Unix 间交换文件可能会导致下载的文件与原文件在文件大小(字节数)上不符的情况。三. 简答题与编程题(共 56 分)1. (5 分) 用户 liu 有一个重要的文件 report.txt, 为保证该文件不会被无意地修改,移走和删除,应当采取什么措施? 第 6 页(共 9 页)答:为保证文件不会被无意地修改,取消文件的写权限;为保证文件不会被无意地移走和删除,取消该文件所在目录的写权限。2. (5 分) 关于文本文件处理的实用程序都有哪些?这些程序都有哪些共同的特点?为什么要这样设计这些命令?答:关于文本文件处理的实用程序有很多,如:head, tail,sort,
17、grep, wc,cat,od ,sed,awk ,等等。这些程序的共同特点是:每个小程序的功能设置简洁;当不指定处理对象时从标准输入获取处理数据;当指定文件名时,从指定的文件中获取处理数据,而且允许指定多于一个的文件名;处理结果在标准输出文件中输出。这样设计这些命令的原因是:可以利用系统提供的输入、输出重定向和管道,连接和组合多个命令,提供灵活又丰富的使用功能;允许指定多于一个的文件作为处理对象可以和 shell 的文件名通配符替换功能配合使用。体现了“策略和机制相分离”的设计理念。系统设计不复杂却可以提供强大的功能。3. (5 分) 什么是“忙等待”?忙等待有什么坏处?答:忙等待就是进程不
18、断占用 CPU 时间执行一个循环进行查询操作,直到条件满足才退出循环。忙等待的坏处在于:UNIX 系统是个多任务系统,在等待周期内,可能需要每秒执行查询操作成千上万次,与其它的执行进程竞争 CPU 时间,造成系统总体有效处理能力下降。4. (5 分) 目录的 x 权限起什么作用?root 用户拥有的目录树 eldk 下有许多子目录,每个子目录中也有若干个文件。现在 root 用户希望把这个目录树下所有子目录对所有用户开放 x 权限,但普通文件的权限不修改。怎样才能完成这个工作?答:(1)目录的 x 权限意味着分析路径名过程中可检索该目录。(2)完成这个要求可以使用 find 命令遍历目录树 e
19、ldk,符合规定条件“类型是目录” (-type d) ,执行指定动作“修改权限”(-exec chmod a+x ;)完整的命令为:find eldk -type d -exec chmod a+x ;5. (5 分) 写出能满足下列要求的正则表达式:(1) 第一个字符必须是字母,其余字符必须是字母或数字或下划线。(2) 匹配 C 语言算式 ai*bj,允许星号两侧有多余的空格。(3) 匹配带小数点的数据,如:123.431第 7 页(共 9 页)写出 vi 中能实现下列替换要求的命令:(4) 将格式为“日-月- 年”的日期数据,如:18-06-2010,替换为“年.月.日”格式,如:201
20、0.06.18(5) 将 3.1416 替换为 PI 答: (1) A-Za-za-zA-Z0-9_*(2) ai * *bj(3) 0-90-9*.0-90-9*(4) s/(0-90-9*)-(0-90-9*)-(0-90-9*)/3.2.1/(5)s/3.1416/PI/6. (5 分) select 系统调用的主要作用是什么? 答:使得用户进程可同时等待多个事件发生用户进程告知内核多个事件,某一个或多个事件发生时select 返回,否则,进程睡眠等待。例如:告知内核在 rfds 集合中的任何文件描述符“读准备好” ,或在 wfds 集合中的任何文件描述符“写准备好” ,或在 efds
21、集合中的任何文件描述符有 “异常情况”发生,或者超时时间 tm 指定的时间间隔到。7. (5 分)“策略和机制相分离”的方法,在 UNIX 系统的很多地方都得到了应用,这样做有什么好处?在 UNIX 中,哪些问题的处理中采取了这样的方式?答:这样做使得系统的实现变得很简单,但是却带来了更大的灵活性,所需要的功能有都能够实现。例如:使用管道和重定向方式组合多个命令完成某些复杂的功能;SUID 权限;B-Shell 中的四则运算,条件判断。8(5 分) echo *与 echo *的执行结果有什么区别?为什么?答:按照 shell 对文件通配符的处理方式,后者的*将被首先替换为当前目录下得所有文件
22、和目录名,前者由于有了双引号,这种替换被禁止。所以,前者打印星号,后者打印当前目录下所有的文件和目录名。9(5 分) 下列的脚本程序从键盘输入三个整数 A,B,C,并且求出A*(B+C)的值。在划线出填入适当的内容,完成整个程序。显式地标出你所添加的命令中必须有的空格和转义字符,并解释为什么必须这些空格和转义。#!/bin/shecho n ”Input A:”; read Aecho n ”Input B:”; read B第 8 页(共 9 页)echo n ”Input C:”; read CV= echo ”A*(B+C)=$V”答:expr $A * ( $B + $C )由于星号和
23、圆括号属于 shell 的元字符,所以前面增加反斜线,阻止 shell 对元字符的处理,而是将这些符号直接传递给 expr 命令。上述命令一共需要 6 个空格,空格起单词分界线的作用。如果 丢失了相应的空格,expr 命令将无法得到正确的参数输入,导致 expr 无法按预期的功能工作。10. (5 分) 写出一段完整的 C 语言程序,使用 fork()系统调用,创建两个子进程,第一个子进程打印 HELLO 后立刻终止,第二个子进程打印 WELCOME 后立刻终止,父进程等待两个子进程都终止后,打印 BYE 然后终止。答:程序如下:main()int sv;if (fork() = 0) pri
24、ntf(”HELLOn”);return 0;if (fork() = 0) printf(”WELCOMEn”);return 0;wait(wait(printf(”BYEn”);return 0;11. (6 分) 使用 UNIX 与进程管理有关的系统调用,编写 C 语言程序,实现与下列命令相同的功能。ps e | grep javaw为简化编程,假设系统调用执行均能成功,不考虑失败的情况。提示:相关的系统调用如下- 创建新进程用 fork()- exec 系统调用可以用 execlp(file,argv0, argv1, , 0);-创建匿名管道 pipe(int fd2);其中 fd
25、0为读端,fd 1为写端- dup2 系统调用用法为 dup2(src_fd, dst_fd);src_fd 覆盖掉第 9 页(共 9 页)dst_fd- 等待子程序结束用 wait( int sv;答:程序如下:main()int sv, fd2;pipe(fd);if (fork() = 0) dup2(fd1, 1);close(fd1);close(fd0);execlp(”ps”, ”ps”, ”-e”, 0); else if (fork() = 0) dup2(fd0, 0);close(fd1);close(fd0);execlp(”grep”, ”grep”, ”javaw”, 0);close(fd0);close(fd1);wait(wait(return 0;