一份Linux测试题

Linux基础

Posted by mkk on December 30, 2024

day01

说明:每题10分,共100分,得到60分及以上算通过

1. 如何理解linux中一切皆文件

1
2
3
4
会将各种硬件(CPU/内存)映射成文件
将运行程序进程的内存映射成文件

=> 也就是Linux系统在操作各种硬件、内存时都统一为了文件操作

2. 列出几个Linux根目录下的文件夹及其作用

1
2
3
4
/bin  可执行命令程序的目录文件
/home  用户的家目录,可以包含n个用户的文件夹,默认就只有我们创建的登陆用户
/etc  系统配置文件目录, 比如:passwd(用户信息)
/usr  用户的安装程序目录, 相当于windows中的Program Files

3. 现在有一个名为xxx的包,写出安装和卸载的命令

1
2
sudo apt install xxx
sudo apt remove xxx

4. 说出Linux中的2个帮助命令并区别它们

1
2
help: 查看内部命令的帮助文档
man: 查看外部命令(bin下)的帮助文档

5. 列出4个常用的快捷键及其作用

1
2
3
4
Ctrl + C 或 Q: 停止退出
Ctrl + L 或 clear: 清屏
Tab键: 补全
上下键:查找执行过的命令

6. 列出查看目录内容和进入目录的命令

1
2
ls: 列出目录下的内容   =》 ll列出包含隐蔽文件在内的所有文件(夹)详细信息
cd: 进入目录

7. 列出文件或文件夹的创建、删除、拷贝和移动的命令

1
2
3
4
5
mkdir: 创建文件夹
touch: 创建文件
rm: 删除文件或文件夹
cp: 拷贝文件或文件夹
mv: 移动文件或文件夹

8. 列出查看文件内容的2个命令,并区别它们

1
2
cat: 查看文件的所有内容
tail: 查看文件最后的部分行内容 =》还可以实时监视文件变化

9. 列出输出重定向和输出过滤的命令

1
2
3
>: 输出重定向(覆盖)
>>: 输出重定向(追加)
|grep: 输出过滤

10. 说说你对文件权限的理解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
文件权限是为了限制不同用户的操作级别,更安全
权限:读(r)、写(w)、执行(x)
文件:
		可读:查看文件内容  r
		可写:修改文件内容 w
		可执行:可运行  x
		注意:文件是可重命令和删除得看文件夹的权限
目录
		可读:可以ls查看目录下的内容
		可写:可以对目录内文件创建和删除,重命令目录
		可执行:可进入
内部使用3个二进制位来存储权限:rwx
		也就是:4:r, 2: w, 1: x
		可以相加得到多个权限:3:wx  5: rx   6: rw  7: rwx

day02

1. 画图说明VIM三种模式之间的转换和命令模式下的命令

2. 求两个数及其之间的数的总和

这两个数在执行shell时通过参数携带,如果携带的参数小于2个提示“请指定两个数值参数”,指定的两个数如果相等和为其中一个,这两个数可能第一个大,也可能第二个大,计算出结果后输出“总和为?”

day03

1. 区别git与svn

1
2
3
SVN: 集中式,开发者本地不能进行版本控制,本地只有仓库的某个版本(一般最新)必须连接上中央仓库才可以
    (必须联网)=》现在使用很少
GIT:分布式,开发者本地有仓库的所有版本,本地就可以进行版本控制(不受网络限制) =》基本都使用

2. git的三个分区

1
2
3
工作区 
暂存区
版本区(本地仓库)

3. git本地版本控制的基本命令(至少5个)

1
2
3
4
5
6
git init	初始化仓库,生成工作区   =》 生成 .git文件夹
git add .		将工作区的更新添加到暂存区
git commit -m "xxx"	将暂存区的更新提交到本地仓库
git status		查看工作区和暂存区的状态(是否有更新)
git reflog		查看历史版本信息
git reset --hard 版本号		得到指定版本的代码

4. 远程仓库相关的几个基本操作(至少3个)

1
2
3
4
5
1. 创建远程仓库
2. 将本地仓库的代码推送到远程
3. 克隆远程仓库生成本地仓库
4. 如果本地工作区代码有更新,要提交到本地仓库并推送到远程仓库
5. 如果远程仓库有更新,要拉取到本地仓库

5. 区别远程仓库的https与ssh两种方式

1
2
https: 每次推送都需要输入用户名和密码 (通过用户名和密码进行身份校验的)
ssh: 每次推送不需要输入用户名和密码(通过自动携带的私钥与保存在远程的公钥进行匹配校验的)

6. 说说版本控制冲突产生的原因和解决办法

1
2
原因: 当2个人将修改推送到同一个分支时,如果修改了同一个文件,后操作的人就会产生冲突
解决:推送失败时先进行拉取,让工具做带冲突的合并, 先利用工具解决冲突代码(一般留下双方),再提交并推送。

day04

1. 区别GCC、glibc与GNU C

1
2
3
GNU C: C语言标准
glibc: C语言标准的实现
gcc: 将C语言程序处理成可执行二进制程序的编译器

2. 说说C语言程序从源代码到可执行程序经历的四个处理过程

1
2
3
4
预处理
编译
汇编
链接

3. 说说使用git管理项目的基本过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
	配置忽略:
		指定git对哪些文件夹或文件不进行版本管理
		.gitignore
	创建本地仓库
		git init
		git add .
		git commit -m "初始化项目"
	创建远程仓库
		在gitee上创建仓库
	将本地仓库推送到远程仓库
		git remote add origin url
		git push -u origin 主分支
	本地修改代码先提交到本地仓库再推送到远程仓库
		git add .
		git commit -m "xxx"
		git push origin master
	如果远程仓库有更新,拉取到本地
		git pull origin master
	克隆仓库
		git clone https://gitee.com/zxfjd3g/linux_app

4. 列出一些文件IO库函数(至少6个)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fopen(): 打开一个文件流
fclose():关闭文件流
fputc():向文件中写入一个字符
fputs():向文件中写入一个字符串
fprintf():向文件中写入指定格式的字符串
fgetc():读取文件中的一个字符
fgets():读取文件中的一个字符串
fscanf(): 读取文件中的一个特定格式的字符串,并保存到多个变量

stdin:读取终端的标准输入流
stdout:写到终端的标准输出流
stderr:写到终端的标准错误输出流
输出重定向:可以将stdout和stderr的数据重定向到不同的日志文件中
errno:错误编号, 后面可以根据strerrono得到错误信息
perror():输出错误信息

5. 使用IO的系统调用实现文件拷贝的功能,并使用make编译运行

day05

1. 区别进程和程序

  • 程序:程序代码,静态的
  • 进程:正在运行的程序,动态的,包括:内存(代码、堆、栈等)和分配给它的其它系统资源(比如:文件描述符)

2. 说说进程内存的组成部分

  • 文本(程序代码: 程序代码、指令
  • 初始化数据:已经初始化的全局变量和静态变量
  • 未初始化数据:没有初始化的全局变量和静态变量
  • 堆(heap):malloc动态分配
  • 未分配内存:供堆和栈扩展使用的区域
  • 栈:局部变量、函数参数、返回地址等
  • 参数与环境: 程序参数和环境变量

3. 如何验证linux中程序运行内存是虚拟内存而不是物理内存?

  • 在父进程中定义一个变量val并赋值
  • 通过fork来创建一个子进程, 此时子进程也就有了val变量,且值与父进程是一样的
  • 查看父子进程的val的地址,发现地址值一样 =》程序中获取的不是真实内存,而是虚拟内存

4. 列出进程相关的的三个函数,并说明其作用

  • fork(): 创建当前进程的子进程
  • execve(): 在当前进程(一般是子进程)中执行另一个程序(自定义或命令)
  • waitpid(): 等待指定pid的子进程执行结束

5. 说出进程间通信的三种方式,并简单描述一下其特点

  • 管道:利用管道实现两个进程间的单向通信(半双工)
  • 共享内存:利用共享内存实现两个进程间通信,不限制单向,但要注意一个写一个读即可
  • 消息队列:一个进程向队列发n个数据,另一个进程从队列中顺序接收获取数据

day06

1. 区别进程与线程

  • 都是Linux系统可以进行调度执行的执行单元
  • 进程是一个运行的程序,有独立私有的内存空间和资源
  • 线程是进程内的一个执行单元,一个进程内的所有线程共享进程的空间和资源
  • 线程间共享更简单,一个全局变量就搞定,但带来的线程同步问题
  • 线程间切换相比进程间切换消耗更小,更适合做高并发处理。

2. 列出线程控制的4个方法及其作用

  • pthread_create(): 创建线程
  • pthread_join():等待指定线程结束
  • pthread_cancel():取消指定线程
  • pthread_exit():结束当前进程

3. 列出线程间同步的几种方式及其特点

  • 互斥锁:限制多线程共享资源数据在某个时间段内只能有一个线程操作数据
  • 条件变量:控制多个线程间的切换执行
  • 信号量:控制多个线程的执行顺序

4. 列出消息队列的几个操作

  • 创建队列:mq_open()
  • 向队列发消息: mq_send()
  • 接收获取队列中的消息: mq_receive()
  • 删除队列: mq_unlink()

5. 列出互斥锁的几个操作

  • 初始化锁: 得到内置的初始化锁
  • 加锁:在操作共享数据前 lock()
  • 解锁:在操作共享数据后 unlock()
  • 销毁锁:在最后 destroy()