linux期末考试题(2)

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 不是 dirls 的有效选项。因此,这个选项在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

解答:

:wvi 编辑器中的命令,用于将当前缓冲区的内容写入(保存)到文件中。如果文件已存在,则覆盖原文件;如果文件不存在,则创建新文件。

:save 不是 vi 的标准命令。vi 中没有直接名为 :save 的命令用于保存文件。

:qvi 编辑器中的命令,用于退出编辑器。但如果文件未保存,直接使用 :q 会导致错误(除非使用 :q! 强制退出)。

:rvi 编辑器中的命令,用于读取文件内容并将其插入到当前光标位置。

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.txtecho 的输出重定向到 file.txt(覆盖原内容),>> 则追加内容。
  • 输入重定向:grep "word" < file.txtfile.txt 读取输入并搜索 "word"

2.请列出Linux操作系统的主要目录,并说明该目录的功能是什么。(注:请至少列出10个要目录)

答:

以下是Linux操作系统中至少10个主要目录及其功能的说明:

  1. /(根目录)
    整个文件系统的起点,所有其他目录和文件都位于根目录下或其子目录中,是Linux文件系统的最高层级。
  2. /bin
    存放系统启动和日常操作所必需的基本命令,如lscpmvcat等,这些命令无需额外权限即可使用。
  3. /sbin
    存放关键的命令,这些指令大多专为root用户设计,比如分区工具、ifconfig(网络配置工具)和shutdown(关机命令)等。
  4. /etc
    存放系统的配置文件,几乎所有的系统服务设置文件都被放置在这个目录中,涵盖了从用户账户设置(如/etc/passwd)到网络设置(如/etc/network),以及系统启动相关设置(如/etc/hostname)等多个方面。
  5. /dev
    存放设备文件,这些文件并非用于存储数据,而是充当操作系统与各类硬件设备沟通的桥梁,通过这些设备文件来实现对硬件如硬盘、键盘、鼠标、光驱等的识别与操作。
  6. /proc
    一个虚拟文件系统,实时反映了系统运行时的状态信息,用户可以通过这个目录下的文件来获取进程、内存、CPU以及硬件状态等数据。
  7. /var
    存放系统中经常变动的文件,如系统日志、缓存、邮件和打印队列等。由于这些文件会不断增多,管理员需要定期对其进行维护和清理。
  8. /tmp
    用于存储临时文件,无论是程序运行时产生的临时文件,还是用户操作生成的临时数据,都会存放在这里,该目录下的文件通常有效期限较短。
  9. /usr
    用于存放通用文件和用户应用程序的区域,其中包含了众多应用程序、库文件及文档等。
  10. /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;
}