《Linux编程环境》样题及参考答案
《Linux编程环境》期末考试样题
⼀.(共20分,每⼩题2分)给出完成下列各项功能所需要命令。陈述利⽤了该命令的哪个功能或选项。
1.如何得知命令netstat众多选项中哪个选项可以打印出IP路由表?
答:使⽤man命令,man命令可以在线查阅命令的使⽤⼿册,使⽤命令man netstat查出netstat命令的使⽤⼿册,看看哪个选项和什么命令格式⽤来打印出ip的路由表。
2.删除⽂件名为-f的⽂件。
答:使⽤rm命令,由于命令会默认以减号开始的命令⾏参数为命令处理的选项⽽不是处理对象,所以需要使⽤特殊的选项--以显式的⽅式说明选项的结束。命令为rm -- -i
3.在你完成上机作业过程中,使⽤什么命令将源程序⽂件mylist.c编译、
链接⽣成可执⾏⽂件?可执⾏⽂件是什么名字?如何运⾏?
答:使⽤gcc命令或者make,实现编译和链接
linux在线编程gcc mylist.c –o mylist
或者:make mylist
⽣成的可执⾏⽂件名按照惯例为mylist,⼀般情况下当前环境变量
PATH不包括当前⽬录,所以,运⾏这个可执⾏程序应当加上当前路径,命令为:./mylist
4.去掉⽂件中的所有空⾏(所谓空⾏指:⾏内不含有任何除空格之
外的字符),存为新⽂件。
答:使⽤grep命令可以⽤正则表达式对⽂本⽂件过滤,-v选项⽤于筛选掉能匹配指定正则表达式的⾏,描述⼀个空⾏的正则表达式为^ *$,即:从⾏⾸开始(^),有零个到多个空格( *),然后是⾏尾($),命令为:
grep –v ’^ *$’ >
5.检索⽬录src以及其⼦孙⽬录中的所有⽂件名后缀为.c和.h⽂件,查
哪些⽂件中含有字符串TPDU,并列出在这⽂件中的⾏号。
答:使⽤find命令和grep命令。find命令可以在指定的⽬录树中查满⾜某个条件的⽂件或⽬录,并对查到的满⾜条件的对象执⾏⼀个动作。指定查条件为“⽂件名后缀为.c和.h”,动作为“查哪些⽂件中含有字符串TPDU,并列出在这⽂件中的⾏号”,分别是find的
-name和-exec选项。完整的命令为:
find src –name ”*.[ch]”–exec grep –n TPDU {} /dev/null \;
6.⽂本⽂件fexc.c有⼏千⾏,保留了备份fexc0.c后另个程序员在fexc.c
中作了多处修改,如何出他在原先程序的基础上作了哪些修改?
答:diff命令可以对⽂本⽂件进⾏⽐较,出两个⽂件的差别。由于C语⾔源程序⽂件为⽂本⽂件,可以⽤diff完成上述功能。完整的命令为:
diff fexc0.c fexc.c
7.⽤户使⽤低速⽹络从另台Linux中下载了⼀个2.2GB数据⽂件,他怀疑
下载完该⽂件后远端⽂件⼜做了更新。如何⽤简便的⽅法验证本地和远端的两个⽂件的内容是否完全相同?
答:使⽤md5sum命令或sha1sum,分别利⽤本地和远端⽂件的16字节“消息摘要”,通过⽐较“消息摘要”来判断两⽂件内容是否完全相同。
8.⽬录work.d上周的备份⽬录为work.bak,仅有⼀⼩部分⽂件作了修
改,如何仅仅将被修改过的⽂件和新创建的⽂件拷贝到备份⽬录?
答:cp命令实现了增量拷贝的功能,增量拷贝的基本功能就是检查源⽬录下的⽂件和⽬的⽬录下的同名⽂件的最后⼀次修改时间,当源⽂件的最后⼀次修改时间晚于⽬的⽂件的最后⼀次修改时间,或者同名的⽬的⽂件不存在时,才执⾏复制操作。完整的命令为:
cp –ur work.d work.bak
9.程序xftpd正在运⾏,随时间的变化,系统的内存资源越来越紧张。如
何判断该程序在运⾏过程中是否存在内存泄漏?
答:ps命令的-l选项,可以打印出进程当前的SZ属性,即:进程的虚拟内存空间⼤⼩。当进程在运⾏过程中存在内存泄漏时,进程的虚拟内存空间⼤⼩会逐渐随时间增⼤。使⽤ps –l | grep xftpd可以看出进程xftpd属性。
10.如何让系统每10秒⼀次周期性地列出正在下载的⽂件a.dat的⼤⼩?
答:⾃动地重复执⾏⼀个命令,利⽤shell的循环机制。让shell 睡眠10秒钟的命令为sleep 10。整个命令为:
while true; do ls –l a.dat; sleep 10;done
⼆.(共20分,每⼩题2分)下列说法是否正确,简要阐述理由。1.Linux中普通⽤户忘记登录⼝令,可以通过超级⽤户root查出当前⼝令,
然后重新登录。
答:错误。root也不能查出⽤户的登录⼝令,但是可以重设登录⼝令,让⽤户使⽤新⼝令登录。
2.Linux中命令ls -l与命令ls -l *的执⾏结果相同,都是列出当前⽬录下
的所有⽂件。
答:错误。ls -l列出当前⽬录下的所有⽂件和⽬录。*代表当下⽬录下的所有⽬录及⽂件,ls –l *列出当前⽬录下的所有⽂件(不包括⽬录)以及当前⽬录下所有⽬录中的内容。
3.命令ln仅允许对普通⽂件实现硬连接,对⽬录不许硬连接操作。所以,
所有⽬录的link数总为1。
答:错误。尽管命令ln仅允许对普通⽂件实现硬连接,对⽬录不许硬连接操作,但是,⽬录的硬连接由系统⾃动实现,当前⽬录下的.⽂件和⼦⽬录中的..⽂件,均是指向当前⽬录的硬连接,在创
建新⽬录时系统⾃动实现。所以,⽬录的link数会⼤于1,⼀般情况下⽬录的link数=直属⼦⽬录数+2。
4.Linux⽂件权限设计为简单的三级控制,⽤户liu对⽤户sun的⽂件
<要么具有全部的读权限,要么不可以读。因此,没有办法限制liu只对⽂件的指定部分读。
答:错误。可以利⽤SUID权限,⽤户sun将⽂件的读写权限设置为rw-------,由⽂件所有者sun⾃⼰编写程序以实现对⽂件的访问,程序中的访问当然可以限制只对⽂件的指定部分读,但是该程序⽂件的属性应当为rws--x--x,⽤户liu只有执⾏这个可程序程序⽂件才能实现对⽂件的访问。
5.Linux的进程调度程序能保证⼤部分进程处于运⾏状态,只有少数进程
处于阻塞状态,否则,系统的性能将⼤⼤下降。
答:错误。事实上,恰恰相反,⼤部分进程处于“阻塞”状态,只有所等待的条件满⾜后才能转换为“运⾏状态”。进程调度程序仅调度那些运⾏状态的进程。将进程的状态从“阻塞”转换为“运⾏”不是调度程序的任务,仅取决于外部条件的变化。
6.程序从启动运⾏到运⾏结束总共持续了t秒,占⽤⽤户时间为t1秒,系
统时间为t2秒,所以有t=t1+t2成⽴。
答:错误。除了t1,t2,还有进程阻塞的时间。⼀般来说,会有t>t1+t2.
7.fork后得到两个⼏乎完全相同的进程,但是对内存的占⽤不会成倍增加。
答:正确。fork后,从逻辑上可以得到两个⼏乎完全相同的进程,⽗⼦进程有独⽴的数据段、堆栈段和指令段,但是,操作系统可以通过使⽤copy-on-write技术等⽅式,使得⽗⼦进程共享同⼀段物理内存,除了代码段可以共享之外,也可以共享数据段
和堆栈段。
8.在bash中,圆括号和花括号都可以括起⼀组命令,两者没什么区别。
答:错误。⾸先,语法不同:()是元字符,⽽{}不是,语法分别
是(list)和{ list;}。其次,语义不同:()执⾏需要重启⼀个⼦shell 进程,在⼦进程中执⾏圆括号内的各个命令,⽽{}在当前shell进程中执⾏。
9.使⽤socket利⽤TCP协议编写通信程序,bind调⽤只应该在服务端使
⽤,客户端使⽤这⼀调⽤没有意义。
答:错误。bind调⽤的⽬的是指定⼀个⽹络连接的本地端点名。客户端程序⼀般不使⽤bind调⽤,操作系统⾃动为socket分配本地IP地址和本地TCP端⼝号。如果本计算机有多个IP地址,客户要求必须使⽤其中的某个地址,或者,客户需要指定本地端⼝号,那么就需要⽤bind 调⽤,然后再执⾏connect调⽤。
10.程序⽤socket机制通过系统调⽤ret=send(sock,buf,1024,0)向远端
TCP主机发送1024字节数据,系统调⽤执⾏成功的标志是返回⼀个⾮负数的整数值,ret的返回值为1024,由于TCP提供了可靠的传输层服务,所以可以断定这1024字节数据已经成功地传输到了接收端进程。
答:错误。send成功返回只能说明1024字节的数据已经拷贝到发送缓冲区中,但不能确定已经成功地传输到了接收端进程。
三.简答题(每题4分,共40分)
1.在字符终端上执⾏cat /usr/bin/*之后屏幕开始显⽰乱码,按下Ctrl-C
中⽌后,⽆论从键盘输⼊什么内容,屏幕回显的内容都是各种线条等制表符号。解释产⽣这⼀现象的原因。
答:由于这个⽬录下是⼀些可执⾏⽂件,不是⽂本⽂件。不可正常打印的字节序列顺序发往终端,当终端收到的字节序列中凑巧有正好是⼀个终端控制转义序列,这个转义序列导致终端字符集发⽣了改变。
2.⽤户在字符终端上使⽤vi命令编辑⽂件,当按下Ctrl-S执⾏存盘(Save)
操作后,终端就进⼊了冻结状态,随后从键盘输⼊了多个命令,终端显⽰不发⽣任何改变。解释产⽣这⼀现象的原因。
答:尽管许多Windows编辑器Ctrl-S是存盘热键,但是在Linux终端⾥,Ctrl-S是流控字符XOFF(对应的ASCII码为19)。当主机收到XOFF后,主机认为终端停⽌数据接收,主机就停⽌输出,直到收到XON 字符(对应的ASCII码为17),流控状态解除。XON字符对应的热键是Ctrl-Q。所以,在按下Ctrl-Q之前,终端的输出会⼀直处于“冻结”状态。
3.写出能满⾜下列要求的正则表达式:
(1) 第⼀个字符必须是字母,其余字符必须是字母或数字或下划线。
(2) 匹配C语⾔算式a[i]*b[j],允许星号两侧有多余的空格。
写出vi中能实现下列替换要求的命令:
(3) 将格式为“⽇-⽉-年”的⽇期数据,如:27-06-2017,替换为
“年.⽉.⽇”格式,如:2017.06.27。
(4)将HTML⽂件中所有以尖括号括起来的标签部分替换为空格。
答:
(1) [A-Za-z][a-zA-Z0-9_]*
(2) a\[i] *\* *b\[j]
(3) s/\([0-9][0-9]*\)-\([0-9][0-9]*\)-\([0-9][0-9]*\)/\3.\2.\1/
(4) s/<[^<>]*>/ /
4.Linux中某个普通磁盘⽂件对所有⽤户赋予了读写权限,但删除该⽂件
失败。导致可修改⽂件⽆法删除的原因是什么?
答:应该是⽂件所处的⽬录没有写权限。因为要删除这个⽂件,只需要能对⽂件所在的⽬录可写,对⽂件⾃⾝的权限没有任何要求。
5.在当前⽬录/home/sun下执⾏chmod 000 . 命令后,随后执⾏
chmod 777 . 命令失败。为什么会失败?这样导致当前⽬录⽆法访问,如何解除这⼀困境?
答:.代表当前⽬录,chmod 000 . 命令修改了当前⽬录的读写可执⾏权限,使得⽆法对当前⽬录中名称为“.”的⽂件进⾏检索访问和修改⽬录结构。因⽽chmod 777 .命令会失败。
使⽤chmod 777 /home/sun可以解除这⼀困境,因为这个命令访问的是/home⽬录,只要/home⽬录有x属性,就可以修改这个⽬录下的sun的属性。这个过程中对当前⽬录的属性没有任何要求。
6.在Windows下输⼊命令名,系统⾸先检索当前⽬录下是否有这个可执⾏
⽂件,检索不到,会逐个检查PATH环境变量列出的各⽬录。Linux不⾃动检索当前⽬录,⽽且环境变量PATH中⼀般不含当前⽬录./,为什么?
答:出于安全⽅⾯的考虑,假如⽤户a在/tmp⽬录下创建名为ls 的恶意程序,并对所⽤⽤户赋予执⾏权限x。当⽤户b在/tmp⽬录下执⾏命令ls,由于PATH中含有./分量,将以⽤户b的⾝份执⾏/tmp/ls,因⽽造成安全问题。
7.当前⽬录下具有可执⾏属性的bash脚本⽂件a.sh,在bash提⽰符下执
⾏命令./a.sh与. a.sh(将前个命令的斜线换成空格),有什么区别?
答:./a.sh 将创建⼦进程,在⼦shell中执⾏当前⽬录下的a.sh 脚本⾥的程序;. a.sh 将在当前的Shell中执⾏a.sh脚本。
8.命令gcc myap.c -o myap因源程序有⼤量问题,错误信息很多,为
什么⽤gcc myap.c -o myap | more不能做到每显⽰⼀屏后暂停等待按下空格键再继续显⽰?要达到这个⽬的,应怎样使⽤这些命令?
答:gcc将编译链接过程产⽣的错误信息输出到标准错误⽂件stderr中,⽽管道只是将前⼀个命令的标准输出stdout管道到下⼀个
命令的标准输⼊stdin,并不影响标准错误stderr的输出。正确的⽤法是
gcc myap.c -o myap 2>&1 | more
其中,2>&1将标准错误输出stderr输出到与标准输出stdout 相同的地⽅。stderr和stdout对应的⽂件描述符分别是2和1。
9.在同⼀台Linux上的两个进程之间交换数据可以通过下列两种⽅式。⼀,
使⽤TCP Socket完成;⼆,两进程共享内存,并使⽤信号量(semaphore)的P/V操作操作完成。两种⽅式各有那些利弊?
答:使⽤TCP socket对程序员来说操作简便,但是数据需要在内核与⽤户进程之间进⾏两次拷贝。共享内存对于程序员操作复杂,但是不需要拷贝数据,效率较⾼。
10.在bash命令提⽰符下输⼊下列内容后按下回车,会导致Linux操作系统
崩溃吗?如果系统不崩溃的话,会出现什么现象?为什么?
a(){a; };a
答:这个命令⾸先定义了⼀个函数a,函数中的内容就是调⽤⾃⼰(递归);其次,调⽤函数a。
这种递归死循环不会导致系统崩溃,但是会导致当前的shell进程的堆栈段不停⽣长,当超过极限之后,当前shell进程崩溃。
四.程序分析题(共10分)
某Linux系统在TCP端⼝12345提供⼀种专⽤的⽂件传输服务。下⾯的服务器端程序采⽤“多进程并发”的⽅法同时为多个客户端服务。每到达⼀个TCP连接就创建⼀个⼦进程运⾏可执⾏⽂件xftpd负责与这个客户端之
1.上述源程序中,有哪些数据(包括变量和常量)被存放在数据段?有哪
些数据被存放在堆栈段?
2.上述服务器进程⼤部分时间处于阻塞状态,程序中的哪条语句导致进程
进⼊阻塞状态?阻塞状态在什么时机被解除?
3.如果删除上述程序中的第12⾏,会有什么问题?
4.如果删除上述程序中的第22⾏,会有什么问题?
5.客户完成⽂件传输操作后断开TCP连接,第19⾏的语句未执⾏打印动
作,为什么?
答:
1.第17,18,19⾏都有⽤引号包起来的字符串数据,这些常量数据放在数
据段;第5⾏的变量name声明为static,它也被安排在数据段。其他的三个变量admin_sock,data_so
ck,str,都是在函数内部定义的auto 型变量,在堆栈段分配存储空间。第7,8,9⾏,11⾏等等的int型常数以及其他⾏常数0,存放在指令段,属
于“⽴即寻址型”指令操作数。
2.第14条语句的accept调⽤导致进程进⼊阻塞状态。当有新的TCP连
接到来时,从阻塞状态中解除。
3.第12⾏宣称忽略掉SIGCLD信号,当⼦进程中⽌时,将⾃动丢弃⼦进程
的僵⼫。如果缺少这条语句,随着结束了服务的⼦进程产⽣的僵⼫越来越多,会导致操作系统内核中的进程槽耗光,⽆法创建新进程。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论