权限
基本认识
Linux下一切皆文件,Linux中的权限自然也就是与文件相关的权限。
用户:owner, grouper , other
文件属性:r(read) , w(write) ,x(execute)
文件类型:- 普通文件——如源代码,库文件,可执行程序,文件压缩包等
d 目录文件 ; l 链接文件 ; p 管道文件; c 字符设备文件; b 块文件 ; s socket文件
有了以上认识,再看下文件的各个属性:
-rw-rw-r-- 1 owner grouper 500 Sep 18 00:00 Filename
第一个字符为-, 说明是一个普通文件; 后九个字符为rwx, 代表的是owner、 grouper、other的权限, 若没有该权限则为- ;数字1为链接数,对于目录则是该目录下的子目录和文件数量(不包括.和..) ; 再后就是所有者和组名(没有other,这二者外皆为other):数字500是文件大小(单位是字节); 再后分别是文件的最后修改时间和文件名。
补充:进入一个目录需要x权限
权限操作
修改文件属性的指令:chmod , chown, chgrp
具体如下——(默认权限为root)
现有File文件, 文件权限为 -rw-rw-r--(u:owner,g:grouper,o:other)
有指令: chmod u+x File 文件权限 :-rwxrw-r--
有指令:chmod u-rwx File 文件权限:----rw-r--
有指令:chmod u+rwx,g+x 文件权限:-rwxrwxr--
有指令:chgrp root File 文件grouper为root
有指令:chown root File 文件owner为root
有指令:chown root:root File 文件owner与grouper皆为root
八进制替换rwx
有指令:chmod 776 File 文件权限:-rwxrwxrwx
这里776对应二进制为 111 111 110
Linux规定,目录起始权限为777, 普通文件起始权限为666,umask为系统默认配置好的权限掩码。
最终权限 = 起始权限 & (~umask)
如:umask为0022 ,对应二进制为 000 010 010,File为普通文件对应二进制为110 110 110
umask 取反为111 101 101 再对 110 110 110 进行按位与运算后,结果为110 100 100
所以最终结果应该是-rw-r--r--
沾滞位
——公共目录下的操作权限限制
在联合开发的场景下,我们需要一个公共目录(此目录属性为drwxrwxrwx),以进行部分操作,为了防止互删文件:
有指令:chmod +t dir 属性为:drwxrwxrwt
t则为沾滞位,当一个目录被设置了沾滞位,该目录下的文件只能由root、目录的所有者、文件的所有者这三者可对文件进行删除操作。
Linux下的编辑器vim
基本操作
命令模式(Normal mode,打开后的默认模式)此时键入shift+;(也就是:号)进入底行模式(lastline mode)
在命令模式下的部分操作:
yy 复制当前行
p 粘贴
dd 删除光标所在行
u 撤销上一步操作
Ctrl r 取消u
i、a、o 进入插入模式
Shift r 进入替换模式
Shift 4 光标移至末列
Shift 6 光标移至首列
Shift g 光标移至末行
gg 光标移至首行
n Shift g 光标移至n行
h 光标左移 l 光标右移 j 光标下移 k 光标上移
Shift ~ 大小写转换(可长按)
x 向后删 Shift x 向前删
w 按word向后移动 b 按word向前移动
cw 删除当前光标所在word,并进入插入模式
底行模式下的部分操作:
help vim-modes 查看所有模式
set nu 调出行号
set nonu 取消行号
w 保存 q 退出 q!强制退出 w!强制保存
vs 分屏操作
vs [filename] 不手动保存则不会保存,若保存则放在当前目录下
vim支持在不退出的情况下使用shell命令:在底行模式输入 !与shell指令
%s/被替换的内容/要替换的内容/g 全局(g)替换
vim环境配置
环境配置不影响其他用户,各自使用自己家目录下的配置文件——.vimrc,所谓配置环境,就是修改自己的.vimrc,但根目录下的vimrc对所有用户有效。
Linux下的编译器gcc/g++
回顾编译的四个阶段
预处理:头文件展开,去注释,宏替换,条件编译
编译:转变为汇编代码
汇编:转变为二进制可重定向目标文件
链接:链接库
gcc对应指令:
gcc -E test.c -o test.i #预处理后停止,并生成.i文件
gcc -S test.c -o test.s #编译后停止,并生成.s文件
gcc -c test.c -o test.o #汇编后停止,并生成.o文件
gcc test.c -o test.exe #执行上述操作,并将目标文件与库链接
简单了解链接与库
file [filename] 查看该文件具体信息,包括所链接库的类型
ldd[filename] 查看动态库的具体信息
Linux下的命名规则:动态库以.so为后缀,静态库以.a为后缀,二者又皆以lib为前缀
Linux下默认为动态链接,若需静态链接则需加上-static
系统仅有一份动态库,各用户共同一份动态库
链接:链接过程主要包括地址和空间分配(Address and Storage Allocation)、符号决议(Symbol Resolution)和重定位(Relocation)等步骤
简单区分动、静态链接:动态链接更倾向于给目标文件一个地址,需要调用库函数时,根据地址进入动态库执行相应代码。而静态链接则倾向于将静态库中相应库函数拷贝进目标文件。相对而言,静态库无疑加大了可执行程序的体积,但其又有着其独有的优势——在无相应动态库的同平台主机上,可执行程序依旧可以运行
补充部分gcc指令
-g 生成调试信息即debug版本,GNU调试器可利用该信息(gcc默认生成release版本)
-shared 尽量使用动态库,所以生成文件较小
-O0 -O1 -O2 -O3 编译器的四个优化选项0表示没有优化,1为缺省值,3最高
-w 不生成任何警告信息
-Wall 生成所以警告信息
Linux下的调试器gdb
简单了解readelf
——用于分析ELF文件(Executable and Linkable Format)
显示信息:文件头、节(section)头、符号表、重定位信息,动态段等
readelf -h [ELF] 显示ELF的头部信息
readelf -S [ELF] 显示所有节的信息
readelf -s [ELF] 显示符号表信息
-S即可看到debug版本的debug信息,而release则无
gdb的部分常用指令
list 或 l 行号 显示该行号及附近源代码
l 函数名 显示该函数源代码
r或run 运行程序
n或next 单条执行也就是逐过程(vs中的F10)
s或step 进入函数调用也就是逐语句(VS中的F11)
break或b 行号 在该行设置断点
b 函数名 在该函数开始设置断电
info break 查看断点信息
finish 执行至当前函数返回
print或p 显示表达式的值
p 变量 显示变量的值
continue或c 运行至下一断点
delete breakpoints n 或 d n 删除序号为n的断点(不是行号!!!)
delete breakpoints 删除所有断点
enable breakpoints 启用断点
display 变量名 跟踪查看该变量
undisplay 变量名
until 行号 跳转至该行
breaktrace或bt 查看调用堆栈
info或i locals 查看当前栈帧局部变量的值
Linux下的项目自动化构建工具
简单了解语法
(在makefile文件中,且同目录下有mycode.c文件)
mycode.exe:mycode.c
gcc mycode.c -o mycode.exe
.PHONY:clean
clean:
rm -f mycode.exe
在shell中输入make则会根据第一个目标项与依赖项列表与其下第一个指令(默认只生成一个可执行程序),此时就会生成一个mycode.exe文件,若再make就会报错,内容为:'mycode.exe is up to date'
其中的clean是被.PHONY修饰下的伪目标——该目标总是被执行的,在上述例子中,make指令在mycode.c文件未被修改的情况下无法多次执行,但如果是一个伪目标,则可以。
推导规则
——从上至下扫描,根据目标项与依赖项列表执行相应指令,若依赖项列表不存在,则根据依赖文件列表所对应项推导
如只存在test.c文件,makefile中
test:test.o
gcc test.o -o test
test.o:test.s
gcc -c test.s -o test.o
test.s:test.i
gcc -S test.i -o test.s
test.i:test.c
gcc -E test.c -o test.i
编译顺序为从下至上