linux期末考试题
一、选择题(共30分,每小题2分)
1.以下关于自由软件的说法,正确的是(D)
A、自由软件是一种有版权保护的软件 B、修改自由软件应取得原作者的许可
C、微软的 Ofice 软件属于自由软件 D、自由软件不一定都是免费的
解答:
自由软件确实有版权保护(通常基于版权法或类似法律框架),但它通过特定的许可证(如GPL、MIT等)赋予用户特定的自由。因此,自由软件是有版权保护的,但这种保护是为了确保用户享有自由软件的自由,而不是限制用户的使用。
自由软件的核心原则之一是用户可以自由地修改软件,而无需事先取得原作者的许可。只要遵守相应的自由软件许可证条款(如提供修改后的源代码),用户就可以自由地修改和分发软件。
微软的Office软件是专有软件,其源代码不公开,用户没有自由使用、修改和分发的权利。
自由软件的"自由"指的是用户享有运行、复制、分发、学习、修改和改进软件的自由,而不是指软件的价格。自由软件可以免费获取,也可以收费(例如,某些公司可能提供自由软件的技术支持或附加服务并收费)。关键在于用户是否享有上述自由,而不是软件是否免费。
2.使用下列哪个命令可以将目录下所有文件和子目录全都显示出来(D)
A、ls -l B、dir -all C、ls -a D、ls -R
解答:
ls -l
用于以长格式(详细信息)列出当前目录下的文件和子目录,但它不会递归显示子目录中的内容。
dir
是一个在某些系统(如Windows的CMD)中使用的命令,用于列出目录内容。在Unix/Linux系统中,dir
通常是 ls
的别名,但 -all
不是 dir
或 ls
的有效选项。因此,这个选项在Unix/Linux系统中不适用。
ls -a
用于列出当前目录下的所有文件和子目录,包括隐藏文件(以点开头的文件)。然而,它不会递归显示子目录中的内容。
ls -R
用于递归列出当前目录及其所有子目录中的文件和子目录。
3.下面哪个命令可以在文件中查找内容(C)。
A、pause B、cat C、grep D、 more
解答:
pause
不是Unix/Linux系统中的标准命令。在某些环境(如Windows批处理脚本)中,pause
用于暂停脚本执行并等待用户按键,但它与文件内容查找无关。
cat
命令用于显示文件的全部内容,但它不具备搜索功能。
grep
是一个强大的文本搜索工具,专门用于在文件中查找匹配特定模式(字符串或正则表达式)的行。
ore
是一个分页查看文件内容的命令,用户可以逐页浏览文件内容,但它本身不提供搜索功能。
4.以下哪个环境变量表示命令的搜索路径(A)。
A、PATH B、PWD C、HOME D、PSI
解答:
PATH
是一个环境变量,用于定义系统在哪些目录中查找可执行命令。当用户在终端输入一个命令时,系统会按照 PATH
中列出的目录顺序依次查找该命令的可执行文件。echo $PATH
会输出当前系统的命令搜索路径。
PWD
(Print Working Directory)是一个环境变量,表示当前工作目录的绝对路径。它与命令的搜索路径无关。
HOME
是一个环境变量,表示当前用户的主目录路径。它通常用于存储用户的个人文件和配置,与命令的搜索路径无关。
PSI
不是一个常见的环境变量,也不是用于定义命令搜索路径的变量。在某些上下文中,PSI
可能有其他含义(如进程状态接口),但与本题无关。
5.默认情况下管理员创建了一个用户,就会在(B)目录下创建一个用户主目录。
A、/usr B、/ home C、/root D、/boot
解答:
/usr
目录通常用于存储系统软件和程序资源,例如可执行文件、库文件和文档等。
/home
是Linux系统中用户主目录的标准存储位置。默认情况下,当管理员创建一个新用户时,系统会在 /home
目录下为该用户创建一个以用户名命名的子目录作为其主目录。
/root
是系统管理员(root用户)的专属主目录。
/etc
目录用于存储系统的配置文件,例如用户账户信息、网络配置、服务配置等。
6.vi中哪条命令可以用来保存文件(A)。
A、:w B、:save C、:q D、:r
解答:
:w
是 vi
编辑器中的命令,用于将当前缓冲区的内容写入(保存)到文件中。如果文件已存在,则覆盖原文件;如果文件不存在,则创建新文件。
:save
不是 vi
的标准命令。vi
中没有直接名为 :save
的命令用于保存文件。
:q
是 vi
编辑器中的命令,用于退出编辑器。但如果文件未保存,直接使用 :q
会导致错误(除非使用 :q!
强制退出)。
:r
是 vi
编辑器中的命令,用于读取文件内容并将其插入到当前光标位置。
7.Linux中,用户的密码保存在以下哪个文件里(C)。
A、/etc/sudoers B、/etc/ passwd C、/etc/shadow D、/etc/inittab
解答:
/etc/sudoers
文件用于配置 sudo
命令的权限,定义哪些用户或用户组可以以其他用户(通常是 root
)的身份执行命令。
/etc/passwd
文件是Linux系统中用于存储用户账户信息的文件,包括用户名、用户ID、组ID、家目录、登录Shell等。然而,出于安全考虑,现代Linux系统通常不在此文件中存储加密后的用户密码,而是使用一个占位符(如 x
或 *
)代替。
/etc/shadow
文件是Linux系统中专门用于存储加密后的用户密码的文件。它只能由 root
用户读取,包含了用户的加密密码、密码最后修改时间、密码有效期等信息。
/etc/inittab
文件(在较新的系统中可能已被 systemd
取代)用于配置系统的初始化过程,定义系统运行级别、启动脚本等。
8.Linux 中显示文件的类型的命令是(C)。
A、whereis B、list C、file D、cat
解答:
whereis
用于查找二进制文件、源文件和手册页的位置。
ls
用于列出目录内容,但不显示文件类型(除非结合 -F
或 -l
等选项查看部分类型信息,但不直接显示文件类型描述)。
file
是Linux中的一个命令,用于确定文件的类型。它会读取文件的内容并尝试识别文件的格式(如文本文件、二进制文件、可执行文件、图片文件等),并输出相应的描述。
cat
命令用于显示文件的全部内容,但它不提供文件类型的信息。它只是将文件内容输出到终端。
9.dirl是一个目录,当执行"rm -rf dirl"命令时,Linux系统会(B)。
A.经过用户确认后再删除 dirl B.直接删除 dirl及 dirl下的所有文件
C.只删除 dirl 下的文件,保留目录 dirl D.只有当 dirl 非空时才能删除
解答:
rm
是用于删除文件或目录的命令。
-r
(或 -R
)选项表示递归删除,即删除目录及其所有内容(包括子目录和文件)。
-f
选项表示强制删除,即不提示用户确认,直接删除文件或目录(即使文件是只读的或用户没有写权限,也会尝试删除,除非遇到权限完全拒绝的情况)。
10.执行"cp -s"命令可以(D)。
A.拷贝文件 B.拷贝目录 C.创建一个文件的硬链接 D.创建一个文件的符号链接
解答:
cp
是用于复制文件或目录的命令。
-s选项在cp命令中用于创建符号链接(也称为软链接),而不是复制文件内容。
符号链接是一个指向另一个文件或目录的特殊文件,类似于Windows中的快捷方式。如果源文件被删除或移动,符号链接将失效(成为"悬空链接")。
cp
命令的基本功能是拷贝文件,但 -s
选项改变了默认行为,不进行实际拷贝,而是创建符号链接。
cp
命令可以使用 -r
或 -R
选项递归拷贝目录。
硬链接是通过 ln
命令(不带 -s
选项)创建的,硬链接是文件的另一个名称,与原文件共享相同的inode和数据块。
11.以下哪个命令可以对文件重命名(C)。
A、chown B、chname C、mv D、chmod
解答:
hown
命令用于更改文件或目录的所有者(即用户或用户组)。它的基本语法是 chown [选项] 新所有者 文件
。
chname
不是Linux中的标准命令。在常见的Linux发行版中,没有这个命令用于文件重命名。
mv
命令用于移动文件或目录,同时也可以用于重命名文件或目录。它的基本语法是 mv [选项] 源文件或目录 目标文件或目录
。如果目标路径与源路径在同一目录下但名称不同,则相当于重命名。
chmod
命令用于更改文件或目录的权限(即读、写、执行权限)。它的基本语法是 chmod [选项] 权限 文件
。
12.使用gcc命令编译C语言程序,需要输出的可执行程序带调试信息,应该(B)
A、gcc -o B、gcc -g C、gcc -E D、gcc -c
解答:
-o
选项用于指定输出文件的名称。例如,gcc -o myprogram source.c
会将编译后的可执行文件命名为 myprogram
。但 -o
本身并不添加调试信息。
-g
选项用于在编译时生成调试信息。这些调试信息(如符号表、行号信息等)会被嵌入到可执行文件中,供调试器(如 gdb
)使用。
gcc -E
用于仅对源文件进行预处理,并将预处理结果输出到标准输出(或通过重定向保存到文件)。它不生成可执行程序,也不添加调试信息。
-c
选项用于仅编译源文件,生成目标文件(.o
文件),而不进行链接。它不生成最终的可执行程序,也不添加调试信息到可执行程序(因为根本没有生成可执行程序)。
13.文件的 inode 中不包含以下哪些内容(A)。
A、文件名称 B、文件的访问权限 C、文件的链接数 D、文件数据 block 的位置
解答:
inode(索引节点)是Linux文件系统中用于存储文件元数据的数据结构。
inode中包含的信息通常包括:
- 文件的类型(如普通文件、目录、符号链接等)。
- 文件的访问权限(如读、写、执行权限)。
- 文件的硬链接数(即指向该inode的目录项数量)。
- 文件所有者的用户ID和组ID。
- 文件的大小(以字节为单位)。
- 文件数据块的指针(即文件数据在磁盘上的存储位置)。
- 文件的创建时间、修改时间、访问时间等时间戳。
inode中不包含的信息是文件名。文件名存储在目录项中,目录项将文件名映射到对应的inode号。
14.为了达到使文件的属主和同组用户有读(r)、写(w)和执行(x)的权限,而其他用户有读(r)执行权限(x),在设置文件的许可值时,应当设为(C)。
A、665 B、774 C、775 D、654
解答:
读(r):4 写(w):2 执行(x):1
属主权限:4+2+1=7
同组用户权限:4+2+1=7
其他用户权限:4+1=5
故而设置许可值时,应当设为775
15.shell编程时,表达式[ a = b ]的含意是(B)
A、将变量b的值赋给变量a B、测试字符串a和字符串b是否相等
C、测试整数a和整数b是否相等 D、将变量b的值赋给变量a并返回b的值
解答:
=
在 [ ]
中用于字符串比较(不是赋值)。
如果变量 $a
和 $b
的字符串值相同,则表达式返回真(退出状态为0),否则返回假(非0)。
=
在 [ ]
中不是赋值操作,赋值在shell中用 =
直接完成(如 a=$b
)
测试整数是否相等应使用 -eq
(如 [ $a -eq $b ]
)
[ ]
是条件测试,不会赋值或返回值。
二、简答题(共40 分,每小题10分)
1、什么是 Linux 的管道功能和输入/输出重定向功能?举例说明如何使用该功能。
答: Linux的管道功能(|
)用于将一个命令的输出作为另一个命令的输入,实现命令间的数据传递;输入/输出重定向则通过符号(如 >
、>>
、<
)将命令的输入/输出从默认设备(如键盘/屏幕)重定向到文件或其他设备。例如:
- 管道:
ls -l | grep ".txt"
将ls -l
的输出通过管道传递给grep
,仅显示包含.txt
的文件。 - 输出重定向:
echo "Hello" > file.txt
将echo
的输出重定向到file.txt
(覆盖原内容),>>
则追加内容。 - 输入重定向:
grep "word" < file.txt
从file.txt
读取输入并搜索"word"
。
2.请列出Linux操作系统的主要目录,并说明该目录的功能是什么。(注:请至少列出10个要目录)
答:
以下是Linux操作系统中至少10个主要目录及其功能的说明:
/
(根目录)
整个文件系统的起点,所有其他目录和文件都位于根目录下或其子目录中,是Linux文件系统的最高层级。/bin
存放系统启动和日常操作所必需的基本命令,如ls
、cp
、mv
和cat
等,这些命令无需额外权限即可使用。/sbin
存放关键的命令,这些指令大多专为root用户设计,比如分区工具、ifconfig
(网络配置工具)和shutdown
(关机命令)等。/etc
存放系统的配置文件,几乎所有的系统服务设置文件都被放置在这个目录中,涵盖了从用户账户设置(如/etc/passwd
)到网络设置(如/etc/network
),以及系统启动相关设置(如/etc/hostname
)等多个方面。/dev
存放设备文件,这些文件并非用于存储数据,而是充当操作系统与各类硬件设备沟通的桥梁,通过这些设备文件来实现对硬件如硬盘、键盘、鼠标、光驱等的识别与操作。/proc
一个虚拟文件系统,实时反映了系统运行时的状态信息,用户可以通过这个目录下的文件来获取进程、内存、CPU以及硬件状态等数据。/var
存放系统中经常变动的文件,如系统日志、缓存、邮件和打印队列等。由于这些文件会不断增多,管理员需要定期对其进行维护和清理。/tmp
用于存储临时文件,无论是程序运行时产生的临时文件,还是用户操作生成的临时数据,都会存放在这里,该目录下的文件通常有效期限较短。/usr
用于存放通用文件和用户应用程序的区域,其中包含了众多应用程序、库文件及文档等。/home
存放所有普通用户个人资料的根目录,每个用户都有一个以其用户名命名的专属子目录,这里保存了他们的个人文件、设置和文档。用户可以独立管理自己的主目录内容,而系统管理员则有权限访问和管理所有用户的主目录。
3.什么是内存泄漏?内存泄漏对系统有什么影响?在编程时如何避免内存泄漏。
**答:**内存泄漏是指程序在动态分配内存后未正确释放不再使用的内存,导致这部分内存被永久占用,无法被系统回收利用;
其对系统的影响包括逐渐耗尽可用内存、引发程序或系统性能下降(如卡顿、响应变慢),甚至导致系统崩溃(尤其在长期运行的进程或内存资源受限的环境中);
编程时避免内存泄漏的方法包括:及时释放不再使用的内存、采用自动内存管理的语言(如Java/Python的垃圾回收机制)、利用工具检测泄漏,并养成良好编程习惯避免循环中重复分配未释放的内存。
4.系统管理员每天需完成以下的重复工作,请按照下列要求,用crontab命令编制完成这些工作:
(1)每小时(整点)在屏幕上显示当前时间;
bash
0 * * * * echo "当前时间: $(date)"
(2)每天早上6:00定时打开网络设备(eth0);
bash
0 6 * * * ifconfig eth0 up
(3)每天晚上23:00定时关闭网络设备(eth0);
bash
0 23 * * * ifconfig eth0 down
(4)周一至周五每2小时进行一次备份 pub 文件数据到 data 文件中;
bash
0 */2 * * 1-5 cp /opt/pub /opt/data
(5)每周五下午18:00 删除临时文件(/temp 目录中的文件)。
bash
0 18 * * 5 rm -rf /temp/*
三、综合编程题(共 30分,每小题15分)
1.编写shell脚本,能够循环录入学生的百分制成绩,将其转换为对应的成绩等级显示。
优:90-100 良:80-89 中:70-79 及格:60-69 不及格0-59
录入完毕时按q或Q键,显示已经录入的各个等级成绩的人数,然后退出程序。
解:
shell
#!/bin/bash
# 初始化计数器
excellent=0
good=0
medium=0
pass=0
fail=0
# 循环录入成绩
#使用read命令提示用户输入成绩,并将输入存储在变量score中
while true; do
read -p "请输入学生的百分制成绩(输入q或Q退出): " score
# 检查是否退出
if [[ "$score" =~ ^[qQ]$ ]]; then
break
fi
# 检查输入是否为数字
if ! [[ "$score" =~ ^[0-9]+$ ]]; then
echo "输入无效,请输入一个整数或q/Q退出。"
continue
fi
# 判断成绩等级
if (( score >= 90 && score <= 100 )); then
((excellent++))
elif (( score >= 80 && score <= 89 )); then
((good++))
elif (( score >= 70 && score <= 79 )); then
((medium++))
elif (( score >= 60 && score <= 69 )); then
((pass++))
elif (( score >= 0 && score <= 59 )); then
((fail++))
else
echo "输入的成绩无效,请输入0-100之间的整数。"
fi
done
# 显示各个等级成绩的人数
echo "成绩等级统计:"
echo "优: $excellent"
echo "良: $good"
echo "中: $medium"
echo "及格: $pass"
echo "不及格: $fail"
注意:
if [[ "$score" =~ ^[qQ]$ ]]; then break fi
if ! [[ "$score" =~ ^[0-9]+$ ]]; then echo "输入无效,请输入一个整数或q/Q退出。" continue fi
[[]]
:是 Bash 中用于条件判断的语法结构,称为条件表达式,是 [ ]
(test 命令)的增强版,支持更多的操作符和功能,比如正则表达式匹配、字符串比较、数字比较。
=~
是 Bash 中用于正则表达式匹配的操作符。用于检查字符串是否与给定的正则表达式模式匹配。[[ "$score" =~ ^[qQ]$ ]]
用于检查变量 $score
的值是否与正则表达式 ^[qQ]$
匹配。
"$score"
是一个变量引用,其中 $score
是变量名,引号 ""
用于防止变量值中的空格或特殊字符导致的问题。
^
:表示匹配字符串的开始。
[qQ]
:表示匹配字符集合中的任意一个字符。
$
:表示匹配字符串的结束。
+
:表示匹配前面的字符集合一次或多次。
if (( score >= 90 && score <= 100 ));
(( ... ))
是一个算术上下文,用于执行算术运算和条件判断。
在 if
语句中,(( ... ))
用于判断一个算术条件是否为真。如果条件为真,则返回退出状态码 0(表示成功);否则,返回非零状态码。
2.用C语言编写多进程程序,主进程每隔1分钟将系统当前时间和在线人数写入文件record.txt,子进程每隔5分钟读取一次该文件,并将文件内容显示到屏幕上。
解:
shell
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>
#include <fcntl.h>
//获取当前时间并格式化为字符串
void get_current_time(char *time_str) {
time_t now;
time(&now);
struct tm *local = localtime(&now);
strftime(time_str, 20, "%Y-%m-%d %H:%M:%S", local);
}
//获取在线用户数
int get_online_users() {
FILE *fp = popen("who | wc -l", "r");
if (fp == NULL) {
perror("popen");
return -1;
}
int count;
fscanf(fp, "%d", &count);
pclose(fp);
return count;
}
//主进程函数
void parent_process(const char *filename) {
FILE *file;
char time_str[20];
int online_users;
while (1) {
get_current_time(time_str);
online_users = get_online_users();
file = fopen(filename, "a");
if (file == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
fprintf(file, "Time: %s, Online Users: %d\n", time_str, online_users);
fclose(file);
sleep(60);// 每隔1分钟写入一次
}
}
//子进程函数
void child_process(const char *filename) {
FILE *file;
char buffer[256];
while (1) {
file = fopen(filename, "r");
if (file == NULL) {
perror("fopen");
exit(EXIT_FAILURE);
}
printf("Contents of %s:\n", filename);
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
fclose(file);
sleep(300);//每隔5分钟读取一次
}
}
int main() {
pid_t pid;
const char *filename = "record.txt";
pid = fork();
if (pid == -1) {
perror("fork");
exit(EXIT_FAILURE);
}
if (pid == 0) {
// 子进程
child_process(filename);
} else {
// 主进程
parent_process(filename);
}
return 0;
}