Linux是一款自由、免费的操作系统,极具影响力
支持众多处理器架构、拥有大量开源软件
具有稳定性、可靠性和灵活的可配置性
除让个人桌面系统以外,在其他所有竞争领域中几乎占主流地位
/ 根目录
所有目录或文件的起点
/boot 目录
存放系统引导文件
/etc目录
供系统维护管理用的命令和配置文件
passwd文件:用户相关的配置信息
issue文件:登录前在login之上的提示信息
/bin
系统常用命令,是二进制可执行程序,如ls,ln,cp,cat等
/home
用户目录,用于存放除了超级用户以外的其他个人用户数据。个人用户的主目录在此目录下。
/root
超级用户的主目录。root主目录位置保证了即使其他分区出问题,root也能正常工作
/tmp
存放临时文件
/dev
存放设备文件,如终端设备,磁带机,打印机等
/usr
二级目录结构,UNIX系统资源,巨大多数应用软件都以这个目录为起点,这是Linux桌面系统中最大的目录
/usr/include
C语言头文件存放目录
/usr/tmp
存放临时文件
/usr/bin
存放一些常用命令,如echo,grep,kill等
/lib,/usr/lib
存放各种库文件,指C语言的链接库文件,以及terminfo终端库等等
静态链接库文件有.a后缀(archive,存档)
动态链接库文件后缀是.so(shared objects)
Linux缺省情况下首先连接动态链接库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cEtWEXv0-1585219775427)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 14.17.23.png)]
名字长度:允许1-256字符
取名的合法字符 大小写字母有区别
文件名的字符包括:字母、数字、.(点)、_(下划线)和-(连字符)。
有些转意字符在 Linux 的命令解释器(shell)中有特殊的含义。这样的转意字符 有:?(问号)、*(星号)、 (空格)、$(货币符)、&、扩号等等。
在文件名中应尽量避免使用这些字符。文件名中可以有 (空格),但建议用户用_(下划线)来替代。/ 既可代表目录树的根也可作为路径名中的分隔符(类似DOS下的 \),因此 / 不能出现在文件名中。
星号 *
匹配任意长度的文件名字符串(包括空字符串)
点字符(.),
当它作为文件名或路径名分量的第一个字符时,必须显式匹配
\(反斜线)
也是一个特殊的字符。它屏蔽后继特殊字母的特殊含义(转意),使该字符仅取其符号所代表的字面意义。
例:*file匹配file,makefile,不匹配.profile文件
try*c 匹配try1.c try.c try.basic
问号 ?
匹配任一单字符
方括号 [ ]
匹配括号内任一字符,也可以用减号指定一个范围
例: [A-Z]* *.[ch] [Mm]akefile
注意:文件名通配符规则与正则表达式的规则不同,应用场合不同.不同种类shell通配符规则会略有些差别[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NaAuHriP-1585219775428)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 14.36.03.png)]
普通文件
最常用的一类文件,其特点是不包含文件系统的结构信息。通常用户所接触到的文件,如图形文件、数据文件、文档文件等都属于这种文件。
目录文件
目录文件是用于存放文件名及其相关信息的文件。是内核组织文件系统的基本节点。
链接文件
是一种特殊文件,实际上是指向一个真实存在的文件链接,类似于Windows下的快捷方式。分为硬链接文件和软链接文件。
设备文件
管道文件:一种特殊文件,主要用于不同进程间的信息传递
路径:用’/’隔开 相对路径 绝对路径
pwd命令:显示当前路径
根目录
“/”:所有目录的起点,操作系统本身的驻留程序存放在以根目录开始的专用目录中。
用户主目录
用户主目录是系统管理员增加用户时
sudo passwd root //Ubuntu初始时不建立root用户,需要设置密码后才建立好root用户
cat[选项] [文件名]
举例:
cat try.c
在终端显示出文本文件try.c的内容。
cat > try.txt
从标准输入(键盘)获取数据,直到按ctrl+d键标志输入结束。键盘输入内容存入文件try.txt
cat try1.c try2.c try.h
将3个文件按顺序输出
cat try1.c try2.c try.h > trysrc
将三个文件一起输入到trysrc中
cat makefile*.[ch] > src
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zBzUYza1-1585219775429)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 15.02.37.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gXnIOKgt-1585219775429)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326150303941.png)]
ls[选项] [目录名或文件名]
不给出实参时,列出当前目录下所有文件和目录
实参为文件时,列出文件项
实参为目录时,列出目录下的所有文件项
在同一命令行中可以指定多个实参
若列出的是目录,就在名字后面缀以斜线 /
若列出的是可执行文件,就在名字后面缀以星号 *****
若列出的是符号连接文件,就在名字后面缀以符号**@**
若列出的是普通文件,则名字面后无任何标记
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2A66fbyt-1585219775430)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326150629667.png)]
ls选项-l: 长格式列表
例:ls -l arg
-rwxr-x–x l liang stud 519 Jul 5 15:02 arg
第1列:文件属性
第1字符为文件类型
- 普通文件 b 块设备文件(Block)
d 目录文件(Dir) c 字符设备文件(Char)
l 符号连接文件(Link) p 命名管道文件(Pipe)
文件的访问权限(rwx读权限,写权限,可执行权限)
2-4字符: 文件所有者对文件的访问权限
5-7字符: 同组用户对文件的访问权限
8-10字符:其它用户对文件的访问权限
第2列:文件link数或目录子目录数*
第3列,第4列:文件主的名字和组名
第5列 文件大小
普通磁盘文件:列出文件大小(字节数)
目录:列出目录表大小,不是目录下文件长度和
符号连接文件:列出符号连接文件自身的长度
字符设备和块设备文件:列出主设备号和次设备号
管道文件:列出管道内的数据长度
第6列:文件最后一次被修改的日期和时间
第7列:文件名
对于符号连接文件,附带列出符号连接文件的内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fu3glmxr-1585219775430)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 15.19.26.png)]
选项 | 说明 |
---|---|
-num | 指定屏幕上一次所显示的行数; |
-d | 提示使用者,在画面下方显示 –More-- [Press space to continue, ‘q’ to quit.] ,如果使用者按错键,则会显示 [Press ‘h’ for instructions.]; |
-l | 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能; |
-f | 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上); |
-p | 不以卷动的方式显示每一页,而是先清除屏幕后再显示内容; |
-c | 跟 -p 相似,不同的是先显示内容再清除其他旧资料; |
-s | 当遇到有连续两行以上的空白行,就代换为一行的空白行; |
-u | 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同); |
+/ | 在每个文件显示前搜寻该字串(pattern),然后从该字串之后开始显示; |
+num | 从第 num 行开始显示。 |
按空格键,显示文本的下一屏内容
按Enter键,显示文本的下一行内容
按斜线符号(/),接着输入一个模式,可以在文本中寻找下一个相匹配的模式。
按Q键,退出more命令。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dV4g4AKp-1585219775431)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326154042895.png)]
功能:显示文件的头几行
格式:head –number filename
显示前number行,若不指定则显示10行。
实例:head -5 /etc/adduser.conf
tail -5 /etc/adduser.conf
命令功能:复制文件或目录
命令格式:cp [选项] 源文件或目录 目标文件或目录
-a | 该选项通常在复制目录时使用。它递归地将源目录下的所有子目录及其文件都复制到目标目录中,并且保留文件链接和文件属性不变。它等效于-dpr |
---|---|
-d | 复制时保留文件链接; |
-f | 若目标文件或目录已存在,则覆盖已存在的目标文件或目录并且不提示;默认 |
-i | 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式复制; |
-p | 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中; |
- R-r | 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件至目的地。此时目标文件必须为一个目录名; |
-l | 不复制,而是创建指向源文件的硬链接文件,链接文件名由目标文件给出。 |
-s | 对源文件建立符号链接,而非复制文件 |
基本语法
mv [选项] 源文件或目录 目标文件或目录
选项:-i 交互式操作;-f:禁止交互操作。
功能
使用mv命令可以将文件和目录改名
可以将文件和子目录从一个目录移动到另一个目录
rm *file1 file2 ...* *filen*
-r 递归地(Recursive)删除实参表中的目录,也就是删除一整棵目录树。
-i 每删除一个文件前需要操作员确认(Inform)
-f 强迫删除(Force)。只读文件也被删除并且无提示
正在运行的可执行程序文件不能被删除
功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。
格式:sort [选项] filename
•-m 将已排序的输入文件,合并为一个排序后的输出数据流。
•-n 以整数类型比较字段
•-o outfile 将输入写到指定文件,而非标准输出。如果该文件为输入文件之一,则sort 在进行排序写到输入文件之前,会先将它复制到一个临时文件
•-r 倒置排序的顺序为 由大至小(descending),而非默认的由小至大(ascending)
•-t char 使用单个字符char作为默认的字段分割字符,取代默认的空白字符。
•-u 只有唯一的记录,丢弃所有具有相同键值的记录,只留其中的第一条。只有键值字段是重要的,也就是说:被丢弃的记录其他部分可能是不同值。
•行为模式:sort 会读取指定的文件,如果未给定文件,则读取标准输入,在将排序好的数据写至标准输出。
•-b 忽略开头的空白
•-c 检查输入是否已正确排序,如输入未经排序,但退出码(exit code)为非零值,则不会有任何输出
•-d 字典顺序:仅文字数字与空白才有意义
•-g 一般数值:以浮点数字类型比较字段。这个选项的运作有点类似 -n.差别仅在于这个选项的数字可能有小数点及指数。(仅GNU版本提供此功能)
•-f 以不管字母大小写的方式排序
•-i 忽略无法打印的字符
•-k 定义排序键值字段(该选项后接一个字段编号,或则是一对数字。有时-k之后可用空白分隔。每个编号后都可以接一个点号的字符位置,及/ 或 修饰符(modifier)字母之一.且当出现多个-k选项时候,会先从第一个键值开始排序,找出匹配该键值的记录后,再进行第二个键值字段的排序,以此类推。)
功能:删除相邻的重复行,只保留一行
格式:uniq [选项] filename
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
功能:统计给定文件中的行数、字节数和字数。
格式:wc [option] filename
•-c:统计字节数,使用的是UTF-8编码,每个汉字占3个字节,行尾回车占一个字节。
•-l:统计行数
•-w:统计字数
•默认都统计,输出顺序总是行数,字数,字节数
•wc –cl test与wc –lc test是一样的。
功能:对两个已经排好需的文件进行比较,若没有排序好,则出错。
格式:comm [option] file1 file2
•option:1,2,3控制相应的列是否显示
•-12:表示1,2列不显示,默认都显示
•输出3列:
•第1列:仅在fiel1中出现的行
•第2列:仅在file2中出现的行
•第3列:两个文件都存在的行
功能:逐行比较两个文本文件,列出其不同之处,不要求实现对文件进行排序。
格式:diff [option] file1 file2
Option
-b:忽略行尾的空格,且字符串中的一个或多个空格都视为相等。
-c:采用上下文输出格式,提供三行上下文。
-C n:采用上下文输出格式,提供n行上下文。
-e:产生一个合法的ed脚本作为输出。
n1 a n3,n4:a表示增加
n1,n2 d n3:d表示删除
n1,n2 c n3,n4:c表示修改
n1,n2
-12:表示1,2列不显示,默认都显示
n1,n2是针对file1的,n3,n4是针对file2的
每一行后面跟随受到影响的若干行,以”<“开头的行属于file1,”>”开头的行属于file2。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SrEPsMwT-1585219775432)(/Users/tian.e.y/Library/Application Support/typora-user-images/截屏2020-03-26 17.09.51.png)]
路径分量分隔符用斜线/,而不是反斜线\
例如 /usr/stud/liu test/data1/cfg
当前工作目录是进程属性的一部分,每进程一个
没有逻辑盘的概念
在目录表中确实有两个文件
这两个目录项由系统创建和删除
每个用户都有自己独立的主目录 /home/用户名
用env命令查环境变量HOME的值
“/”:所有目录的起点,操作系统本身的驻留程序存放在以根目录开始的专用目录中。
主目录:用~表示
例:mkdir sun/work.d
mkdir除创建目录外,系统自动建立文件.与…
例:rmdir sun/work.d
要求被删除的目录除.与…外无其它文件或目录
cp命令选项–r,递归地复制一个目录
cp -r dir1 dir2
若dir2不存在,则新建子目录,并将dir1下内容拷入
若dir2已存在,则将所有文件拷入目录dir2
复制时列出所拷贝的文件名
根据文件的时戳,不拷贝相同的或者过时的版本的文件,以提高速度
dir1和dir2不慎颠倒位置,不会出现灾难性后果
find命令从指定的查找范围开始,递归地查找子目录,凡满足条件的文件或目录,执行规定的动作
格式: find [搜索路径] [选项] [-print –exec –ok …]
举例
find verl.d ver2.d -name ‘*.c’ -print
查找范围:当前目录的子目录ver1.d 和ver2.d
条件:与名字*.c匹配。注:*.c应当用引号括起
动作:把查找到的文件的路径名打印出来
功能强,选项较多
递归式查找,提供了一种遍历目录树的手段,其它命令经常借用find的“递归式查找”特性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y6yhWV3k-1585219775432)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326172807469.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x1MLEE5C-1585219775433)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326172818084.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ku5Xd8Az-1585219775433)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326172826947.png)]
find关于动作的选项
打印查找的文件的路径名
对查找到的目标执行某一命令
在-exec及随后的分号之间的内容作为一条命令,{}代表所查到的路径名,最后以;结尾。
与-exec类似,只是对查找到符合条件的目标执行一个命令前需要经过确认
将多个文件或目录打包在一个文件里,便于传输和保持。
tar [options] 包名 file-list(待归档文件或目录列表)
-c: 创建新的文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。
-f:-f<备份文件>或–file=<备份文件> 指定备份文件名。
-t: 列出备份文件的内容,查看已经备份的文件。
-x:从备份文件中还原文件。
-v:显示指令执行过程。
-z:用gzip来压缩/解压缩文件,加上该选项后可以将文件进行压缩,但还原时也要用该选项进行解压缩。
-r:添加文件到归档包文件的尾部
-C:切换到指定的目录dir
tar –cf example.tar *
对当前目录下的所有文件进行打包,生成example.tar
tar –cvf example.tar *
打包同时,列出包里的文件
查看包example.tar内容
tar –tf example.tar
还原example.tar包内容
tar –xf example.tar
tar –xvf example.tar
将文件file5添加到包example.tar中
tar –rf example.tar file5
当前目录下的所有文件或目录进行gzip压缩,生成tmp.tar.gz
tar –zcvf tmp.tar.gz *
tar –ztf tmp.tar.gz
解压缩tmp.tar.gz包
tar -xzvf tmp.tar.gz
解压缩tmp.tar.gz包到当前目录下的目录b
tar –zxvf tmp.tar.gz –C ./b
设work1是一个复杂的有多个层次的子目录
tar cvf work1.tar work1
从归档文件中恢复数据的命令:
tar xvf work1.tar
采用LZW算法对文件压缩,是一种字典压缩算法.压缩算法对文件中有规律的数据内容压缩效率很高.普通文本文件可压掉50-80%.有许多空白字段的数据库文件甚至可压掉90%以上.压缩完的文件名后缀是.Z
compress ch5 压缩,生成新文件ch5.Z
zcat ch5.Z 读取压缩格式的文件
uncompress ch.Z 解压缩,还原文件ch5
文件都有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARsCM7kB-1585219775434)(/Users/tian.e.y/Library/Application Support/typora-user-images/image-20200326180159252.png)]
为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。若一个 inode 号对应多个文件名,则称这些文件为硬链接。换言之,硬链接就是同一个文件使用了多个别名(见 图 hard link 就是 file 的一个别名,他们有共同的 inode)。
硬链接可由命令 link 或 ln 创建。
格式:ln [option] file link
无选项情况下,建立硬连接。
$ ln chapt0 intro
$ ls -l chapt0 intro
-rw-rw-rw- 2 kc kermit 17935 Dec 12 18:07 chapt0
-rw-rw-rw- 2 kc kermit 17935 Dec 12 18:07 intro
(前面的几项必相同)
$ **ls -**i chapt0 intro
13210 chapt0
13210 intro
chapt0与intro同时存在时,地位完全平等
删chapt0文件,则intro仍存在但link数减1
硬连接,只限于同一文件系统中的普通文件
注意:
不允许对目录用ln命令建立硬连接
一般来说,目录的link数=直属子目录数+2
软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。
软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块
符号链接也叫软链接,用特殊文件“符号链接文件”来实现,文件中仅包括了一个路径名
命令ln –s file link
ln -s users_on sym.link
ls -l sym.link
lrwxrwxrwx 1 guest other 8 Jul 26 16:57 sym.link->users_on
类型为l,大小为8字节,文件中只存放users_on字符串
文件的最后一次写时间以后不再变化
一旦建立了符号连接,删除操作删除的是符号连接文件,其它所有操作都将访问符号连接所引用的文件
用于控制进程对系统中文件和目录的访问
文件主,同组用户,其他用户
每个文件有唯一的属主
读、写、可执行
改变文件或目录的访问权限
文字设定法,数字设定法
文字设定
chmod [ugoa] [±=] [rwx] 文件名表
u–user 文件主的权限
g–group 同组用户的权限
o–other 其他用户权限
a–all 所有上述三级权限
r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
w(Write,写入):对文件而言,具有新增,修改,删除文件内容的权限;对目录来说,具有新建,删除,修改,移动目录内文件的权限。
x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
例:chmod 674 xyz1 xyz2
八进制: 6 7 4
二进制: 110 111 100
权限: rw- rwx r–
注: 只允许文件主和超级用户修改文件权限
用vi新建文件
用输出重定向创建文件
创建新目录
umask是进程属性的一部分
umask是shell内部命令
umask是进程属性的一部分
命令
umask 打印当前的umask值
umask 022 将umask值设置为八进制的022
普通文件:rw权限受影响,初始权限中无x权限
目录文件:rwx权限均受掩码值影响
例:掩码值: 022
二进制: 000010010
普通文件: rw-r–r--
目录: rwxr-xr-x
所有Linux系统都会内置vi文本编译器,其他的工具不一定会存在.
很多软件的接口会主动call vim
vim具备程序编辑能力,程序简单,速度相当快.
图片网盘链接:
链接:https://pan.baidu.com/s/1gT59cdO_HqXQp8dvvSGgzw 密码:79m3
gcc是由GNU开发的编程语言编辑器,包括C,Cpp,object-c,fortrran,java,ada,golang.
gcc [option] [filename]
编写代码:创建test.c ,并写入(此时代码包含错误):
#include
void main(){
scanf(“%d”, a);
printf(“a = %d\n”, a);
}
输入:编写的文件*.c
输出:中间文件*.i
命令:
gcc -E test.c -o test.i
提示错误
头文件不对
输入:中间文件*.i
输出:汇编语言文件*.s
功能:检查语法错误
命令:
gcc -S test.i -o test.s
提示错误
输入:汇编语言文件*.s
输出:二进制机器码*.o
命令:
gcc -c test.s -o test.o
选项-c:使编译器完成汇编阶段就停止
输入:二进制机器代码文件*.o
输出:可执行的二进制文件
命令:
gcc test.o -o test
运行./test即可执行程序
gcc [编译文件] -o [目标文件]
gcc test.c -o test
gcc other1.c other2.c app.c -o app
但我们更倾向于通过增加头文件的方式来进行多文件编译.
1. 库:事先已经编译好的代码,经过编译后可以直接调用的文件,本质上来说是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
2. 系统提供的库的路径
/usr/lib
/usr/lib64
3.Linux库文件名的组成
前缀(lib)+库名+后缀(.a静态库;.so动态库)
libmm.a:库名为mm的静态库;
libnn.so:库名为nn的动态库。
静态库与动态库
载入的顺序是不一样的
(1)静态库的代码在编译时就拷贝到应用程序中,因此当有多个程序同时引用一个静态库函数时,内存中将会调用函数的多个副本。由于是完全拷贝,因此一旦连接成功,静态库就不再需要了,代码体积大。
(2)动态库在程序内留下一个标记,指明当程序执行时,首先必须要载入这些库。在程序开始运行后调用库函数时才被载入,被调用函数在内存中只有一个副本,代码体积小。
静态库创建步骤
静态库的使用
编译文件
gcc -o app app.c -L./ -lother1 -lother2
采用标准文件模式
将编译得到的二进制文件拷贝到其他主机,程序可以运行.
动态库的创建步骤
gcc -fPIC *.c -I …/include -c
创建动态库
gcc -shared -o libtest0x00.so *.o
动态库的使用
相对路径
gcc app.c -I include ./lib/libtest0x00.so -o app
解决找不到路径的方法
更新LD_LIBRARY_path = 临时作用
配置环境变量
将动态库拷贝至usr/lib
将动态库的绝对路径写入/etc/ld.so.conf文件
使用ldconfig命令更新
gdb是GNU开源组织发布的一个用于Unix/Linux的程序调试工具。与其它调试器一样,gdb可以在程序中设置断点、查看变量值,跟踪程序执行的过程。利用调试器的这些功能可以方便地找出程序中存在的非语法错误。
编译并运行该程序
gcc -g test.c -o test
gdb的启动和退出
启动:
gdb [程序名]
gdb test
gdb --quiet
(gdb)file test
退出
(gdb)quit
gdb的help命令
list: 输出从上次调用list命令开始向后的10行程序代码**
list -: 输****出从上次调用list命令处向前10行代码
list n: 输出n行附近的10行代码
list [函数名]: 输出函数附近的10行代码
list n1,n2: 显示第n1行到n2行的代码
2.搜索字符串
forward/search [字符串]: 从当前位置向后查找指定的字符串所在的程序行,查找时不包括当前行,可以用list n,n将当前行设置为n
reverse-search [字符串]: 从当前行向前查找第一个匹配的字符串
在shell环境下使用gdb test,或在gdb环境下使用file test只是载入了程序,但是程序是没有运行的
(gdb)run
设置断点
以行数设置断点,格式: break n
功能: 当程序运行到指定行时,会暂停执行,指定行的代码不执行
以函数设置断点
格式: break [函数名]
以条件表达式设置断点
格式: break [行号或函数名] if [条件]
功能: 程序在运行过程中,满足设定条件时,程序在所设置处中断
含义: 当程序执行到第7行时,判断条件i==99是否成立,若成立则中断
以条件表达式变化设置断点
格式: watch [条件表达式]
功能: 程序在运行过程中,当满足设定条件时,程序中断
注意:watch必须在程序运行的过程中设置观察点,即运行run之后,并且要保证条件表达式中的变量已经使用过。
调试器gdb的使用
查看断点
查看当前设置的断点
格式: info breakpoints
管理断点
使中断失效或有效
失效: disable [断点编号]
有效: enable [断点编号]
删除断点
clear [行号]: 删除此行的断点
delete [断点编号]: 删除指定编号的断点, 若有一次删除多个断点,各断点编号以空格分开。
delete: 删除程序中所有的断点
查看和设置变量的值
当程序执行到中断点暂停时,往往需要查看变量或表达式的值,借此了解程序的执行状态,进而发现问题。
print命令
功能: 打印变量或表达式的值,还可以用来对某个变量进行赋值。
print [变量或表达式]: 打印变量或表达式的值
print [变量]=[值]: 对变量进行赋值
whatis
功能: 用于显示某个变量或表达式的数据类型
格式: whatis [变量或表达式]
set
功能: 给变量赋值
格式: set variable [变量]=[值]
控制程序的执行
当程序执行到指定的中断点时,完成相关的debug操作后,可以让程序继续运行
continue
程序继续运行,直到下一个断点或运行完毕
kill
结束当前程序的调试
next/step
功能: 一次一条执行程序代码
区别: next把函数调用当做一条语句来执行;step追踪进入函数,一次一条地执行内部代码。
代码编程可执行文件,叫做编译(compile);在一个项目中,先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。make是最常用的构建工具,诞生于1977年,主要用于C语言想项目。实际上,任何只要某个文件发生变化,就要重现构建的项目都可以用make构建。
make: 制作。比如,要做出文件a.txt,就可以执行:
$ make a.txt
make本身不知道如何做出a.txt,需要告知make如何调用其它命令完成这个目标。比如,假设文件a.txt依赖于b.txt和c.txt,是后面两个文件连接(cat命令)的产物。那么,make需要知道下面的规则:
a.txt: b.txt c.txt
cat b.txt c.txt > a.txt
也就是,make a.txt这条命令的背后实际分为两步:确认b.txt和c.txt必须已经存在;使用cat命令将两个文件进行合并,输出为新的文件。像这样的规则,需要写在一个名为Makefile的文件中,make命令依赖这个文件进行构建。Makefile也可以写成makefile,或者用命令行参数指定为其它文件名:
$ make -f rules.txt
$ make --file=rules.txt
make只是一个根据指定的Shell命令进行构建的工具。
Makefile文件由一系列规则构成。每条规则的形式如下:
**[tab] **
目标: 前置条件
[必须有个table键] <命令>
“目标”是必须的;“前置条件”和“命令”是可选的,但两者必存其一。明确:构建目标的前置条件是什么,以及如何构建。
一个目标(target)构成一个规则。目标通常是文件名,指明命令所要构建的对象,比如a.txt。
目标可以是一个文件名,也可以是多个文件名,之间用空格分隔。
除了文件名,目标还可以是某个操作的名字,这称之为“伪目标”(phony target)。
clean:
rm *.o
上面代码的目标是clean,不是一个文件名,是一个操作的名字,属于“伪目标”,作用是删除文件。
$ make clean
为了避免这种情况,可以声明clean是“伪目标”:
.PHONY: clean
clean:
rm *.o
声明clean是“伪目标”之后,make不会去检查是否存在一个叫做clean的文件,而是每次运行都执行对应的命令。如果make命令运行时没有指定目标,默认会执行Makefile文件的第一个目标。
前置条件通常是一组文件名,之间用空格分隔。它指定了“目标”是否重新构建的判断标准: 只要一个前置文件不存在,或者更新过,“目标”就需要重新构建。
result.txt: source.txt
cp source.txt result.txt
构建result.txt的前置条件时source.txt。如果当前路径下,source.txt已经存在,那么make result.txt可以正常运行;否则必须再写一条规则,用以生成source.txt。
source.txt:
echo “this is the source” > source.txt
source.txt没有前置条件,意味着跟其它文件无关,只要source.txt不存在,每次调用make source.txt,都会生成source.txt。
连续执行两次make result.txt。
第一次会先创建source.txt,再创建result.txt。
第二次执行,make发现source.txt没有更新,就会不执行任何操作。
命令(command)表示如何更新目标文件,由一行或多行Shell命令组成;
是构建“目标”的具体指令;
结果通常是生成目标文件。
每行命令之前必须有一个tab键。如果想用其它键,可以用内置变量.RECIPEPREFIX声明。
.RECIPEPREFIX=>
all:
>echo 123
用.RECIPEPREFIX指定大于号(>)替代tab键。
每行命令都是在一个单独运行的Shell中执行的,这些Shell间没有继承关系。
每个Linux用户至少会取得两个ID
使用者ID : UserID
组群ID :GroupID
/etc/passwd和/etc/group中找到UID/GID对应的账号
登录系统,利用tty1~tty6的终端,输入账号密码
/etc/passwd文件结构
/etc/shadow文件结构
useradd 建立账户
passwd 设置密码
chage 列出详细的密码参数
usermod 账号数据微调
userdel 删除用户
su命令 身份切换
sudo