linux期末考试题(3)
2025-08-22 16:06:14,

Linux期末考试题

一、选择题(共20分,每小题2分)

1.为了达到使文件的属主和同组用户有读(r)、写(w)和执行(x)的权限,而其他用户只能进行只读访问,在设置文件的许可值时,应当设置为(B)。

A.747 B.744 C.775 D.744

解答:

读:4 写:2 执行:1

属主权限:4+2+1=7

同组权限:4+2+1=7

其他用户权限:4

2.在Linux系统中,要让某个进程在3天后下午2:10执行,可以用哪个命令?(B

A.cron 2:10pm +3day B.at 2:10pm +3day C.tar 2:10pm +3day D.run 2:10pm +3day

解答:

at 命令用于在指定时间执行一次性任务。

cron 是用于定时任务的守护进程,但它是用来配置周期性任务(如每天、每周执行),而不是一次性任务。

tar 是用于归档文件的工具,与任务调度无关。

run 不是标准的Linux命令,通常用于特定环境(如某些开发工具),不适用于此场景。

3.下面哪个命令可以分页显示内容(C

A.pause B.cat C.more D.grep

解答:

pause 不是Linux中用于分页显示内容的命令。实际上,在标准的Linux命令集中,并没有一个名为 pause 的命令用于此目的。它可能出现在其他上下文(如某些脚本语言或特定环境)中。

cat 命令用于将文件内容输出到标准输出(通常是终端)。它不会分页显示内容,而是直接连续显示整个文件。如果文件很大,内容会快速滚动通过终端,难以阅读。

more 命令用于分页显示文件内容。它会一次显示一页内容,并等待用户输入(如空格键翻页或回车键逐行查看)来继续显示下一页。

grep 命令用于在文件中搜索匹配特定模式的行,并将这些行输出到标准输出。它不用于分页显示文件内容,而是用于文本搜索和过滤。

4.linux操作系统结构由什么组成(ABCD

A.linux内核 B.Linux Shell C.linux文件系统 D.linux应用程序

解答:

内核是操作系统的核心部分,负责管理系统的硬件资源(如CPU、内存、磁盘I/O等),并提供给上层应用程序一个统一的接口。Linux内核是开源的,并且具有高度的可定制性和灵活性。它是Linux操作系统的基础,负责处理系统的基本功能,如进程管理、内存管理、文件系统管理、设备驱动等。

Shell是用户与操作系统之间的接口,它接收用户输入的命令,并解释执行这些命令。Shell还提供了脚本编程的能力,允许用户编写自动化任务。常见的Shell有Bash、Zsh、Ksh等。Shell是用户与Linux内核交互的桥梁,使得用户可以通过文本命令来控制系统。

文件系统负责组织和管理存储在磁盘上的文件和目录。Linux支持多种文件系统,如ext4、XFS、Btrfs等。文件系统提供了数据的存储、检索、修改和删除等功能。它是Linux操作系统中数据组织和管理的基础,确保了数据的持久性和可访问性。

应用程序是运行在Linux操作系统上的软件程序,它们提供了各种功能和服务,如文本编辑、图形处理、网络通信、数据库管理等。Linux操作系统上有大量的开源应用程序可供选择,用户可以根据自己的需求安装和使用这些应用程序。应用程序是Linux操作系统功能扩展和用户需求满足的重要部分。

5.下面哪几个符号是linux的通配符(CD

A.# B.@ C.? D.*

解答:

在Linux中,通配符用于在命令行中匹配文件名或路径名,从而简化命令的输入和操作。

# 符号在Linux中通常用作注释的开始符号,在Shell脚本或命令行中,# 后面的内容会被视为注释,不会被执行。

@ 符号在Linux中并没有特定的通配符功能。它可能在某些特定的上下文或应用程序中有特殊含义,但在标准的Linux命令行通配符中,@ 并不被用作通配符。

? 是Linux中的一个通配符,用于匹配单个字符。例如,file?.txt 可以匹配 file1.txtfile2.txt 等,但不会匹配 file12.txt(因为 ? 只能匹配一个字符)。

* 是Linux中最常用的通配符之一,用于匹配任意数量的字符(包括零个字符)。例如,*.txt 可以匹配当前目录下所有以 .txt 结尾的文件。

6.想要把当前目录下的file1.txt复制为file2.txt,正确的命令是(B

A.copy file1.txt file2.txt B.cp file1.txt file2.txt C.cat file1.txt file2.txt D.cat file1.txt>file2.txt

解答:

copy 是 Windows 系统中的命令,不是 Linux/Unix 系统的命令。

cat 命令用于连接文件并打印到标准输出设备上。如果直接写 cat file1.txt file2.txt,会将两个文件的内容连续显示在终端,而不会创建或复制文件。

cat file1.txt > file2.txt 会将 file1.txt 的内容重定向到 file2.txt(覆盖 file2.txt 的原有内容)。虽然效果上类似于复制,但这不是标准的复制命令,且如果 file2.txt 已存在,会直接覆盖而不提示。

7.更改一个文件权限的命令是(C

A.change B.attrib C.chmod D.at

解答:

change 不是 Linux/Unix 系统中用于更改文件权限的标准命令。

attrib 是 Windows 系统中用于查看或更改文件属性的命令,不是 Linux/Unix 系统的命令。

chmod(change mode)是 Linux/Unix 系统中用于更改文件或目录权限的标准命令。可以通过数字模式(如 chmod 755 file.txt)或符号模式(如 chmod u+x file.txt)来设置权限。

at 是 Linux/Unix 系统中用于在指定时间运行任务的命令,与文件权限无关。

8.以下哪种不是linux的shell类型(C

A.bash B.ksh C.rsh D.csh

解答:

bashBourne Again SHell 的缩写,是Linux系统中广泛使用的默认shell,属于标准的shell类型。

kshKorn Shell 的缩写,是一种兼容Bourne Shell的高级交互式shell,属于shell类型。

rshRemote Shell 的缩写,主要用于远程命令执行,是一种网络协议或工具,而不是本地用户交互的shell类型。

cshC Shell 的缩写,是一种语法类似C语言的shell,常用于BSD系统,属于shell类型。

9.linux系统目录中/boot存放的内容是(A

A.存放系统的内核文件和引导装载程序文件 B.存放所有主要的库文件

C.应用程序存放目录 D.存放系统的大部分配置文件和子目录

解答:

/boot 目录是 Linux 系统中专门用于存放与系统启动相关的文件的目录。

主要的库文件通常存放在 /lib(系统核心库)或 /usr/lib(应用程序库)中。

应用程序通常存放在 /usr/bin(二进制可执行文件)、/usr/sbin(系统管理命令)或 /usr/local(用户自行安装的软件)中。

系统的大部分配置文件通常存放在 /etc 目录中。

10.文件的 inode 数据结构包含以下哪些内容(BCD)。

A、文件名称 B、文件的访问权限 C、文件的链接数 D、文件数据 block 的位置

解答:

inode(索引节点)是Linux文件系统中用于存储文件元数据的数据结构。

inode中包含的信息通常包括:

  • 文件的类型(如普通文件、目录、符号链接等)。
  • 文件的访问权限(如读、写、执行权限)。
  • 文件的硬链接数(即指向该inode的目录项数量)。
  • 文件所有者的用户ID和组ID。
  • 文件的大小(以字节为单位)。
  • 文件数据块的指针(即文件数据在磁盘上的存储位置)。
  • 文件的创建时间、修改时间、访问时间等时间戳。

inode中不包含的信息是文件名。文件名存储在目录项中,目录项将文件名映射到对应的inode号。

二、简答题(共50分,第6小题10分,其余小题8分)

1.什么是shell?shell主要起什么作用?

答:Shell 是用户与 Linux 操作系统交互的命令行解释器,主要作用是接收用户输入的命令并解析执行,同时提供脚本编程能力以自动化任务。它是操作系统内核与用户之间的桥梁,允许用户通过文本命令直接操作系统资源(如文件、进程等),并支持将复杂操作封装为脚本,实现高效的任务自动化。

2.什么是符号链接?什么是硬链接?符号链接与硬链接的区别是什么?

答:符号链接是独立文件,存储目标文件的路径(类似快捷方式),可跨文件系统或链接目录,若目标删除则链接失效;

硬链接是文件系统的另一个名称,直接指向原始文件的inode(数据块索引),与原始文件无本质区别,不可跨文件系统且不能链接目录,删除硬链接或原始文件不影响另一方,仅当所有硬链接被删除时文件数据才会释放;

区别:本质不同,符号链接是独立的“路径指针文件”,硬链接是原始文件的另一个“别名”(共享inode)。符号链接可跨分区/设备,硬链接不行。符号链接可链接目录或不存在的文件,硬链接只能链接文件(且不能是目录)。删除符号链接不影响原始文件,删除硬链接或原始文件中的任意一个,另一个仍可正常访问(直到所有硬链接被删除)。符号链接是“指向路径的指针”,硬链接是“原始文件的分身”。

3.执行命令ls -l时,显示结果如下:

-rwxrw-r-- 1 momo momo 2021 jul 28 18:58 test.c

(1)用户momo对该文件有什么权限?

答:用户momo对该文件有读、写、执行的权限。

(2)用户jojo和root都不是momo组的成员,他们对该文件具有什么访问权限?

答:用户jojo对该文件只有读权限,root作为超级用户,对该文件有读、写、执行权限,不受文件权限限制。

(3)如何使任何用户都可以读、写、执行该文件?请写出两种修改方式。

答:chmod a=rwx test.c chmod 777 test.c

(4)如何把该文件属主和属组改为用户tom?

答:sudo chown tom:tom test.c ​​

4.某系统管理员每天需完成以下的重复工作,请按照(2)-(5)的要求编制一个任务调度。

(1)说出at作业和cron作业的基本区别,并说明完成本计划需编写哪种作业?

答:at作业:用于执行一次性任务,即在指定的绝对时间或相对时间运行一次。

​ cron作业:用于执行周期性任务,即按照设定的时间间隔或固定时间点重复执行。

​ 由于系统管理员需要每天、每周定期执行任务,因此需要使用cron作业。

(2)每天早上9点将当前登录用户保存到useronline 文件中;

答:

0 9 * * * who >> /opt/usronline 

(3)每周日凌晨零点零分定期备份/user/backup到/tmp目录;

答:

0 0 * * 7 cp /usr/backup /tmp

(4)每周五下午5:30删除临时文件(/temp目录中的所有文件)。

答:

30 17 * * 5 rm -rf /temp/*

(5)每星期日23:50将/data目录下的所有目录和文件压缩为backup.tar.gz 文件并归档。

答:

50 23 * * 7 tar -czvf /data/backup.tar.gz /data

5.现有一个 windows下使用过的U盘(U盘使用/dev/sdb1接口),要求在在此U盘上新建myfiles 目录,并在此目录下新建一文件soft,内容任意,再将该文件复制到/root 目录下,最后安全取出U盘,要求写出相关的命令行。

答:

# 查看 U 盘设备名称
lsblk

# 挂载 U 盘
mkdir -p /mnt/usb
mount /dev/sdb1 /mnt/usb

# 创建目录和文件
mkdir /mnt/usb/myfiles
echo "aaa" > /mnt/usb/myfiles/soft

# 复制文件到 /root
cp /mnt/usb/myfiles/soft /root/

# 安全卸载 U 盘
umount /mnt/usb

6.读下列程序my.sh的功能,以及读入命令行参数后的执行结果。

#!/bin/bash								#计算所有命令行参数的和
#! filename: my. sh

sum=0									#初始化一个变量 sum,用于存储累加的结果
for INT in $*							#for 循环,遍历所有的命令行参数,$* 表示所有的命令行参数
do
sum=`expr $sum + $INT`					#expr命令算术运算,将sum值与参数INT相加再赋值给sum
done
echo $sum								#输出累加的结果

运行#bash my.sh 1 2 3 4 5

解:当运行 bash my.sh 1 2 3 4 5 时,脚本会计算 1、2、3、4、5 的和,并输出结果。

考点:

expr 的基本用法

#算术运算:
加法:expr $a + $b
减法:expr $a - $b
乘法:expr $a \* $b(注意:乘法运算符 * 需要转义,因为 * 在 Shell 中有特殊含义)
除法:expr $a / $b
取模:expr $a % $b

#比较运算:
相等:expr $a = $b
不等:expr $a != $b
大于:expr $a \> $b(注意:> 需要转义,因为 > 在 Shell 中有特殊含义)
小于:expr $a \< $b(注意:< 需要转义,因为 < 在 Shell 中有特殊含义)

#字符串操作:
字符串长度:expr length "$string"
字符串匹配:expr "$string" : "pattern"

#注意事项
空格:expr 的运算符和操作数之间必须有空格。例如,expr 1 + 2 是正确的,而 expr 1+2 是错误的。
转义字符:某些运算符如 * 和 > 在 Shell 中有特殊含义,因此在使用 expr 时需要转义它们。
返回值:expr 命令在成功时返回 0,失败时返回非零值。因此,可以通过检查退出状态来判断运算是否成功。

三、综合编程题(共30分,每小题10分)

1.shell编程,判断一个文件是不是块或字符设备文件,如果是则将其复制到/dev目录下。

解:

#!/bin/bash

# 指定要检查的文件路径
read -p "请输入要判断的文件名:" file_path

# 检查文件是否是块设备文件
if [ -b "$file_path" ]; then
    echo "$file_path 是一个块设备文件。"
    # 复制到 /dev 目录
    cp "$file_path" /dev/
    echo "已复制到 /dev 目录。"
elif [ -c "$file_path" ]; then
    echo "$file_path 是一个字符设备文件。"
    # 复制到 /dev 目录
    cp "$file_path" /dev/
    echo "已复制到 /dev 目录。"
else
    echo "$file_path 不是一个块设备文件或字符设备文件。"
fi

2.用c语言编程,打开用户指定文件,将文件内容倒序后再写入该文件。

解:

代码一:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void reverse_file_content(const char *filename) {
    FILE *file = fopen(filename, "r+");					//以读写模式打开文件
    if (file == NULL) {
        perror("Failed to open file");
        exit(EXIT_FAILURE);
    }

    // 移动到文件末尾以获取文件大小
    fseek(file, 0, SEEK_END);							//获取文件的大小
    long file_size = ftell(file);						//获取文件的大小
    fseek(file, 0, SEEK_SET);

    // 分配内存以存储文件内容
    char *buffer = (char *)malloc(file_size + 1);
    if (buffer == NULL) {
        perror("Failed to allocate memory");
        fclose(file);
        exit(EXIT_FAILURE);
    }

    // 读取文件内容,将文件内容读取到一个缓冲区中
    if (fread(buffer, 1, file_size, file) != file_size) {
        perror("Failed to read file");
        free(buffer);
        fclose(file);
        exit(EXIT_FAILURE);
    }
    buffer[file_size] = '\0'; // 确保字符串以空字符结尾

    // 倒序文件内容
    for (long i = 0; i < file_size / 2; i++) {
        char temp = buffer[i];
        buffer[i] = buffer[file_size - 1 - i];
        buffer[file_size - 1 - i] = temp;
    }

    // 将文件指针移动到文件开头
    fseek(file, 0, SEEK_SET);

    // 写入倒序后的内容
    if (fwrite(buffer, 1, file_size, file) != file_size) {
        perror("Failed to write to file");
        free(buffer);
        fclose(file);
        exit(EXIT_FAILURE);
    }

    // 截断文件以移除可能的多余字符,确保文件大小与实际写入内容的大小一致
    ftruncate(fileno(file), file_size);

    // 关闭文件和释放内存
    free(buffer);
    fclose(file);
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
        return EXIT_FAILURE;
    }

    reverse_file_content(argv[1]);

    return EXIT_SUCCESS;
}

代码二:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct st {
    char c[1024];
    struct st* up;
    struct st* down;
} *head = NULL, *tp = NULL, *next = NULL;

int main() {
    FILE* file_in, *file_out;
    char buffer[1024];

    file_in = fopen("fileIn", "r");
    if (file_in == NULL) {
        perror("Failed to open input file");
        return EXIT_FAILURE;
    }

    file_out = fopen("fileOut", "w");
    if (file_out == NULL) {
        perror("Failed to open output file");
        fclose(file_in);
        return EXIT_FAILURE;
    }

    // 读取文件并构建链表
    while (fgets(buffer, sizeof(buffer), file_in) != NULL) {
        next = (struct st*)malloc(sizeof(struct st));
        if (next == NULL) {
            perror("Failed to allocate memory");
            fclose(file_in);
            fclose(file_out);
            return EXIT_FAILURE;
        }
        strncpy(next->c, buffer, sizeof(next->c) - 1);
        next->c[sizeof(next->c) - 1] = '\0';
        next->down = NULL;

        if (head == NULL) {
            head = next;
            tp = next;
        } else {
            tp->down = next;
            next->up = tp;
            tp = next;
        }
    }

    // 倒序写入文件
    while (tp != NULL) {
        fputs(tp->c, file_out);
        tp = tp->up;
    }

    // 关闭文件指针
    fclose(file_in);
    fclose(file_out);

    // 释放链表内存
    tp = head;
    while (tp != NULL) {
        next = tp->down;
        free(tp);
        tp = next;
    }

    return EXIT_SUCCESS;
}

3.编写程序,实现多进程编程,主进程每隔3秒获取当前系统时间写入某文件,子进程每隔2秒访问该文件,读取该文件的内容显示在屏幕上。

解:

0 0 * * 7 cp /usr/backup /tmp
0

使用gcc编译程序:gcc time_process.c -o time_process