系统编程基础与Linux下的集成开发环境

 权限

基本认识

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

编译顺序为从下至上

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值