Linux操作系统笔记(超详细)

【历史文章】
Ubuntu在进行更新系统时出现Hash校验和不符的问题
Linux常用的命令总结(一)——ls命令与cd命令
Linux命令(二)mkdir命令与rmdir命令
Linux命令(三)touch命令与rm命令
Linux常用命令(四)——cp、mv、ln命令
Linux常用命令(五)——hostname、ping、host命令


一、Linux安装

在这里插入图片描述
VirualBox安装过程:

  • VirualBox默认安装

Ubuntu安装:

打开VirualBox新建

取名字,选择Linux Ubuntu64

设置虚拟内存1024

创建虚拟硬盘——>VDI——>固定大小——>选择文件的位置(不要再C盘)——>分配10G以上——>创建

设置——>光驱放在最前面——>存储——>盘片——>选择虚拟的文件

注:关于上面安装使用的VirualBox与Ubuntu安装包获取,可以私信+回复【Linux安装包】来获取。

二、Linux操作系统介绍

课程介绍

Linux操作系统及其应用

LINUX的基础使用:图形工作界面、字符工作界面、目录、文件、帮助文档、管理工具

LINUX的基本命令:文件操作命令、显示命令、网络命令、系统状态显示命令

磁盘和文件系统:LINUX文件系统的管理和维护

多用户和多任务管理:概念、磁盘配额、文件和目录的操作权限、进程

shell简易编程:概念、功能、编程

嵌入式LINUX及编程:嵌入式开发、编辑器VI、编译器GCC、调试器GDB、工程管理器make

网络基础

Unix\LINUX环境C语言,借助学习操作系统的接口的方法,来学习、理解操作系统的运行机制以及一些网络协议

C/C++ 数据结构与算法 与平台无关,重点是算法逻辑

Unix\Linux\Android\iOS 平台相关,系统接口

嵌入式\驱动\移植 硬件相关,硬件接口

一、Linux操作系统概述

1、Unix操作系统

​ 丹尼斯.里奇、肯.汤普逊于1971年左右在美国的贝尔实验室,使用C语言开发了这套操作系统

​ 系统特点是多用户、多任务,支持多种处理器架构,高安全性、高可靠性、高稳定性

​ 既可以构建大型关键业务系统的商用服务器,也可以构建面向移动终端的、手持设备等相关的嵌入式设备

​ 三大衍生版本:

​ System V:银行、电信公司在使用的服务器系统

​ Berkley:MacOS、iOS带界面的

​ Hybrid:Minix、Linux

2、什么是Linux操作系统

​ 类Unix操作系统,免费开源,它指的是系统的内核,凡是使用这种内核的操作系统都叫做Linux操作系统(发行版),严格意义上讲Linux指的是内核,隶属于GNU工程。

​ 手机、平板电脑、路由器、游戏视频的控制平台、PC、大型计算机、超级计算机

​ 标志是一只企鹅,企鹅是南极洲的标志性动物,南极洲不属于任何一个国家所有

​ Linux选择企鹅作为标志,表明了:开源的Linux,为全人类所共有的,任何公司无权将其私有

3、为什么使用Linux

4、Linux的特点

  • 遵循GNU\GPL,具备开放性
  • 多用户
  • 多任务
  • 良好的用户界面
  • 设备独立性
  • 丰富的网络功能
  • 可靠的系统安全
  • 良好的可移植性

5、Linux系统的组成

​ Linux一般由内核、shell、文件结构、实用工具4个主要部分组成。内核是所有的组成部分中最基础、最重要的部分。

  • 内核:内核是整个操作系统的核心,负责管理整个计算机的软硬件资源
  • shell:提供了用户与内核进行交互操作的一种接口,一种命令解释器
  • 文件结构:文件存放在磁盘等储存设备上的组织方式
  • 实用工具:
    • 编辑器:用于编辑文件
    • 过滤器:用于接收数据并过滤数据
    • 交互程序:用户与机器的信息接口

6、相关知识

  • GNU工程

    GNU的原则是共享,主旨是发展一个有别于一切商用Unix系统的,免费的且完整的类Unix系统——GNU’s Not Unix

    目前Linux内核由GNU维护,所以Linux也叫做GNU Linux

  • POSIX标准

    Portable Operating System Interface,统一的系统编程接口规范,它规定了操作系统以接口的形式,提供的名字、参数、返回值。

    Linux完全遵循POSIX标准

  • GPL通用公共许可证

    允许对某成果或者是派生成果的重用、复制和修改,对所有人都是自由的,但是不能声明做了原始工作,或者声明由他人所做。

  • Minix操作系统

    操作系统是一个微型的类Unix系统,免费开源,Linux之父就是参照这款操作系统,才写出了第一个版本的Linux内核

二、主要的Linux版本

1、早期版本:0.01,0.02,…0.99,1.0

2、旧计划:介于1.0到2.6之间,A.B.C

  • A:主版本号,内核大幅更新
  • B:次版本号,内核重大修改,奇数测试版、偶数稳定版
  • C:补丁序号,内核轻微修订

3、新计划:2003年发布2.6.0至今:-D-E

  • D:构建次数,反应是极其微小的更新
  • E:描述信息

4、发行版本

  • Ubuntu
  • Fedora
  • Debian
  • RedHat

三、Linux初步使用

3.1、字符工作界面和图形工作界面

  • 命令行界面CLI
  • 图形用户界面GUI

为什么使用字符工作方式?

Linux是一种类UNIX操作系统。在UNIX发展早期的时候,类UNIX操作系统根本没有图形工作界面,只有字符工作界面。

1、在字符操作方式下可以高效的完成所有的任务,尤其是系统管理工具。

2、远程登录后,进入的只能是字符工作界面。

3、由于使用字符工作界面不用启动图形工作环境,大大的节省系统资源开销。

进入字符工作方式的方法:

1、在图形工作界面下开启终端窗口,进入字符工作方式。

2、切换到字符工作界面进入了字符工作方式。

3、使用远程登录方式进入字符工作方式。

3.1.1、Linux的运行级别以及切换

Linux系统在任何时候都要运行在一个指定的运行级上,并且不同的运行级别的程序和服务都不同,所要完成的工作和达到的目的也就不同。

  • 级别0 直接关机

所有的进程将被终止,机器将有序停止,关机时系统处于该级别。系统默认运行级别不能设置为0。

  • 级别1 单用户模式

一般用于系统维护,只有少数进程运行,服务不启动,禁止远程登录,类似于Windows下的安全启动模式登录

  • 级别2 多用户离线模式

与级别3一样,只是NFS(网络文件系统)没有启动,相当于离线的多用户系统

  • 级别3 多用户文本模式

允许多用户登录系统,有NFS,登录后进入控制台命令行模式

  • 级别4 系统保留模式(不可选)

保留,一般不使用,留给用户自定义的运行级别

  • 级别5 图形模式(如果有的话)

登录后进入图形GUI模式

  • 级别6 不断重启模式

所有进程被终止,系统重启

查看当前系统的运行级:   runlevel
切换运行级命令:  init N(0123456)
需要sudo获取权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1hRtT7B-1591956045109)(C:\Users\201781~1\AppData\Local\Temp\1584685298098.png)]

3.1.2在字符界面下工作

虚拟控制台

Linux系统提供多个虚拟控制台(默认七个),每个控制台都可以独立使用,互不影响。

如果系统在图形下启动,那么可以使用Ctrl+Alt+F1~F6来切换到不同的字符界面的虚拟控制台。

如果系统在字符界面下启动,那么可以使用Alt+F1-F6进行多个字符界面虚拟控制台的切换。

字符界面比图形界面效率高的原因:

3.1.3在图形界面下工作

Ctrl+Alt+F7切换到图形界面的虚拟控制台。

3.2、Linux的基本使用

3.2.1 目录、文件和设备

Windows有一个个的驱动器盘符,每个盘符都有自己的根目录结构,形成了多个树并行的结构。

Linux管理硬盘能力非常强,因此不需要显示地分区,也就是没有盘符。

Linux把所有的文件都管理在根目录下 /

整个文件系统是以树形结构管理(倒悬树)的可以上下进入,但是不能左右进入。

bin 目录下存储了一些常用的系统命令。
sbin 目录下存储的是一些管理用户才能使用的高级命令。
boot 目录存储的是系统启动需要的数据,一旦该目录下的文件被破坏,无法正常启动系统。
dev  目录存储的是硬件设备文件,包含,鼠标、键盘、硬盘等。
etc目录下存储的是操作系统的各种配置文件。
home  目录下存储的是用户主目录,每个用户对自己的主目录有绝对的控制权。
lib 目录下存储的是库文件(代码库、以.so或者.a结尾的文件。)
media  目录下存储的是多媒体设备,例如光盘、U盘、共享文件夹。
mnt 目录下以挂载的方式呈现一些目录,比如U盘等。
opt 目录下安装一些常用的软件。
proc 目录下存储了各个进程的临时文件和数据,记录了系统运行的绝大部分性能信息和参数信息。
root  目录下存储了超级用户的相关文件。
sys  存储了系统中的设备和文件夹层次结构,系统信息。
usr和用户

3.2.2命令格式和通配符

Linux系统的命令提示符:  wst@wst-VirtualBox:~$  
wst:当前的登录用户
@:分割符号
wst-VirtualBox:当前系统的简写主机名
~:代表用户所在的目录,此处代表家目录
$:用户权限等级,超级用户:#  普通用户:$
一般格式   :命令 [选项][参数]

例如:

ls      
ls -l /home/wst 参数是命令的操作对象、目录、用户、进程等。

注:若后面没有选项和参数,一般会有默认值。

通配符:

*  :代表任意多个字符。
? :代表一个字符。
rm * :删除当前目录下的所有文件。

3.2.3获取帮助和文档

帮助手册 :  man  n  关键字
n  :表示章节号

可以查: 系统命令、系统函数、标准库函数

q键: 退出

3.2.4修改默认运行级别

默认 :/etc/init/rc-sysinit.conf :需要用vim打开rc-sysinit.conf 文件

进去后,发现 这行 env DEFAULT RUNLEVEL=2 :本行表示设置默认允许级别为2

3.2.5最基本的安全问题

  • 获取管理员权限:sudo
  • 修改用户密码: sudo password 用户名
  • 切换到指定用户: sudo 用户名
  • 文件权限修改:chmod

3.3、Linux环境下的管理工具

3.3.1、字符下面的管理工具

版本 后端 前端

Debian、Ubuntu等 DPT管理器 DEB软件包管理工具dpkg-deb/apt-get

ReHat RPM管理器 rpm

DEB 软件包管理工具

1、本地管理:dpkg命令

2、在线安装:apt类命令

更新软件源: sudo apt-get update
更新操作系统:  sudo apt-get  upgrade
安装软件:  sudo  apt-get  install  软件名
卸载软件: sudo  apt-get  remove 软件名

3.3.2、图形界面下的管理工具

1、Ubuntu软件中心

2、更新管理器

3、系统设置

3.3.3、基于WEB界面下的管理工具

pyDash

四、Linux的一些基本命令

4.1、文件和目录操作命令

Linux系统中,文件和目录的命名规则

  • 除了/之外,所有字符都可以使用。但是使用某些特殊字符容易出问题,尽量避免。
  • 目录名或者文件名不能超过255个字符。
  • 目录名或文件名是区分大小写的。
  • 文件的扩展名对Linux系统来说,没有特殊的含义。
1) cd /    :回到根目录
(2) clear   :清屏
(3)ls -l    :查看当前目录下所有文件和目录各种属性,每一行第一个字符表示的就是文件类型。
- 普通文件,包括了纯文本文件,二进制文件,各种压缩文件
d 目录
b 块设备文件
c 字符设备文件,例如键盘,鼠标
s 套接字文件,通常用于网络数据连接
p 管道文件
l 链接文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Epynf1zW-1591956045112)(C:\Users\201781~1\AppData\Local\Temp\1585293217206.png)]

4.1.1、pwd与cd命令

1)pwd [OPTION] ... :显示当前路径。
参数:-L 目录连接链接时,输出连接的路径。
参数:-p 输出物理路径
(2)cd [相对路径或者绝对路径]  :切换路径
cd /  :回到根目录
cd ..  :回到上级目录
cd    :切换到当前用户的主目录
cd ~  :切换到当前用户的主目录
cd -   :切换到上次所在的目录

ls命令:

ls -a  :显示全部的文件,包括隐藏文件(开头.文件)
ls  -A  :-a一样,不显示...两个目录
ls  -d   :只列出目录本身,而不列出
ls  -F   :显示的目录文件名之后加一个斜线(“/”)字符
ls  -l   :使用长格式列出文件和目录信息。
ls   -R  :连同子目录内容一起列出来
ls  -S :以文件大小排序列出。
ls  -t :以时间排序列出。

4.1.2、mkdir与rmdir命令

https://blog.csdn.net/weixin_43759352/article/details/105157844

4.1.3、touch命令

https://blog.csdn.net/weixin_43759352/article/details/105161279

4.1.4、cp命令、rm命令、mv命令、ln命令

https://blog.csdn.net/weixin_43759352/article/details/105161279

4.2、显示命令

4.2.1、cat、more和less

cat:连接文件并打印输出到标准输出设备
more:分屏显示文件内容
less:查看文件内容,功能更加丰富

4.2.2、head和tail

head:显示文件开头内容
tail:显示文件结尾内容

​ 选项:

​ -n K:显示开头或结尾K行内容

​ -c K:显示开头或结尾K个字节的内容

4.2.3、file、locate和which

file:查看文件信息或类型

​ 选项:

​ -i:输出文件的MIME类型字符串

locate:查找文件或目录
举例:
locate /etc/k     查找/etc目录下以k开头的文件
locate pwd        查找和pwd相关的所有文件
which:列出命令的所在路径

4.3、网络命令

4.3.1、hostname、ping和host

hostname命令:用于显示或设置系统主机名
ping命令:测试与目标主机的连通性
  • Linux:会一直发送数据包,ctrl+c结束

  • windows:只发送4次, 加/t 可以一直发送

host命令:域名查询工具。

例如: host www.baidu.com

4.3.2、ifconfig:显示或者设置网络配置信息。

sudo ifconfig eth0 up(开启)/down(关闭)

注意:

  • ssh登录Linux的远程服务器时,关闭网卡要千万小心,除非有多块网卡。

  • 使用ifconfig命令配置网络信息,当机器重启或者网卡重启,都会让配置失效。

windows使用ipconfig查看。

4.3.3、telent和ftp命令。

telent:远程登录命令。采用明文传送报文的方式,速度快,但是安全性不高,除了远程登录外,还可以确定远程服务器的状态。

ssh:安全的远程登录。

ssh 用户名@serverip: 数据加密、速度稍慢、但安全性高。

ftp: 登录ftp服务器

登录格式:  ftp 域名或者serverip

4.3.4、wall、write和mesg命令。

wall:发送广播信息。用于向系统当前所有打开的终端,输出信息。

1、输入wall 回车

2、输入要广播的内容

3、CTRL+D结束

write:用于发送信息给其他使用者。可以指定用户发送信息、如果用户有多个终端在线,还可以指定某个终端。

write 用户名[用户的终端名pts/123。。。]

发送完毕:CTRL+C结束

mesg命令:用户设置终端机的信息写入权限。

mesg y:其他用户可以利用write来把信息直接显示到自己终端上

mesg n:不允许用户可以利用write来把信息直接显示到自己终端上

4.3.5、finger命令。

查询用户的资料。

4.3.6、netstat

显示网络的状态

  • netstat -a:显示详细的网络状态
  • netstat -nu:显示当前用户的udp的连接状况
  • netstat -apu ;显示端口号的使用情况
  • netstat -i:显示网卡列表

4.4、系统状态显示命令

4.4.1、stat命令

用于显示inode内容,以文字格式显示。

stat text.txt

4.4.2、who、whoami、

who:显示系统中哪些使用者正在使用

uname:显示系统信息

4.4.3、clear 清屏

CTRL+L一样的可以清屏。

五、磁盘和文件系统

5.1、磁盘与磁盘分区

5.1.1、磁盘简介

5.1.1.1、机械硬盘(HDD)

机械硬盘的逻辑结构

磁道:盘片表面以盘面中心为圆心,半径不同的同心圆成为磁道。

扇区:主要是存储数据地点的标识符和存储数据的数据段。每个扇区大小固定,一般为512B、扇区也是磁盘的最小储存单位。

柱面:不同的盘片,相同的磁道从上而下的圆柱区域称为柱面。

磁盘大小:磁头数柱面数扇区数*每个扇区的大小

机械硬盘的接口(磁盘类型)

  • IDE接口的硬盘(ATA、PATA)

    价格低、兼容性强、性价比高、速度慢、线缆长度短、连接设备少,不支持热插拔

  • SATA接口的硬盘

    又叫串口硬盘、速度更快、纠错能力强、安全性高

  • SCSI接口的硬盘

    广泛用于服务器上,可以多任务、带宽大、价格高

  • SAS接口的硬盘

    其实是串行的SCSI、一般用于高端的服务器。

5.1.1.2、固态硬盘(SSD)

5.1.2磁盘分区

磁盘设备在Linux下的表达方式

主设备号+次设备号+磁盘分区号

sd[a-z]x

查询命令所有磁盘设备文件     ls /dev/sd*
执行上面的命令,显示结果:  /dev/sda  /dev/sda1  /dev/sda2  /dev/sda5  /dev/sdb  /dev/sdb1

磁盘分区

MBR【主引导记录】和主分区

MBR:放置硬盘的信息区,一般有512B,分为两个部分:

1、466字节,放置引导代码,也就bootloder

2、64个字节,用于存放磁盘分区表

主分区:用来启动操作系统,一般最好把MBR放置在主分区

扩展分区和逻辑分区

主分区最大数为4,扩展分区也属于主分区,并且最多只能有一个扩展分区

主分区可以马上使用,但不能再分区,扩展分区必须进行分区后才能使用,也就是划分为逻辑分区才可以使用。

Linux规定:逻辑分区必须是建立在扩展分区上。

实际上只有主分区和逻辑分区是用来存储数据的。

sudo fdisk -l
   设备 启动      起点          终点     块数   Id  系统
/dev/sda1   *        2048    39845887    19921920   83  Linux
/dev/sda2        39847934    41940991     1046529    5  扩展
/dev/sda5        39847936    41940991     1046528   82  Linux 交换 / Solaris

创建磁盘分区的目的

  • 1、提升数据的安全性。

  • 2、支持安装多个操作系统。

  • 3、多个小分区对比一个大分区有性能上的提升。

  • 4、有更好的组织数据。

5.2、Linux的文件系统

5.2.1、Linux的文件系统

各个操作系统使用的文件系统并不相同,例如,WIN98用的FAT,WIn2000后使用NTFS,Linux使用EXT系列

df -T -h  //-h显示换算单位方便查看,-T显示文件系统类型

一般文件系统会将文件的实际内容和属性分开存放:

1、文件属性存放在inode中(节点块)

2、文件的实际数据保存在block中(数据块)

3、还有一个超级块,用于记录整个文件系统的整体信息

这类管理文件的系统称为索引式文件系统,(EXT系列都是索引式文件系统)

5.2.2、文件系统类型简介

1、jffs2

最早基于Linux2.0的内核,并且为嵌入式系统开发的文件系统。

2、yaffs

yaffs/yaffs2专门为嵌入式系统使用的一种文件系统。

3、Cramfs

一款只读的压缩文件系统。

4、Romfs

传统型的Romfs文件系统是一种简单的、紧凑的、只读的文件系统。

5.2.3、使用Linux文件系统的一般方法

touch 文件名  创建文件
rm  文件名    删除文件、不经过回收站
cp  源文件(位置+文件名) 目标位置+新文件名
mv  源文件(位置+文件名) 目标位置+新文件名
注意:使用cp、mv如果目标位置有同名文件则会覆盖

more 文件名    显示文件开头内容 q退出
cat  文件名    显示文件的所有内容
head 文件名    只显示文件的开头
tail 文件名    只显示文件的末尾

mkdir  目录名  创建目录
rmdir  空目录名  删除空目录

5.3、文件系统的管理和维护

5.3.1、文件系统操作

1、列出文件系统的整体磁盘使用量——df:评估了文件系统的磁盘使用量,包括文件系统所在硬盘分区的总容量、已使用的容量、剩余容量。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0DEpbuW-1591956045114)(D:\typora\File\Linux学习笔记image\Snipaste_2020-04-17_14-13-12.png)]

2、统计目录或文件所占磁盘空间大小——du

du  参数 文件名或目录名
  • -h:使用习惯的单位显示磁盘占有量
  • -s:只显示当前目录的磁盘占有量,不列出子目录和文件的占用量
举例:
创建一个wst的空文件夹
用命令:du  -h  wst
显示
4.0K	wst

3、连接文件——ln

5.3.2、维护文件系统的卷标

卷标就是一个磁盘的标识、不唯一

不同的文件系统的卷标管理工具:

  • 对于ext2/3/4类型的文件系统使用:e2label

  • 对于ntfs类型的文件系统使用:ntfsprogs

  • 对于FAT类型的文件系统:mtools

如何设置文件系统的磁盘卷标名:

1、显示/dev/sda1块设备的卷标名

sudo e2label /dev/sda1

2、设置卷标名disk1

sudo e2label /dev/sda1  /disk1

5.3.3、挂载文件系统

1、fdisk命令创建分区(主分区、逻辑分区)

sudo fdisk /dev/sda
n 新建分区
   p  主分区
   e  扩展分区
   l  逻辑分区
p 显示当前分区
d 删除分区
q 不保存退出
w 保存并退出  慎重使用

2、格式化分区——创建文件系统

分区完成后、如果不格式化写入文件系统,则不能正常使用,此时需要mkfs命令对磁盘分区进行格式化

sudo mkfs -t 文件系统类型 -c  分区设备号
-t:指定文件系统类型
-c:建立文件系统前先检测有无坏块

3、挂载文件系统

挂载:将硬盘设备的文件系统和Linux系统中的文件系统,通过指定的目录(作为挂载点)进行关联

mount 【参数】【分区设备名】 【挂载点】
举例:
  sudo mount ext3 /dev/sda3  /media/sda3

4、卸载文件系统

sudo umount <分区设备名或者是挂载点>
sudo umount /dev/sda3  (/media/sda3)

5.3.4、使用可移动储存设备

1、光盘

建立挂载点
sudo mkdir /mnt/cdrom
挂载光盘
sudo mount /mnt/cdrom
卸载
sudo umount /mnt/cdrom

2、U盘

1、先查看u盘的分区设备名
sudo fdisk -l
2、创建挂载点
sudo mkdir /mnt/usb
3、挂载u盘
sudo mount -t  vfat -o iocharset=utf8 u盘的分区设备名  /mnt/usb

5.3.5、在系统启动时自动挂载文件系统

六、多用户和多任务管理

6.1、多用户概述

6.1.1、基本概念

  • 用户:不同的用户具备不同的权限,每个用户在权限允许范围内完成不同的任务,Linux利用了这种权限的划分和管理,实现了多用户多任务的运行机制。
  • 用户组:用户组是具有相同特征用户的逻辑集合。

Linux用户与用户组的关系:

  • 一对一关系:一个用户存在与一个组中,是组中的唯一成员。
  • 一对多关系:一个用户可以存在多个用户组中,此用户具有多个组的权限。
  • 多对一关系:多个用户存在于一个组中,这些用户就具有和组相同的权限
  • 多对多关系:多个用户存在于多个组中。

Linux的UID和GID(用户ID和组ID)

Linux系统中,每个用户两种ID号,用户ID(UID),组ID(GID)

6.1.2、账号的系统文件

1、/etc/passwd文件:系统用户配置文件,存储了系统中所有的用户的基本信息,并且所有用户都可以对此文件进行读操作。

vim /etc/passwd 以只读的方式打开passwd文件
退出:ZZ

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9l3CGYJG-1591956045115)(D:\typora\File\Linux学习笔记image\Snipaste_2020-04-24_14-08-28.png)]

用户名 :密码 :UID :GID :描述信息 :用户的主目录 :默认的Shell
  • 用户名:就是一串能代表用户身份的字符串。

  • 密码:“X”表示此用户设有密码,但不是真正的密码,真正的密码保存在/etc/shadow文件中。

  • UID:每个用户都有唯一的一个UID,范围:0~65535。

    0:表示超级用户

    1~999:表示系统用户(伪用户)

    1000~65535:普通用户。

  • GID:表示用户的初始组的组ID。

    初始组:指的是用户登录时就拥有这个组的相关权限,每个用户的初始组只能有一个。

    附加组:指用户可以加入多个其他的用户组,并拥有这些组的共同权限。

  • 描述性信息:只是用于解释这个用户的意义而已。

  • 默认的Shell:Shell是Linux的命令解释器,可以理解成用户登录后拥有的权限。

2、etc/shadow文件(影子文件):用于储存Linux系统中用户的密码信息。

sudo vim /etc/shadow
用户名:加密密码:密码最后一次修改时间:最小的修改时间间隔:密码有效期:密码有效期截至前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段
  • 加密密码:这里保存的是真正加密后的密码
  • 密码最后一次修改时间:密码最后修改的时间与1970年1月1日相隔几天
date -d "1970-01-01 18326 days"//换算天数与日期
  • 最小的修改时间间隔:最后一次修改密码日起,几天内不能修改密码,0表示随时可以修改

  • 密码有效期:默认99999,亦可以认为是永久生效

  • 密码有效期截至前的警告天数:提前几天警告

  • 密码过期后的宽限时间:0:立即失效 -1:永不失效

  • 账号失效时间:如果规定了此时间,无论密码是否失效,到期后,帐号都无法使用,以1970.1.1为基准

  • 保留字段:目前还没有使用

3、/etc/group文件:用户组配置文件,所有的用户组的所有信息都在此文件中

组名:组密码:GID:该用户组中的用户列表
  • 组名:描述组名称的一串字符串,不能重复

  • 组密码:“x”表示有组密码,真正的加密后的组密码保存在/etc/gshadow中

  • GID:该用户组中的用户列表:显示所有用户(附加用户)

4、/etc/gshadow文件:储存组用户的组密码信息

组名:加密密码:组管理员:组附加用户列表

6.2、账号管理

6.2.1、用户账号管理

1、useradd命令:添加新的系统用户。

useradd 【选项】 用户名

创建用户账号的默认值可以通过:useradd -D 来查看。

修改:

2、passwd命令:修改用户密码

passwd [选项] 用户名 //root用户

选项:

  • -S:查询用户密码的状态,只有root用户能使用
  • -l:暂时锁定用户
  • -u:解锁用户

3、chage命令:修改用户密码状态

chage [选项]	用户名

选项:

  • -l:列出用户的详细密码信息
  • -d 日期:修改最后一次修改密码的日期

4、userdel命令:删除用户

userdel [选项] 用户名

选项:

  • -r:删除用户并且删除用户家目录

6.2.2、组帐号管理

1、groupadd命令:添加用户组
groupadd [选项] 组名
2、groupdel命令:删除用户组
3、gpasswd命令:把用户添加进组或者从组中删除
gpasswd [选项] 组名

选项:

  • -a user:将user加入组中
  • -d user:将user从组中移除
  • -M user1…:讲多个用户加入组中
  • -A user1…:设置用户管理员

4、newgrp命令:切换用户的有效组

newgrp 组名
1、创建一个有家目录,和shell为bash的用户user2
sudo useradd -g group1 -G group2,group3 -m -s /bin/bash user2 
2、给user2设置密码
passwd user2
3、切换到user2用户
su - user2
4、通过newgrp命令切换user2的有效组,并且创建文件
mkdir user1
newgrp group2
mkdir user2
newgrp group3
mkdir user3
ls -l

6.2.3、用户和组状态命令

1、usrmod命令:修改用户信息
2、groupmod命令:修改用户组

​ -g GID :修改组ID

​ -n 新组名: 修改组名:groupmod -n 新组名 旧组名

3、su命令:用户间切换

​ 从普通用户切换到root用户,从root用户切换到普通用户,以及普通用户之间切换

su [选项] 用户名

选项:

  • -:当前用户不仅切换为指定用户的身份,而且工作环境也切换了
  • -p:切换用户身份,但是不切换工作环境
  • -c:切换用户并且只执行一次命令,然后自动切换回来

4、id命令:查看用户的UID和GID

6.3、磁盘配额

6.3.1、磁盘配额概述

磁盘配额:Linux系统中用来限定特定的普通用户或者用户组在指定的分区上占用的磁盘空间或者文件个数。

1、磁盘配额限制普通用户和用户组,root用户不能做磁盘配额

2、磁盘配额只针对分区,不能针对目录

3、可以限制用户所占用的磁盘容量大小(block),还可以限制占用的文件数(inode)

安装quota命令:

sudo apt-get install quota

磁盘配额中的常见概念:

  • 用户配额和组配额
  • 磁盘容量限制和文件个数限制
  • 软限制和硬限制
  • 宽限时间

6.3.2、配置磁盘配额

1、设置挂载参数userquota和grpquota

创建一块虚拟硬盘:

关闭虚拟机->设置->储存->控制器SATA->添加虚拟硬盘->创建新的虚拟硬盘->VDI->固定大小->位置、名字、大小->创建

对sdb硬盘进行分区:

sudo fdisk /dev/sdb

格式化分区:

sudo mkfs -t ext3 -c /dev/sdb1

挂载分区:

sudo mount /dev/sdb1 /home/test

设置挂载参数

sudo mount -o remount,usrquota,grpquota /home/test
mount |grep sdb1
2、扫描文件系统并且建立Quota记录文件:quotacheck命令
quotacheck [-avugfM] 文件系统

一般只需要使用 quotacheck -avug

6.3.3、管理磁盘配额

1、开启磁盘配额限制(quotaon命令)
quotaon [-avug] 
quotaon [-uvg] 文件系统名称
2、关闭磁盘配额限制(quotaoff命令)

命令格式与quotaon相同

3、修改用户(群组)的磁盘配额(edquota命令)
edquota [-u 用户名] [-g 群组名]
edquota -t
edquota -p 源用户名 -u 新用户名
4、查看配额(quota)
sudo quota -uvs linux

6.4、设置文件和目录的操作权限

6.4.1、操作权限简介

查看文件或者目录的权限信息

ls -l
rwx(所有者权限) r-x (所属组权限)r-x(其他人权限)
  • rwx权限对文件的作用

      	r:表示可读取此文件的实际内容
    
      	w:表示文件可以被编辑
      
      	x:表示该文件具备被系统执行的权限
    
  • rwx权限对目录的作用

      	r:表示读取目录结构列表的权限:ls
    
      	w:对于目录,w权限是最高权限
      
      	x:表示用户可以进入目录:cd
    

6.4.2、更改文件和目录的操作权限

chmod命令通过数字修改文件权限

r --> 4
w --> 2
x --> 1
例如:rwx(所有者权限) r-x (所属组权限)r-x(其他人权限)
所有者:4+2+1 = 7
所属组:4+1   = 5
其他人:4+1   = 5
    对应的权限值  755
chmod [-R] 权限值 文件\目录名

chmod命令通过字母修改文件权限

chmod [u/g/o/a] [=(设定)/+(加入)/-(删除)] [r/w/x] 文件名

6.4.3、更改文件或目录的属主和所属组

chown [-R] 所有者:所属组 文件或目录

6.4.4、设置文件或目录的权限掩码

​ 默认情况下,创建一个文件的权限为“rw-r–r-- 目录:rwx r-x r-xr-x

​ umask:root用户默认0022,— -w- -w-普通用户默认0002 -------w

文件或者目录的初始权限 = 文件或目录的最大默认权限 - umask权限掩码
  • 对于文件而言,最大默认权限666 rw rw rw
  • 对于目录而已,最大默认权限777 rwx rwx rwx

umask 权限掩码

umask 权限掩码

6.5、多任务概述

6.5.1、基本概念

1、任务

通常一个任务就是程序的一次运行。

2、程序

程序是使用计算机语言编写的可以实现特定目标或者解决特定问题的代码集合

储存在磁盘上,包括指令和数据的实体

3、进程

就是运行中的程序

一个运行的程序,可能有多个进程,每个进程在过程中执行特定的任务

是程序执行和管理资源的最小单位

4、进程的分类

  • 交互进程:由shell启动的进程
  • 批处理进程:与终端无关,是一种进程序列,
  • 守护进程:也叫做监控进程,总是活跃的

5、查看进程

简单形式

PS

以简略的方式显示当前用户有控制终端的进程信息

  • BSD形式

ps axu

  • SVR4形式

ps -efl

6、父进程、子进程、孤儿进程、僵尸进程

父进程启动子进程后,子进程可以与父进程同时运行

子进程先于父进程结束,子进程向父进程发送信号,父进程回收子进程的相关资源

父进程先于子进程结束,子进程成为了孤儿进程,同时init进程收养,变成了init进程的子进程

子进程先于父进程结束,但是父进程没有回收子进程的资源,子进程就变成了僵尸进程

7、进程标识符(进程ID)

每个进程都有一个非负整数表示的唯一标识,PID

任何时候PID都是唯一的,但是可以重用,当一个进程退出的时候,其进程ID就可以被其它进程使用

延时重用

6.5.2、进程的启动方式

Linux手动启动进程

前台启动进程

后台启动进程:其实就是在命令的结尾处添加一个 & 符号

Linux调度启动进程:

​ 实现调度启动的方式:at、crontab命令

6.6、进程的管理

6.6.1、实时监听进程运行的状态——top命令

top [选项]
  • -d 秒数:间隔几秒更新
  • -n 次数:
  • -p 进程PID:仅查看指定ID的进程
  • -u 用户名:查看指定用户的进程

6.6.2、调整进程优先级——nice命令

修改NI值:

​ 1、NI范围-20~19

​ 2、普通用户调整的NI范围是0~19,而且只能调整自己进程

​ 3、普通用户只能调高NI值,不能降低

​ 4、只有root用户才能设定NI值为负数,并且可以调整任何一个用户的进程

nice:可以给要启动的进程赋予NI值,但是不能修改已启动的进程的NI值

renice命令:可以修改正在运行的进程的NI值

6.6.3、终止进程

kill [信号] PID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4e5XK5Mz-1591956045116)(D:\typora\File\Linux学习笔记image\Snipaste_2020-05-15_20-45-31.png)]

kill 2288//默认信号15
kill -9 2288//强制结束进程

七、Shell简易编程

7.1、Shell简介

7.1.1、Shell是什么

  • Shell也是一个应用程序,它连接了用户和Linux内核,让用户能够更高效,安全,低成本的使用Linux内核,这也是Shell的本质。

  • Shell也是一种脚本编程语言。


7.1.2、Shell能做什么

1、连接用户和内核

2、还能连接其他程序

3、Shell还支持编程

7.1.3、Shell怎样连接用户和内核

Shell是通过内核提供的接口函数,来实现用户与内核之间的交互

7.2、Shell的主要类型

常见的Shell有sh,bash,csh,ash,dash等

  • sh:sh是UNIX系统上标准的Shell,sh是第一个流行的Shell。
  • csh:csh的语法有点类似C语言,成为C Shell。
  • ash:一个简单的轻量级的Shell,占用的资源少。
  • bash:bash由GNU组织开发,保持了对sh shell的兼容,也是各种Linux发行版默认的配置的shell

查看Shell

当前系统可用的Shell都记录在/etc/shells文件中

cat /etc/shells

查看shell指向哪种解释器:

ls /bin/sh -l

如何切换sh的指向,指向到bash:

sudo dpkg-reconfigure dash

7.3、Shell命令

7.3.1、进入Shell的两种方式

1、进入Linux控制台

Ctrl+Alt+Fn(1、2、3…)

2、使用终端

7.3.2、Shell命令的基本格式

命令提示符:

wst@wst-VirtualBox:~$ 

基本格式:

command [选项][参数]

1、使用选项:ls -l

2、使用参数:参数就是命令的操作对象 ls -l /bin/sh

3、一起使用

7.3.3、Shell命令的本质

一个外部的应用程序是如何变成一个Shell命令的?

Shell在启动文件中增加了一个叫做PATH的环境变量,这个变量保存了Shell对外部命令的查找路径,如果找不到对应的文件名,则直接保错。

查看PATH环境变量的值:

echo $PATH

让应用程序编程内部命令:

  • gcc -std=c99 getsum.c
  • gcc -std=c99 -o getsum getsum.c
  • mv getsum ~/bin
  • get
  • getsum -s 1 -e 100

Shell的内置命令本质是一个自带的函数。

Shell的外部命令本质是一个应用程序,执行外部命令就是启动一个应用程序。

7.4、Shell的特殊字符

7.4.1、通配符

  • *:代表任意长度的字符串,例如:ls f *
  • ?:代表任意的单字符
  • []:代表指定的一个字符范围 ls f[abcd] ls f[a-d]
*Text*
[ab-df]*
[ab-dm]?
??    

7.4.2、引号

1、单引号

由单引号括起来的字符都作为普通字符出现,特殊字符被单引号括起来后,失去原有的意义。

echo '$PATH'
$PATH    

2、双引号

双引号属于弱引用,双引号内有命令、变量等,会先把变量、命令解析出来结果,然后输出最终结果。

echo "$PWD"
/home/wst

3、注释符

单行注释

直接在行的最前面加上#即可

多行注释

1、eof 截止符

:<<eof 注释代码 eof

举例:

echo "test"
echo "test"
echo "test"
:<<eof 
echo "test"
echo "test"
eof

2、感叹号

:<<! 注释代码 !

3、逗号

:,注释代码 ,

7.5、输入和输出

7.5.1、管道

将两个或者多个命令(程序、进程)连接在一起,把一个命令的输出作为下一个命令的输入

Linux下使用|连接多个命令,也成为管道符

command1 | command2 [|command3.....]

举例:

find  ~/  | grep "test"

7.5.2、重定向

改变默认的输出方式,可以由打印到屏幕改为写入文件

举例:

ls > test.txt
ls >> test.txt
在输出重定向中,>表示覆盖,>>表示追加

管道和重定向的区别

  • 重定向必须是由文件来接收输出
  • 管道可以由命令来接收输出

不能尝试:

command1 > command2 [|command3.....]

7.6、Shell编程

7.6.1、Shell基本语法

Shell变量

定义

变量名=value
变量名='value'
变量名="value"
注意:赋值号周围不能加空格

使用变量

只要在变量前加入$即可

删除变量

unset 变量名

7.6.2、Shell程序的控制结构语句

if 条件1  then    如果条件1为真,则执行
elif  条件2  then  2为真,则执行
else  12为假则执行
for  变量名  in  列表
do 
   命令
   
done

7.6.3、运行Shell程序的方式

1、直接执行./test.sh

需要给Shell程序用户的执行权限

 chmod u+x hello.sh
./test.sh

2、使用bash test.sh

3、使用. test.sh

执行方式 是否需要执行权限 是否以新进程运行脚本
./test.sh
bash test.sh
. test.sh

八、嵌入式Linux及编程

8.1、嵌入式系统概述

8.1.1、嵌入式系统的基本概念

什么是嵌入式系统?

嵌入式系统是以应用为中心,以现代计算机技术为基础,能够根据用户需求(功能、可靠性、成本、体积、功耗、环境等灵活裁剪软硬件模块的专用计算机系统。

8.1.2、嵌入式系统的体积结构

  • 硬件部分:
      	处理器、储存器、外部设备、I/O接口
    
  • 软件部分:
      	驱动层:是直接跟硬件打交道
    
      	操作系统层
      
      	中间件层
      
      	应用层
    

8.2、嵌入式开发

8.2.1、嵌入式系统开发概述

选择嵌入式处理器(硬件平台)-》选择嵌入式操作系统-》开发嵌入式应用软件 -》测试 -》系统测试 -》开发结束

​ 1、建立开发环境

​ 安装操作系统以及交叉编译器

​ 2、建立引导程序

​ 下载公开的源代码

​ 3、下载已经移植好的Linux操作系统内核

​ 4、建立根文件系统

​ 5、开发应用程序

8.2.2、嵌入式软件开发概述

  • 嵌入式开发的模式
      		A类机编写源代码,编译得到可执行程序,发布给B类机运行,这种编译模式叫做交叉编译
    
  • 非嵌入式开发模式
      		A类机编写源代码,编译得到可执行程序,发布给A类机运行
    
  • 为什么要用交叉编译
      		1、嵌入式的CPU简单,本身无法搭建开发环境,有些甚至连操作系统都没有
    
      		2、交叉编译可以让高性能的机器为低性能的机器开发软件
    

8.3、编辑器VI

8.3.1、VI的三种工作模式

  • 命令模式
      	使用vim编辑文件时,默认处于命令模式。
    
      	可以移动光标的位置,可以对文件内容进行复制、粘贴、删除
    
  • 输入模式
      	可以对文本进行写操作,可以使用i、I、a、A、o、O快捷键进入输入模式
    
      	当文件编辑完成后,按Esc可以返回命令模式
    
  • 编辑模式(末行模式)
      	用于对文本中的指定内容的保存、查找、替换等操作
    
      	使用编辑模式方法:在命令模式状态下按下 :  键,此时,编辑器末行出现 :符号,则进入了编辑模式,可以输入对应的操作指令了
      
      	退出编辑模式:按Esc
    

8.3.2、VI常用命令

  • vim打开文件
vim [选项] 文件名

​ 选项:

​ -R:以只读形式把文件放入vim编辑器中

​ +n:打开文件到第n行

​ +: 打开文件到最后一行

​ -r:恢复上次vim打开时崩溃的文件

  • vim删除文本
      	在命令模式下:
    
      	x:删除光标处字符
      
      	dd:删除光标所在行
      
      	ndd:删除当前行(包括当前)后n行
      
      	dG:删除当前行后所有内容
      
      	G:删除光标后所有内容
    
  • vim复制和粘贴文本
      	在命令模式下:	
    
      		yy:所在行复制到粘贴板,可以加n,复制多行
      
      		p:粘贴到当前行下一行
      
      		P:粘贴到当前行前一行
    
  • vim保存退出文本
      	在编辑模式下:
    
      		:wq 	保存并退出
      
      		:wq!	强制保存并退出
      
      		:q		不保存就退出
      
      		:q!		不保存,强制退出
      
      		:w
      
      		:w!
      
      		:w 文件名			
      
      	在命令模式下:
      
      		ZZ: 保存并退出
    
  • vim撤销和恢复
      	在命令模式下:
    
      	u:撤销最近一次对文本的修改操作
      
      	U:第一次会撤销对所在行的全部操作,第二次恢复对该行文本的所有操作
    

8.3.3、VI的高级应用

  • vim可视化模式
      	在命令模式下:
    
      	v:以字符为单位,进入可视化
      
      	V:以行为单位,进入可视化
      
      	ctrl+v:以区域为单位,进入可视化
    
  • vim多窗口编辑模式

    水平多窗口:

      		在命令模式下输入 :sp 文件名
      
      	垂直多窗口:
      
      		在命令模式下输入 :vs 文件名
      
      	切换窗口:ctrl + WW
    

8.4、编译器GCC

8.4.1、GCC的编译过程

编辑-》预处理-》编译-》汇编-》链接

​ 1、编辑: vim hello.c ->hello.c

​ 2、预处理: hello.c ->hello.i(预处理文件)

​ 3、编译: hello.i ->hello.s(汇编文件)

​ 4、汇编: hello.s ->hello.o(目标文件)

​ 5、链接: hello.o ->a.out(可执行文件)

8.4.2、GCC的基本用法和选项

1、生成可执行文件
gcc [选项] 源文件名

​ 得到默认名字为 a.out 的可执行文件

2、运行可执行文件
./a.out
3、GCC常用的选项

​ -E:只做预处理,不进行编译

​ -o 文件名:指定输出文件

​ -S:只编译,不汇编

​ -c:编译、汇编,而不链接,得到目标文件

​ -l:链接指定的文件

​ -g:生成调试信息

8.4.3、GCC的错误类型及其对策

1、C语法错误。

2、头文件错误。

3、段错误。

4、出现中文字符。

5、编译标准错误。

hello.c
#include<stdio.h>
int main(){
printf("hello");
for(int i=0;i<10;i++){
printf("i=%d\n",i);
}
return 0;
}
gcc -std=c99 hello.c && ./a.out

注:

for(int i=0;i<10;i++)  需要加-std=c99

CTRL+空格:切换输入法。

8.4.4、配置vim

vim的全局配置一般在/etc/vim/vimrc或者/etc/vimrc

个人用户的配置在~/.vimrc

  • 先输入冒号:

  • 打开行号:

set number
  • 关闭行号:
set nonumber
  • 查询是否开启
:set nonumber?

配置vimrc

1、打开vimrc

vim ~/.vimrc

2、进行配置 输入如下配置代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3eE6RN1L-1591956045117)(C:\Users\201781~1\AppData\Local\Temp\1591337738814.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gse7832A-1591956045118)(C:\Users\201781~1\AppData\Local\Temp\1591337750193.png)]

  1 "显示行号
  2 set number
  3 "设置tab键的宽度
  4 set tabstop=4
  5 "设置缩进的宽度
  6 set shiftwidth=4
  7 "自动对齐
  8 set autoindent
  9 set smartindent
 10 "保存推出函数
 11 func! SaveExit()
 12     exec "wq"
 13 endfunc
 14 
 15 "不备份
 16 set nobackup
 17 "不生成临时文件
 18 set noswapfile
 19 
 20 "映射Ctrl+z按键调用保存并推出函数“
 21 map <C-z> :call SaveExit()<CR>
 22 imap <C-z> <ESC>:call SaveExit()<CR>

写完之后,先ESC、后大写ZZ 保存退出!!!

3、设置配置生效

source ~/.vimrc

8.5、调试器GDB

8.5.1、GDB的简单使用流程

1、编译代码加入-g选项

gcc gdb_sum.c -o gdb_sum -g 

2、如果编译成功,启动GDB调试器

gdb gdb_sum -silent

注:加上-silent是去掉描述提示信息。

3、输入GDB调试命令,进行调试

gdb -l选项:列出源文件内容。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8e6OgUyE-1591956045118)(C:\Users\201781~1\AppData\Local\Temp\1591339179603.png)]

默认每次显示10行源代码,如果没显示完,可以继续使用l命令。。。

注意:q退出GDB.。

gdb -b选项:设置断点。

设置断点的方法:指定内存的地址为断点,指定行号为断点,指定函数名为断点。

gdb -r选项:执行程序。

断点设置好后,r开始执行程序,直到断点处停下。

gdb -p选项:打印变量的值

gdb -n选项:单步调试。

gdb -c选项:继续执行程序。

直到遇到断点或者程序结束

gdb -q(quit) 选项:退出调试。

8.6、工程管理器Makefile

Makefile可以认为是一个工程文件的编译规则。

gcc a.c b.c d.c -o out

1、编译的时候徐需要链接库的问题

2、编译大的工程会花费大量的时间

到默认名字为 a.out 的可执行文件

2、运行可执行文件
./a.out
3、GCC常用的选项

​ -E:只做预处理,不进行编译

​ -o 文件名:指定输出文件

​ -S:只编译,不汇编

​ -c:编译、汇编,而不链接,得到目标文件

​ -l:链接指定的文件

​ -g:生成调试信息

8.4.3、GCC的错误类型及其对策

1、C语法错误。

2、头文件错误。

3、段错误。

4、出现中文字符。

5、编译标准错误。

hello.c
#include<stdio.h>
int main(){
printf("hello");
for(int i=0;i<10;i++){
printf("i=%d\n",i);
}
return 0;
}
gcc -std=c99 hello.c && ./a.out

注:

for(int i=0;i<10;i++)  需要加-std=c99

CTRL+空格:切换输入法。

8.4.4、配置vim

vim的全局配置一般在/etc/vim/vimrc或者/etc/vimrc

个人用户的配置在~/.vimrc

  • 先输入冒号:

  • 打开行号:

set number
  • 关闭行号:
set nonumber
  • 查询是否开启
:set nonumber?

配置vimrc

1、打开vimrc

vim ~/.vimrc

2、进行配置 输入如下配置代码

[外链图片转存中…(img-3eE6RN1L-1591956045117)]

[外链图片转存中…(img-Gse7832A-1591956045118)]

  1 "显示行号
  2 set number
  3 "设置tab键的宽度
  4 set tabstop=4
  5 "设置缩进的宽度
  6 set shiftwidth=4
  7 "自动对齐
  8 set autoindent
  9 set smartindent
 10 "保存推出函数
 11 func! SaveExit()
 12     exec "wq"
 13 endfunc
 14 
 15 "不备份
 16 set nobackup
 17 "不生成临时文件
 18 set noswapfile
 19 
 20 "映射Ctrl+z按键调用保存并推出函数“
 21 map <C-z> :call SaveExit()<CR>
 22 imap <C-z> <ESC>:call SaveExit()<CR>

写完之后,先ESC、后大写ZZ 保存退出!!!

3、设置配置生效

source ~/.vimrc

8.5、调试器GDB

8.5.1、GDB的简单使用流程

1、编译代码加入-g选项

gcc gdb_sum.c -o gdb_sum -g 

2、如果编译成功,启动GDB调试器

gdb gdb_sum -silent

注:加上-silent是去掉描述提示信息。

3、输入GDB调试命令,进行调试

gdb -l选项:列出源文件内容。

[外链图片转存中…(img-8e6OgUyE-1591956045118)]

默认每次显示10行源代码,如果没显示完,可以继续使用l命令。。。

注意:q退出GDB.。

gdb -b选项:设置断点。

设置断点的方法:指定内存的地址为断点,指定行号为断点,指定函数名为断点。

gdb -r选项:执行程序。

断点设置好后,r开始执行程序,直到断点处停下。

gdb -p选项:打印变量的值

gdb -n选项:单步调试。

gdb -c选项:继续执行程序。

直到遇到断点或者程序结束

gdb -q(quit) 选项:退出调试。

8.6、工程管理器Makefile

Makefile可以认为是一个工程文件的编译规则。

gcc a.c b.c d.c -o out

1、编译的时候徐需要链接库的问题

2、编译大的工程会花费大量的时间


注:本篇文章来自本学期Linux课程中老师所总结+自己的一些总结。

猜你喜欢

转载自blog.csdn.net/weixin_43759352/article/details/106721219