【saveMyLinux】Linux考前的复习ing

写在前面

考点整理(混杂版)

  • shell是干什么的
  • 背概念:内核、shell、文件系统
  • linux人机图形交互ppt 让画两个图
    • 进程描述图:父进程、兄进程、弟进程
    • 画进程间的族亲关系 ppt47页
    • ppt倒数第三页 要求写程序功能
  • 进程管理部分 fork wait exit(?) 克隆进程 创建新进程 代码部分画一行要求写这行的作用
  • 中断部分 考了 ppt倒数三页的倒二和倒三(? 上半部和下半部 时间片轮转
  • ppt57页 io消耗性
  • 最后三个编程题考的实验手册
  • ppt45页 pid部分 划代码考作用重点看 pid_d(?) pid_t
  • shell编程的执行过程?) 要背
    • 简答 / 画图会考 预处理→编译→汇编→链接
  • 人机交互图形界面 考了 ppt28页 问了windows和linux图形界面的区别 让画出来

考卷样子

  • 一共四页
  • 第一面判断题和名词解释、填空题
  • 填空题有考了linux命令 目录什么的(?
  • 名词解释有:内核、shell、文件系统、时间片轮转
  • 应用题有画图
  • 简答题:进程克隆、父进程和子进程 pid
  • 编程三题是实验手册上的
    • 前两道有一个是shell 比较简单,还有一道是file脚本(?实验手册页码第三页 有点像switch语句功能 前两道都比较简单
  • 判断题8道、填空题8道、名词解释4道、简答题4道、应用题(加注释、写结果、解释函数含义、画流程图)2道、编程题3道(2easy1hard)

知识点的整理开始了喵

可能考的概念

  • 内核: 内核是操作系统的核心,具有很多最基本的功能,如虚拟内存、多任务、共享库、需求加载、可执行程序和TCP/IP网络功能。
    • 还有一个**Linux内核**的概念:操作系统的灵魂,负责管理磁盘上的文件、内存等,负责启动并运行程序,负责从网络上接收和发送数据包等等。
    • 不知道考试写哪个所以都背吧(逃
  • Shell: Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
  • 文件系统:文件系统是文件存放在磁盘等存储设备上的组织方法。
  • 时间片轮转
  • 操作系统:用于管理和控制计算机所有软、硬件资源的一组程序

可能考的填空

  • Linux目录结构

    • /bin: 存放Linux常用操作命令的执行文件
    • /boot: 存放操作系统启动时所要用到的程序
    • /dev:包含了所有Linux系统中使用的外部设备(存放的实际上时一个访问这些外部设备的端口)
    • /etc:存放了系统管理时要用到的各种配置文件和子目录
      • /etc/rc.d: 主要存放Linux启动和关闭时要用到的脚本
      • /etc/rc.d/init: 存放所有Linux服务默认的启动脚本
    • /home: Linux系统中默认的用户工具根目录。执行adduser命令后系统会在 /home 目录下为对应账号建立一个同名主目录
    • /lib: 用来存放系统动态链接共享库
    • /lost+found: 大多时候为空目录。只有系统异常时会将一些遗失片段放在此目录下
    • /media: 光驱和软驱的挂载点
    • /misc: 存放从DOS下进行安装的实用工具,一般为空
    • /mnt: 软驱、光驱、硬盘的挂载点,也可以临时挂载别的文件系统
    • /proc: 用于放置系统核心与执行程序所需的一些信息
    • /root: 超级用户登录时的主目录
    • /sbin: 存放系统管理员的常用的系统管理程序
    • /tmp: 存放不同程序执行时产生的临时文件。是Linux安装软件的默认安装路径
    • /usr: 存放用户的应用程序和文件(类似Windows下的Program Files的目录)
    • /usr/bin: 系统用户使用的应用程序
    • /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序
    • /usr/src: 内核源代码默认的放置目录
    • /srv: 存放一些服务启动之后需要提取的数据
    • /sys: 该目录下安装的2.6内核中新出现的一个文件系统sysfs
    • /var: 存放很多服务的日志信息
  • Linux基本命令与使用——文件管理与传输

    • ls: 列出目录内容,包括文件和子目录的名称
    • cd: 改变工作目录
    • pwd: 显示当前工作目录的绝对路径
    • mkdir: 创建一个目录
    • rmdir: 删除空的目录
      • -p 当子目录被删除后使它也成为空目录的话,则一并删除该父目录(?是酱紫吧
    • rm: 删除文件或目录
      • -f: 强制删除文件或目录
      • -i: 删除既有文件或目录之前先询问用户
      • -r: 删除目录,如果目录不为空,则递归处理将该目录下的所有文件及子目录一并处理
      • -v: 显示指令执行过程
    • cp: 复制文件或目录
    • mv: 移动或更名现有的文件或目录
      • mv [参数] 源文件或目录 目标文件或目录
    • find: 查找文件
      • 这个命令没咋用过= =
      • -print: 将匹配的文件输出到标准输出
      • -exec: 对匹配得到文件执行该参数所给出的shell命令
      • -ok: 和-exec作用相同,加了执行前确认
    • ln: 链接目录或文件
      • ln [参数] 源文件 目标链接
      • -b: 删除,覆盖目标文件之前的备份
      • -d: 建立硬链接
      • -s: 建立符号链接(软链接)
      • -f: 强行建立文件或目录的链接,不论文件或目录是否存在
      • -i: 覆盖既有文件之前先询问用户
      • -n: 把符号链接的目的目录视为一般文件
    • cat: 连接并显示指定的一个和多个文件的有关信息
      • cat [选项] 文件1 文件2 …
      • -n: 由第一行开始对所有输出的行号编号
    • chmod: 改变文件的访问权限
      • chmod [选项] [权限] 文件
      • -c: 该文件权限确定已经更改,才显示其更改动作
      • -f: 该文件权限无法被更改也不要显示错误信息
      • -v: 显示权限变更的详细资料
      • 这个命令没看懂实例= =
  • Linux基本命令与使用——磁盘管理与维护

    • fdisk: 磁盘分区表操作工具

      • fdisk [参数]
      • 好吧这个命令就没搞懂= =
    • mount:挂载文件系统

      • mount [-参数] [设备名称] [挂载点]
      • ……看不懂= =!
      • 后面还有一个嵌入式开发中挂载进行在线调试的例子(考完有空再了解吧!
  • Linux基本命令与使用——系统管理与设置

    • shutdown:系统关机指令
      • shutdown [参数] [-t秒数] 时间 [警告信息]
    • ps: 查看进程
    • kill: 结束进程
      • kill -l [信号] / kill [-信号] 进程号
  • Linux基本命令与使用——网络相关

    • ifconfig: 查看或设置网络设备
      • ifconfig [网络设备]
      • ifconfig 网络设备 [IP地址] [netmask<子网掩码>]
    • ping: 检测主机
      • ping [参数] [主机名称或IP地址]
    • netstat: 显示网络链接、路由表和网络接口信息
      • netstat [参数]
  • Linux基本命令与使用——备份压缩

    • tar: 对文件和目录进行打包或解压
      • tar [参数] [打包后文件名] 文件目录列表
    • gzip: 压缩或解压缩文件
      • gzip [参数] 压缩(解压缩)的文件名
  • 命令结果重定向

    • 	stdout	标准输出
        	stderr	标准错误
      
      1
      2
      3

      - 输出重定向到文件file,终端上只能看到标准错误

      命令 >file
      1
      2
      3

      - 错误重定向到文件file,终端上只能看到标准输出

      命令 2>file
      1
      2
      3

      - 标准输出和标准错误都重定向到file,终端上看不到任何信息

      命令 >file 2>&1
      1

      # 相当于 命令 1>file 2>&1
      1
      2
      3

      - 屏蔽命令任何输出

      >/dev/null 2>&1
      1
      2
      3

      - ```
      cp /etc/my.conf >/dev/null 2>&1
      - ``` /dev/null # 空设备
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101

      - 此句命令的结果是:

      - cp命令没有目标文件,应该输出错误
      - `2>&1`表示错误重定向指向标准输出
      - `>/dev/null`又使标准输出重定向到空,就是不要输出信息

      - 即:一个错误的命令执行,什么功能都不实现,且没有任何信息或错误提示输出





















      ## 可能考的简答

      - **<u>操作系统的主要功能</u>**:
      - 处理机管理
      - 存储管理
      - 设备管理
      - 信息(文件)管理

      - **<u>Linux的特点总结</u>**:
      - 开放性
      - 多用户
      - 多任务
      - 良好的用户界面
      - 设备独立性
      - 丰富的网络功能
      - 可靠的系统安全
      - 良好的可移植性

      - **<u>Linux的结构</u>**:

      - 内核
      - Shell
      - 文件系统
      - 应用程序

      - **<u>VI的三种工作模式</u>**

      - 命令模式
      - 页面不能编辑,只能接受命令
      - 输入模式
      - a→附加命令
      - c→修改命令
      - i→插入命令
      - o→另起新行
      - r→替换命令 s→替换命令进入该模式
      - esc返回命令模式
      - 行编辑模式
      - 在命令模式下输入冒号进入一个命令行,可显式地输入命令
      - 三种模式间的切换关系

      | | 按ESC键 | | 按“:”键 | |
      | ------------ | --------------------- | -------- | ------------------- | ---------- |
      | | ————————→ | | —————→ | |
      | 文本输入状态 | | 命令状态 | | 行编辑状态 |
      | | ←——————— | | ←—————— | |
      | | 按A,I,S,C,O等命令 | | 执行非退出命令,如w | |

      - vi / vim 的更多操作没试过……平时都是i起手:wq结束……(跪

      - **<u>GCC的执行过程</u>**

      - 使用gcc由C语言源代码文件生成可执行文件的过程:
      - **<u>预处理→编译→汇编→连接</u>**

      | 预处理 | cpp执行,分析包含文件、预编译语句等 |
      | ------ | ----------------------------------- |
      | ↓ | |
      | 编译 | ccl执行,生成目标文件 |
      | ↓ | |
      | 汇编 | as执行,针对汇编语言 |
      | ↓ | |
      | 连接 | ld执行,安排所有目标文件 |

      - 设置输出的文件

      - 默认情况下gcc编译出的程序为当前目录下的文件`a.out`

      - `-o`参数可以设置输出的目标文件

      - ```
      gcc HelloWorld.c -o HelloWorld
      # 将代码编译成可执行程序HelloWorld
      - ``` gcc HelloWorld.c -o /tmp/HelloWorld # 将目录文件设置成/tmp目录下的文件HelloWorld
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40

      - 几个常用的后缀名及其对应的功能

      | 后缀名 | 对应功能 |
      | ------- | -------------------------------------------- |
      | -c | 只编译不链接,生成目标文件" .o" gcc -c |
      | -S | 只编译不汇编,生成汇编代码" .s" gcc -S |
      | -o file | 把输出文件输出到file里 as a.s -o a.o |
      | -g | 在执行程序中包含标准调试信息 |
      | -E | 只进行预编译,不做其他处理 ".i " gcc -E -o |



      - **<u>链接库</u>**

      - 静态链接库

      - 最简单的函数库形式
      - 以`.a`结尾
      - 链接静态库的可执行文件中包含了库中所链接函数对应的二进制执行代码

      - 动态函数库

      - 静态函数库的缺点:同时运行多个使用同一函数库中的函数的程序,必须为每个程序复制一份一样的函数,会占用大量内存和磁盘空间
      - 动态函数库克服了这一缺点

      - Linux下:使用`ldd`查询某个程序使用了哪些动态库

      - Windows系统中:都是`dll`库

      - 编译为**静态**链接库:

      - ```
      gcc -c add.c -o add.o
      gcc -c sub.c -o sub.o
      ar -crv libmylib.a add.o sub.o
      # ar的三个参数:
      # r:将文件插入归档文件中
      # c:建立归档文件
      # v:显示信息
    • # 使用系统默认库路径:
      cp libmylib.a /lib/   # 将库文件 libmylib.a 复制到了系统的 /lib/ 目录下
      
      gcc -o main main.c -static -lmylib  # 编译 main.c 文件,并链接名为 mylib 的静态库
      
      # lib和.a都是系统指定的静态库文件的固定格式,mylib→静态库的名称
      # 编译时,链接器会在标准路径(/usr/lib; /lib)或者用户指定的路径下去找.a的文件
      
      gcc -o main main.c -static -L. -lmylib  # -L.选项:告诉链接器在当前目录 (.) 下寻找库文件
      # 如果 libmylib.a 存在于当前工作目录中,那么链接器就会使用它。如果没有这个选项,链接器将按照默认的搜索路径去寻找库文件
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

      - 编译为动态链接库:

      - ```
      gcc -c *.c // 支持通配符 // 使用 gcc 编译器编译所有 .c 扩展名的源文件,并产生对应的 .o 对象文件
      // -c 选项告诉 gcc 只进行编译阶段的操作,而不进行链接阶段的操作
      // 预编译多个源文件

      gcc -shared -fpic -o libmym.so *.o // 生成一个动态库 // 将之前生成的所有 .o 文件链接成一个共享库(动态链接库),命名为 libmym.so

      libmym.so; (与位置无关代码)
      gcc main.c -lmym -L. // 链接动态库libmym.so编译main.c的程序

可能考的应用题

  • Linux人机交互——图形界面

  • 一个带变量的Makefile的例子

    • OBJS = prog.o code.o
      CC = gcc
      	test: ${ OBJS }
      		${ CC } -o test ${ OBJS }
      	prog.o: prog.c prog.h code.h
      		${ CC } -c prog.c -o prog.o
      	code.o: code.c code.h
      		${ CC } -c code.c -o code.o
      	clean:
      		rm -f *.o
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25

      - ```
      OBJS: 包含了一个列表,列出所有需要编译的对象文件,这里是 prog.o 和 code.o
      CC: 指定了编译器,这里使用的是 gcc


      test: 这个 Makefile 的默认目标
      ${OBJS}: 包含了所有需要的对象文件
      -${CC} -o test ${OBJS}: 使用指定的编译器 (gcc) 将所有对象文件链接成一个可执行文件,输出文件名为 test


      prog.o: 从源文件 prog.c 构建对象文件 prog.o
      prog.c: 源文件
      prog.h, code.h: prog.c 的依赖项,如果有任何这些文件改变,则 prog.o 需要重新编译
      -${CC} -c prog.c -o prog.o: 使用 gcc 编译 prog.c 成 prog.o


      code.o: 从源文件 code.c 构建对象文件 code.o
      code.c: 源文件
      code.h: code.c 的依赖项,如果这个头文件有改变,则 code.o 需要重新编译
      -${CC} -c code.c -o code.o: 使用 gcc 编译 code.c 成 code.o


      clean: 定义了清理规则,用来删除所有 .o 文件
      rm -f *.o: 删除所有 .o 文件
    • 使用:在同一个目录下已经放置了Makefile prog.c code.c prog.h code.h 运行sudo make 要删除所有的.o文件:sudo make clean

可能考的编程题

Linux下Shell脚本编程实验

  • 实验任务:
    • (1)编写shell脚本程序获取环境变量并输出
    • (2)编写包含控制语句的shell脚本程序
  • 实验原理:
    • (1)简单的shell脚本程序类似批处理程序,只执行一些命令
    • 以下greet程序,显示当前登陆用户名,并显示当前时间
1
2
3
4
5
6
7
#!/bin/bash
# this script is used to greet loguser
# and print the hostname
# say goodbye to user and print time when script exit
echo hello $USER: $HOSTNAME
echo "goodbye, $USER"
date
  • (2)Shell脚本可以有条件、循环等控制语句,以设计较复杂逻辑功能的脚本程序
  • 以下check程序,判断指定的用户名是否在系统的passwd文件中的shell脚本。
    • 首先判断用户是否指定了一个要查找的用户名参数
    • 然后循环在"/etc/passwd"文件中查找
    • 最后提示是否找到
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
NAME=$1

if ["$NAME" = ""]
then
echo "usage: prog name"
exit
fi

for user in $(cut -d : -f 1 /etc/passwd)
do
#it must be separate by space
if [ "$user" = "$NAME" ]
then
echo found $NAME in /etc/passwd
break
fi
done

if [ "$user" != "$NAME" ]
then
echo user $NAME is not in system
fi
  • (3)Shell脚本程序还能和用户进行交互
  • 以下five程序:实现对用户输入的百分制的分数进行五分制,即非常优秀、优秀、优良、中等、不及格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
declare -i score # 声明一个整数变量score
echo "please input score"
read score # 读取用户输入的分数到变量score中
while [ "$score" != -1]
do
score = $score / 10
case $score in
9|10) echo "very good"
;;
8) echo "good"
;;
7) echo "no good"
;;
6) echo "no bad"
;;
*) echo "bad"
esac
echo "please input score"
read score
done
echo "script exiting... OK"

Makefile文件的编写

1
2
3
4
5
6
7
# Makefile文件的基本结构
宏定义(变量定义)
目标:依赖文件列表
命令 (命令要缩进一个[tab])
...
目标:依赖文件列表
命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# find_src_files.sh
# !/bin/bash
for dir in 'find -type d'
do
cd $dir; echo -n 'find *.c'; echo -n " "; cd - >/dev/nul
done


# 一个较通用的Makefile文件
CC = gcc
CFLAGS =
CPPFLAGS =
LINK = gcc
LDFLAGS =

## debug or release flag, debug -1, release -0
DEBUGorRELEASE = 0

## "ifeq" and "(" ,ust be separated by space
ifeq ($(DEBUGorRELEASE), 0)
OUTPUT_DIR = ./release
else
CFLAGS += -g
CPPFLAGS += -g
OUTPUT_DIR = ./debug
endif

target = a.out

VPATH = $(shell Find -type d)
FIND_SRC_FILES = $(shell find_src_files.sh)
SRC_FILES = $(notdir $(FIND_SRC_FILES))

OBJ_FILES = $(SRC_FILES:.c=.o)
DEP_FILES = $(OBJ_FILES:.o=.d)
OUTPUT_OBJS = $(addprefix $(OUTPUT_DIR)/, $(OBJ_FILES))
OUTPUT_DEPS = $(addprefix $(OUTPUT_DIR)/, $(DEP_FILES))

all: $(OUTPUT_DIR)/$(target)

## link all objs and libs
$(OUTPUT_DIR)/$(target): $(OUTPUT_OBJS)
echo $(SRC_FILES)
$(LINK) $(LDFLAGS) $(OUTPUT_OBJS) $(CFLAGS) -o $@
@echo "linking...................ok"

## check output dir
"$(OUTPUT_DIR)":
-@[-d "$(OUTPUT_DIR)"] || mkdir "$(OUTPUT_DIR)"

##



  • 复习提纲到pdf第41页
  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信