湖北科技学院计算机学院2014年秋2012级物联网工程(本科)专业《LINUX高级编程》期末考查试卷(闭卷、100分钟)
一、单选题(每小题2分,共60分)
1.关于Linux内核版本的说法,以下错误的是( C )。
A.表示为主版本号.次版本号.修正号 B.1.2.3表示稳定的发行版
C.1.3.3表示稳定的发行版 D.2.2.5表示对内核2.2的第5次修正
2.下列不是可执行程序运行时内存结构的是( D )。
A. 代码区
B. 数据区
C. 栈堆区
D. 变量区
3. 下列有关fork()函数返回值说法错误的是( D )。
A. 正常情况下,fork调用一次,会返回两次。
B. 返回值等于0表示在子进程返回。
C. 返回值大于0表示在父进程中返回。
D. 大于0的返回值为父进程PID号。
4. 进程调用wait将被阻塞,直到( D )。
A. 用户按任意键
B. 收到时钟信号
C. 子进程被创建
D. 子进程结束
5. 下列关于网络编程的叙述中,错误的是( C )。
A.一个完整的网络程序应该包含两个独立的程序,它们分别运行在客户端和服务器端。
B.相同条件下UDP发送数据的速度要比TCP快。
C.当使用UDP编程时,若函数sendto()成功返回,表示系统发出的数据被通讯的对方准确接收到了。
D.端口号是16bit的地址码,端口号和IP地址构成一个插口(socket)。
6. 删除命名管道的系统调用是( A )。
A. unlink
B. close
C. fcolse
D. dup2
7. 当打开vi编辑器编辑文件时,vi处于(A)模式。
A. 命令模式
B.编辑模式
C.实模式
D.虚模式
8. 为了将当前目录下的归档文件my解压缩,可以使用( A )命令。
A. tar xvzf my
B. tar xvf my
C. tar vzf my
D. tar jvzf my
9. cat命令可( C )。
A. 设置捕鼠器
B. 查看子目录内容
C. 查看文本文件内容
D. 查看二进制文件
10. man命令可( D )。
A. 查看编译信息
B. 编译源程序
C. 查看用户信息
D. 查看帮助信息
11. 在Shell中Ctrl+D用于( A )。
A. 输入文件结束符
B. 撤销最近做的操作
C. 输出文件结束符
D. 输出文件名
12. pwd命令可( B )。
A. 查看密码
B. 查看当前目录
C. 查看在线用户
D. 查看终端
13. kill命令的功能是( C )。
A. 停止进程
B. 执行异步IO
C. 向进程发送信号
D. 查看帮助信息
14. 某shell程序运行时需向脚本传递参数,为得到参数的个数,可以使用( B )。
A. $@
B. $#
C. $0
D. $!
15. 在Linux中执行命令时,重定向IO的是( D )。
A. 命令
B. 参数
C. 标准输入
D. Shell
16. cp命令用于( A )。
A. 拷贝文件
B. 查询数据库
C. 网络连接
D. 执行命令
17. 默认情况下管理员创建了一个用户,就会在( B )目录下创建一个用户主目录。
A. /usr
B. /home
C. /root
D. /etc
18.在vi编辑器里,命令"dd"用来删除当前的( A )。
A. 行
B. 变量
C. 字
D. 字符
19.vi中哪条命令是不保存强制退出( C )。
A. :wq
B. :wq!
C. :q!
D. :quit
20. Shell脚本中的注释用( C )标记。
A. //
B. /*…*/
C. #
D. *
21. 用vi编辑并保存文件后,要退出vi编辑器时,可按Esc键切换到命令模式后,输入( A )。
A. :q
B. :a
C. :b
D. :c
22. bind调用用于( A )。
A. 为socket分配地址
B. 客户端与服务器连接
C. 接收socket上的连接
D. 监听socket上的连接
23. 一个进程收到SIGCHILD信号,表示( C )。
A. 创建子进程成功
B. 创建子进程失败
C. 子进程结束
D. 子进程开始运行
24.如果用户想对某一命令详细的了解,可用( C )命令。
A. ls
B. help
C. man D dir
25.若要将鼠标从VM中释放出来,可按( A )键来实现。
A. Ctrl+Alt
B. Ctrl+Alt+Del
C. Ctrl+Alt+Enter
D. Ctrl+Enter
26.在UNIX/Linux系统添加新用户的命令是( D )。
A. groupadd
B. usermod
C. userdel
D. useradd
27.删除文件命令为( D )。
A.mkdir B. move C. mv D. rm
28.从后台启动进程,应在命令的结尾加上符号( A )。
A.& B. @ C. # D. $
29.如果执行命令#chmod 746 ,那么该文件的权限是(A)。
A. rwxr--rw-
B. rw-r--r--
C. --xr—rwx
D. rwxr--r—
30.下列那一个指令可以设定使用者的密码( C )。
A.pwd B.newpwd C.passwd D.password
二、简答题(第1小题4分,第2小题6分,共10分)
1.进程之间通信有哪几种方式,各用于何种情景?
答:管道、共享内存、信号、消息、socket。进程通信根据交换信息量的多少分为高级通信和低级通信。
低级通信一般只传送一个或几个字节的信息,以达到控制进程执行速度的作用(如pv操作);高级通信则要传送大量数据,目的不是为了控制进程的执行速度,而是为了交换信息。高级进程通信方式有很多种,大致可归并为三类:共享存储器、管道文件和消息传递。
共享存储器:在内存种分配一片空间作为共享存储区。需要进行通信的进程把它附加到自己的地址空间中,不需要时则把它取消。管道文件:它是连接两个命令的一个打开文件。一个命令向该文件中写入数据,为写者;另一个命令从该文件中读出数据,为读者。消息传递:它以消息为单位在进程间进行数据交换。
2.若在计算机硬件系统中增加一个字符设备,为让用户方便地使用该设备,从底层硬件到应用层用户接口,我们应该在哪些层次编写何种功能的软件?可能会碰到哪些问题?
答:驱动程序,虚拟文件系统VFS,设备文件节点,应用层API
驱动程序:驱动程序就是一组程序,一个比较特别的软件,它具有一般程序的一些特性,可以形象地把它理解为是搭建在计算机硬件设备与操作系统之间的桥梁,它的作用就是使操作系
统能够正确地识别、管理、使用相应的硬件设备。
虚拟文件系统VFS:向上,对应用层提供一个标准的文件操作接口;对下,对文件系统提供一个标准的接口,以便其他操作系统的文件系统可以方便的移植到Linux上;VFS内部则通过一系列
高效的管理机制,比如inode cache, dentry cache 以及文件系统的预读等技术,使得
底层文件系统不需沉溺到复杂的内核操作,即可获得高性能;此外VFS把一些复杂的操
作尽量抽象到VFS内部,使得底层文件系统实现更简单。
设备文件节点:x中设备节点是通过“mknod”命令来创建的。一个设备节点其实就是一个文件,Linux中称为设备文件。有一点必要说明的是,在Linux中,所有的设备访问都是通过文件的方
式,一般的数据文件程序普通文件,设备节点称为设备文件。
应用层API:用户编程接口API遵循了UNIX中最流行的应用编程界面标准---POSIX标准。POSIX标准是由IEEE和ISO/IEC共同开发的标准系统。该标准基于当时现有的UNIX实践和经验,
描述了操作系统的系统调用编程接口API,用于保证应用程序可以在源程序一级上在多种
操作系统上移植运行。这些系统调用编程接口主要是通过C库(LIBC)来实现的。
三、程序设计题(每题3分,共30分)
1.某工程包含源文件sub1.c,sub1.h, sub2.c, fun.h, fun.c, main.c,生成可执行文件doit,写一个makefile,要求:(1)执行make,可以最小编译代价得到可执行文件doit。
(2)执行make clean,清除可执行文件和全部目标文件。
(3)若sub1.h修改,sub1.o需重新编译;若fun.h发生修改,fun.o需重新编译。
(4)若main.o,sub1.o,sub2.o,fun.o发生修改,doit需重新生成。
解:
Makefile
doit:sub1.o sub2.o fun.o main.o
gcc -o doit sub1.o sub2.o fun.o main.o
main.o:main.c
gcc –c main.c
sub1.o:sub1.c sub1.h
gcc -c sub1.c
sub2.o:sub2.c
gcc -c sub2.c
fun.o:fun.c fun.h
gcc –c fun.c
clean:
rm -rf *.o doit
2.桌子上有一个盘子,最多只能装2个水果。爸爸只能向盘中每次放入一个水果,儿子每次从盘中取出一个水果。请编写两个C语言程序,模拟爸爸和儿子的动作过程。
解:
#include
#include
#include
void Father();//Father进程
void Son();//Son进程
void Print();//向控制台输出信息
int Plate_Size=0;//盘子中开始的苹果数
int apple=0;//苹果数
int Father_lag=0;//父亲是否处理等待状态,1时表示等待
int Son_lag;//儿子是否处于等待状态,1时表示等待
void Print(){
printf("现在盘子里有%d个苹果\n",apple);
if(Father_lag) {
printf("Father进程处于等待状态");
}
if(Son_lag) {
printf("Son进程处于等待状态");
}
if((Father_lag==0)&&(Son_flag==0))!=1) {
printf("\n");
}
}
void Father(){//Father进程
apple++;
Print();
}
void Son(){//Son进程
apple--;
Print();
}
int main(){
int i;//1,表示Father进程操作,2时表示Son进程操作
int Plate_Size;//水果数量
while(1) {
i=rand()%2+1;//产生1,2随机数,其中1,表示Father()操作,2表示Son()进程操作switch(i) {
case 1:
if(Plate_Size==2) {
Father_lag=1;//Father()进程等待
Print();
}
else{
Father();
if(Son_lag==1) {
Son_lag=0;//唤醒Son()可以拿苹果了
Son();
}
}
break;
case 2:
if(Plate_Size==0){
Son_lag=1;//Son()进程等待
Print();
}
else{
Son();
if(Father_lag==1){
Father_lag=0;//唤醒Father()可以放苹果了
Father();
}
}
break;
}
}
}
3.完成A、B两个进程所对应的C语言源程序。两进程共享一块结构体内存,结构体类型定义如下,A进程往该共享结构体内存中写入一帧视频数据,B进程从中读取。共享内存为空,A进程才可写入,共享内存中有数据,B进程才可读出。
typedef struct _Frame{
int BufLen; //帧长度,
int FrameType; //数据帧的类型
unsigned char FrameBuf[4096]; //帧数据,每帧数据不超过4KB
}FRAME;