2022-11-12_Linux环境变量
1. 分页存储(了解)
一个分页存储管理系统中,地址长度为 32 位,其中页号占 8 位,则页表长度是__。
A.2的8次方
B.2的16次方
C.2的24次方
D.2的32次方
【答案解析】A
页号即页表项的序号,总共占8个二进制位,意味着页表项的个数就是2^8
2. 地址转换
在CPU和物理内存之间进行地址转换时,( )将地址从虚拟(逻辑)地址空间映射到物理地址空间()
A.TCB
B.MMU
C.CACHE
D.DMA
【答案解析】B
A TCB 线程控制块
B 内存管理单元,一种负责处理中央处理器(CPU)的内存访问请求,
功能包括虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制
C CACHE 高速缓存
D DMA 直接内存存取
3. 环境变量默认存储位置(了解)
使用shell时,默认的环境变量放在哪里()?
A.~/.bash_profile
B.~/.bash
C./etc/profile.d
D.~/bash
【答案解析】A
~/.bash_profile:用户级的环境配置文件,每个用户目录下都会具有各自的,在用户每次登录系统时被读取,里面所有命令都会被shell执行。包括环境变量的配置命令,因此A正确
~/.bash 以及 ~/bash 在linux的用户目录中默认是没有这两个文件的,因此也就不清楚其作用了,因此B和D都是错误的
/etc/progile.d 这是个目录或者说文件夹,其中包含了系统级的环境配置文件,任意用户登录时都会执行这个目录下的环境配置文件完成环境配置,但是要注意这个是目录并不是保存环境变量配置的配置文件,因此D错误
4. 查看环境变量
以下哪些命令可以查看环境变量 [多选]
A.echo
B.env
C.set
D.export
【答案解析】ABC
echo 用于输出打印一个变量的内容,包括环境变量
env 用于打印所有环境变量信息
set 用于输出打印所有环境配置以及变量信息,不限于环境变量
export用于设置环境变量 ,并不是用于查看环境变量的操作。
5. 环境变量概念
以下描述正确的有 [多选]
A.子进程默认会复制拥有与父进程相同的环境变量
B.环境变量使shell运行环境配置变的更加复杂
C.环境变量可以使用export命令设置
D.删除一个环境变量可以使用unset和rm命令
【答案解析】AD
A和D选项正确,根据选项理解功能即可。
B选项错误 环境变量设置之后,不需要重启shell,也不需要重新加载文件,只要设置换环境变量就能直接生效,因此可以使运行环境的配置更加灵活简单
D选项错误 rm只是普通的文件操作指令,无法删除环境变量
2022-11-19_进程程序替换
6. 进程退出
关于pid_t waitpid(pid_t pid,int *status,int options);函数,以下描述错误的有()
A.若pid大于0,则表示等待指定的子进程退出
B.若pid等于-1,则表示等待任意一个子进程退出
C.status参数用于获取退出子进程的退出码
D.若options选项参数被设置为WNOHANG则waitpid为一直阻塞
【答案解析】D
waitpid默认阻塞等待任意一个或指定子进程退出
当options被设置为WNOHANG则函数非阻塞,且当没有子进程退出时,waitpid返回0
waitpid返回值是-1表示出错,第一个参数设置-1表示等待任意一个子进程退出
7. waitpid
关于waitpid函数WNOHANG参数的描述正确的是:()[多选]
A.若选项参数被设置为WNOHANG则waitpid为一直阻塞
B.若选项参数被设置为WNOHANG则waitpid为非阻塞
C.若waitpid设置WNOHANG后,没有子进程退出则返回值为-1
D.若waitpid设置WNOHANG后,没有子进程退出则返回值为0
【答案解析】BD
waitpid默认阻塞等待任意一个或指定子进程退出
当options被设置为WNOHANG则函数非阻塞,且当没有子进程退出时,waitpid返回0,并不会阻塞。
因此根据对于waitpid函数的参数认识理解分析,正确选项为B和D选项
8. exec系列函数
以下描述正确的有:
A.execl函数可以直接指定可执行程序文件的名称而不需要路径
B.execle函数可以直接指定可执行程序文件的名称而不需要路径
C.execl函数和execle函数的区别是是否自定义设置环境变量
D.execl函数和execlp函数的区别是是否自定义设置环境变量
【答案解析】C
exec函数族:execl,execlp,execle,execv,execvp,execve
#include <unistd.h>
extern char **environ;
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ..., char * const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);
int execve(const char *path, char *const argv[], char *const envp[]);
其中 l 和 v 的区别在于程序运行参数的赋予方式不同,l是通过函数参数逐个给与,最终以NULL结尾,而v是通过字符指针数组一次性给与。
其中有没有 p 的区别在于程序是否需要带路径,也就是是否会默认到path环境变量指定的路径下寻找程序,没有p的需要指定路径,有p的会默认到path环境变量指定路径下寻找
其中有没有 e 的区别在于程序是否需要自定义环境变量,没有e则默认使用父进程环境变量,有e则自定义环境变量。
2022-11-21_文件fd
9. 进程与文件之间的关系
Linux下两个进程可以同时打开同一个文件,这时如下描述错误的是:
A.两个进程中分别产生生成两个独立的fd
B.两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
C.进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
D.任何一个进程删除该文件时,另外一个进程会立即出现读写失败
E.两个进程可以分别读取文件的不同部分而不会相互影响
F.一个进程对文件长度和内容的修改另外一个进程可以立即感知
【答案解析】D
在一个进程中打开一个文件,会在进程内生成文件的描述信息结构,并将其地址添加到pcb中的文件描述信息数组中,最终返回所在位置下标作为文件描述符
A选项正确,进程数据独有,各自有各自的文件描述信息表,因此各自打开文件会有自己独立的描述信息添加在各自信息表的不同位置,因此fd各自也相互独立
B选项正确,两个进程打开同一个文件,但是各有各的文件描述信息以及读写位置,互不影响,因此多个进程同时读写有可能会造成穿插覆盖的情况(原子性操作,被认为是一次性完成的操作,操作过程中间不会被打断,通常以此表示操作的安全性)
C选项正确,文件锁就是用于保护对文件当前的操作不会被打断,就算时间片轮转,因为已经对文件加锁,其他的进程也无法对文件内容进行操作,从而保护在本次文件操作过程是安全的。
D选项错误,删除文件实际上只是删除文件的目录项,文件的数据以及inode并不会立即被删除,因此若进程已经打开文件,文件被删除时,并不会影响进程的操作,因为进程已经具备文件的描述信息(可以编写代码进行尝试,在文件打开后,外界删除文件,然后看进程中是否还可以继续写入或读取数据)
E选项正确,如果仅仅是读取文件内容,两个不同进程其实都有自己各自的描述信息和读写位置,因此可以同时读取文件数据而不会受到对方的影响。
F选项正确,因为文件内容的修改是直接反馈至磁盘文件系统中的,因此当文件内容被修改,其他进程因为也是针对磁盘数据的操作,因此可以立即感知到(可以写代码尝试一个进程打开文件后,等其他进程修改了内容后然后再读取文件数据进行测试)
10. 文件描述符的分配
以下描述正确的是 [多选]
A.程序中打开文件所返回的文件描述符, 本质上在PCB中是文件描述符表的下标
B.多个文件描述符可以通过dup2函数进行重定向后操作同一个文件
C.在进程中多次打开同一个文件返回的文件描述符是一致的
D.文件流指针就是struct _IO_FILE结构体, 该结构体当中的int _fileno 保存的文件描述符, 是一对一的关系
【答案解析】ABD
A选项正确:文件描述符实际上是内核中文件描述信息表中数组下标,用户根据下标在进程pcb中的文件描述信息表中找到相应文件描述信息,实现对文件的操作;
B选项正确:不同信息表数组下标的位置可以存放相同的文件描述信息结构指针,dup2重定向的本质原理,就是改变对应位置的文件信息而改变操作对象文件的。
C选项错误:文件描述符表中遵循最小未使用分配规则,也就是从表中找寻最小的没有被使用的位置进行存储,因此并不保证多次打开会使用同一个文件描述符
D选项正确:我们见到的FILE *文件流指针,其实就是_IO_FILE的类型重定义,其中封装包含了文件描述符,因此一个文件流指针一定对应有一个文件描述符。
11. fread接口
2022-11-26_重定向
12. 重定向(了解)
bash中,需要将脚本demo.sh的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的 [多选]
A.bash demo.sh &>demo.log
B.bash demo.sh >&demo.log
C.bash demo.sh >demo.log 2>&1
D.bash demo.sh 2>demo.log 1>demo.log
【答案解析】ABCD
在命令的重定向中, >表示重定向,0表示标准输入,1表示标准输出,2表示标准错误
如果需要将标准输出和标准错误输出重定向至文件demo.log;
比较典型的方式是:bash demo.sh 1>demo.log 2>&1
先将标准输出重定向到demo.log文件,然后将标准错误重定向到标准输出(这时候的标准输出已经是指向文件了,所以也就是将标准错误重定向到文件)
A command &> file 表示将标准输出stdout和标准错误输出stderr重定向至指定的文件file中。
B 与A选项功能雷同
C 比较典型的写法,将标准输出和标准错误都重定向到文件, >demo.log是一种把前边的标准输出1忽略的写法
D 比较直观的一种写法,不秀技,直观的将标准输入和标准错误分别重定向到文件
13. dup2函数
以下对int dup2(int oldfd, int newfd);接口描述错误的是: [多选]
A.重定向后,oldfd和newfd都会操作oldfd所操作的文件
B.重定向后,oldfd和newfd都会操作newfd所操作的文件
C.重定向前,若newfd已经有打开的文件,则会关闭
D.重定向前,若oldfd已经有打开的文件,则会关闭
【答案解析】BD
int dup2(int oldfd, int newfd);
函数功能为将newfd描述符重定向到oldfd描述符,相当于重定向完毕后都是操作oldfd所操作的文件
但是在过程中如果newfd本身已经有对应打开的文件信息,则会先关闭文件后再重定向(否则会资源泄露)
14. 重定向原理
请简述重定向的实现原理:(简答题)
【答案解析】
每个文件描述符都是一个内核中文件描述信息数组的下标,对应有一个文件的描述信息用于操作文件,而重定向就是在不改变所操作的文件描述符的情况下,通过改变描述符对应的文件描述信息进而实现改变所操作的文件
2023-01-08_inode理解
15. 理解inode
下面关于Linux文件系统的inode描述错误的是:
A.inode和文件名是一一对应的
B.inode描述了文件大小和指向数据块的指针
C.通过inode可获得文件占用的块数
D.通过inode可实现文件的逻辑结构和物理结构的转换
【答案解析】A
A选项错误,这里说的文件名指的是文件的目录项。
一个文件inode是有可能有多个目录项的,比如给一个文件创建多个硬链接,因此并非一一对应
B选项正确,inode中包含了文件的各种描述信息,权限,大小,时间属性,数据块指针…等等都包含在内
C选项正确,inode中包含了文件数据所占据的存储位置的信息,因此可以获得we你按占用的数据块数
D选项正确,inode就像是文件的一个整体的描述,有了这个描述,上层就可以重新组织虚拟逻辑结构,通过inode映射其物理结构(简单理解可以联想类似于虚拟地址空间与物理内存之间的页表)
16. 理解软链接
使用In命令将生成了一个指向文件old的符号链接new,如果你将文件old删除,是否还能够访问文件中的数据?
A.不可能再访问
B.仍然可以访问
C.能否访问取决于文件的所有者
D.能否访问取决于文件的权限
【答案解析】A
ln生成符号链接文件,指的是通过 ln -s 命令生成软链接文件。
软链接文件是一个独立的文件,有自己的inode节点,这个文件数据中保存的是源文件路径,通过保存的路径访问源文件,因此源文件被删除则无法再访问,通过路径将找不到源文件,这时候软链接就会失效。
根据以上对于软链接的理解,A选项正确,其他选项都错误
17. 软硬链接区别1
Linux中包括两种链接:硬链接(Hard Link)和软连接(Soft Link),下列说法正确的是()
A.软连接可以跨文件系统进行连接,硬链接不可以
B.当删除原文件的时候软连接文件仍然存在,且指向的内容不变
C.硬链接被删除,磁盘上的数据文件会同时被删除
D.硬链接会重新建立一个inode,软链接不会
【答案解析】A
软链接文件是一个独立的文件有自己的inode节点,文件中保存了源文件路径,通过数据中保存的源文件路径访问源文件
硬链接是文件的一个目录项,与源文件共用同一个inode节点,直接通过自己的inode节点访问源文件(其实本质上来说与源文件没区别)
A正确 不同分区有可能有不同文件系统,就算系统相同,也会导致节点号有歧义冲突,因此硬链接不能跨分区建立,正确
B错误 删除源文件,软链接文件失效
C错误 硬链接被删除,则inode中的链接数-1,并不会直接删除文件数据,而是等链接数为0的时候才会实际删除对应文件的inode,将所占用数据块置为空闲
D错误 硬链接与源文件共用inode
18. 软硬链接区别2
关于静态库与动态库的区别,以下说法错误的是()
A.加载动态库的程序运行速度相对较快
B.静态库会被添加为程序的一部分进行使用
C.动态库可用节省内存和磁盘空间
D.静态库重新编译,需要将应用程序重新编译
【答案解析】
动态库也叫运行时库,是运行时加载的库,将库中数据加载到内存中后,每个使用了动态库的程序都要根据加载的起始位置计算内部函数以及变量地址,因此动态链接动态库加载及运行速度相较静态链接是较为不如的,但是它也有好处,就是多个程序在内存中只需要加载一份动态库就可以共享使用。
静态链接,链接静态库,每个程序将自己在库中用到的指令代码单独写入自己可执行程序中,程序运行时无依赖,加载运行速度快,但是程序运行后有可能会有冗余代码在内存中
根据以上理解分析:
A错误 加载动态库的程序运行速度相对较慢,因为动态库运行时加载,映射到虚拟地址空间后需要重新根据映射起始地址计算函数/变量地址
B正确
C正确
D正确 动态链接的程序一旦库中代码发生改变,重新加载一次动态库即可,但是静态链接代码是写入程序中的,因此库中代码发生改变,必须重新链接生成程序才可以
19. 动态链接的优点(了解)
下面哪一个不是动态链接库的优点?
A.共享
B.装载速度快
C.开发模式好
D.减少页面交换
【答案解析】B
动态链接链接的是动态库,而动态库中包含了大量的常用的功能接口指令代码
这种链接方式,是用于解决静态库存在的浪费内存和磁盘空间,以及模块更新困难等问题。
动态链接生成可执行程序,可执行程序中会记录自己依赖的库列表以及库中的函数地址信息,等到运行程序的时候,由操作系统将库加载到内存中(多个程序可以共享,不需要加载多份相同实例),然后根据库加载后的地址在对每个程序内部用到的库函数的地址进行偏移计算。
基于这么一种思想,动态链接具有以下优缺点:
- 更加节省内存并减少页面交换;
- 库文件与程序文件独立,只要输出接口不变,更换库文件不会对程序文件造成任何影响,因而极大地提高了可维护性和可扩展性;
- 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个库函数;
- 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
- 运行时依赖,否则找不到库文件就会运行失败
- 运行加载速度相较静态库慢一些
- 需要对库版本之间的兼容性做出更多处理
20. 动静态库的选项(重点)
关于动态库和静态库以下描述正确的有()
A.gcc test.c -o libmytest.so 命令可以生成一个动态库
B.库文件中可以包含main函数
C.静态库使用gcc命令生成
D.库文件的链接可以使用-L选项指定所在路径,使用-l命令链接指定的库文件
【答案解析】D
A选项错误,默认情况下,gcc test.c -o libmytest.so 生成的是一个可执行程序,而并非动态库, 若要生成动态库需要使用 --shared 选项进行指定
B选项错误,库文件是被其他程序引入使用的,因此不能有main函数,否则会与程序中的main函数产生冲突
C选项错误,静态库使用 ar 指令生成
D选项正确,gcc的-L选项用于指定链接库路径, -l选项用于链接指定库文件