Linux常用命令笔记大全,从入门到精通(持续更新)

Linux常用命令笔记

    • 1. 根目录
    • 2. 一切皆文件
  • 一:Linux下的基本指令
    • 0. 最为重要的基础指令
      • 0.0 man手册所需要学习的内容
      • 0.1 常用的man命令
      • 0.2 pwd命令
      • 0.3 ls 指令
        • 3.1 ls 通配符
      • 0.4 cd跳转路径
      • 0.5 目录操作
      • 0.6 touch指令
      • 0.7 查看文件内容指令
    • 1. vim指令
      • 1.1 vim界面中光标移动操作
      • 1.2 vim时不同位置插入的基本操作
      • 1.3 vim的复制粘贴撤销替换操作
      • 1.4 vim块可视化操作
    • 2. 用户管理操作
      • 2. 1 创建删除和修改切换用户
      • 2.2 创建组加入组操作
      • 2.3 /etc/下的passwd和shadow文件操作
  • 二:权限和网络管理
    • 1. 文件权限
      • 1.1 文件权限的解读
      • 1.2 修改文件的权限
    • 2. 目录的权限
      • 2.1 用户设置位
      • 2.2 粘贴位
    • 3. 网络管理
      • 1. 查看网络状态
      • 2. 网卡改名的基本操作步骤
      • 3. 网卡网关等信息修改
  • 三:软件安装进程和磁盘分区管理
    • 1. Linux内部安装软件
    • 2. yum软件仓库安装软件
    • 3. 进程管理
    • 4. 磁盘
    • 5. 分区
    • 6. 时间戳和find命令
    • 7. 打包解压
  • 四:编译和调试
    • 1. gcc编译工具
      • 1.1 预处理
      • 1.2 编译
      • 1.3 汇编
      • 1.4 链接
    • 2. gdb调试工具
      • 2.1 启动gdb
        • 2.1.1 直接启动
        • 2.1.2 动态链接
      • 2.2 设置断点
        • 2.2.1 在函数上设置断点
        • 2.2.2 在行上设置断点
        • 2.2.3 查看断点信息和删除断点
        • 2.2.4 调试其他基本命令
        • 2.2.5 运行
        • 2.2.6 查看内存空间
        • 2.2.7 打印函数栈帧
    • 3. Linux环境安装中文输入法
  • 五:Makefile 项目管理
    • 1. 计算器
    • 2. Makefile
    • 3. makefile基本操作
    • 4. makefile的文件分类
  • 六:冯诺依曼体系
    • 0. 缓存
    • 1. 冯诺依曼
      • 1.1 五部分组成
      • 1.2 以二进制形式存在
      • 1.3 自动从存储器中取出命令并执行
      • 1.4 执行指令的过程
    • 2. 进程 PCB
      • 2.1 进程
      • 2.2 内核中断技术(上下文切换)
      • 2.3 进程task_struct- PCB
        • 2.3.1 进程的内部信息
        • 2.3.2 局部性
      • 2.4 进程和程序的区别
      • 2.5 进程的状态变迁
      • 2.6 进程编号PID
      • 2.7 创建进程
      • 2.8 刷新缓存区和exit结束
      • 2.8 收取僵尸和父进程回僵尸子进程
      • 2.9 如何将进程从磁盘拉到物理内存之中
      • 2.10 亲缘性(最优化)
      • 2.11 错误信息

对于Linux操作系统的学习,是每一位所必须了解和掌握的重要知识!

1. 根目录

在Linux系统中,磁盘上的文件和目录被组成一颗目录树,每个节点都是目录或者文件,在根目录之下又被分为多个子目录,我们用画树状图的形式来进行表示
Linux常用命令笔记大全,从入门到精通(持续更新)_第1张图片
Linux常用命令笔记大全,从入门到精通(持续更新)_第2张图片

2. 一切皆文件

在linux操作系统之中,我们应该明白一个“一切皆文件”法则,这样能够更好的帮助我们进行后期的学习,也就是对于任何的文件,命令,网卡,磁盘等都可以满足文件的打开,读,写,关闭的操作。
Linux常用命令笔记大全,从入门到精通(持续更新)_第3张图片

一:Linux下的基本指令

0. 最为重要的基础指令

对于Linux的命令来说,他是有着很多的参数的,我们也是不可能全部记住,因此我们可以通过联机手册来获取帮助进行查看,而访问联机手册的命令则是man语法:man [选项] 命令

0.0 man手册所需要学习的内容

对于man手册来说,他一共被分为8章,而我们所需要学习的只包括了其中的6章,分别为:
1. 第一章:用户命令
2. 第二章:系统调用
3. 第三章:C库函数的解释
4. 第四章:不学习
5. 第五章:配置文件
6. 第六章:不学习
7. 第七章:某一个主题
8. 第八章:系统管理命令

  • 小技巧:需要自行实现的命令被称为外部命令;而系统自动进行的则称为内置命令!

0.1 常用的man命令

  • -k 根据关键字搜索联机帮助!
  • -a 将所有的章节都显示出来,按下q表示退出!
  • 在man联机手册之中,按下j表示向下翻页,按下k表示向上翻页,按下q表示退出!
  • / 命令后,输入我们所需要查找的关键字,即会在手册之中出现我们所需要查找到的关键词,按n翻页往后找,按N翻页往前找,同样按q表示退出!

0.2 pwd命令

功能:pwd (print working dir)的缩写
功能:显示用户当前所在的目录
示例:
实列

0.3 ls 指令

语法:ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件;对于文件,将列出文件名以及其他信息。
常用选项:

  • -a 列出目录下的所有文件(all的缩写),包含以.开头的隐含文件!
    ls-a
  • -l 显示此文件或目录的详细信息
    Linux常用命令笔记大全,从入门到精通(持续更新)_第4张图片
  • -r 将目录或文件进行反序排序
  • -t 按照时间顺序进行排序
  • -R 以递归显示的方法列出子目录下的文件
  • -d 目录本身的信息
  • -1 表示以一列的形式来进行展示,一行只有一个文件
    Linux常用命令笔记大全,从入门到精通(持续更新)_第5张图片

3.1 ls 通配符

  1. (* )显示以* 之前文件开头的所有文件目录
    直接使用代码来记录
    Linux常用命令笔记大全,从入门到精通(持续更新)_第6张图片
    通配符 * 表示显示所有以file开头的文件,因此c的文件则不会进行显示
  2. (?)表示?这个位置不同的文件和目录
    Linux常用命令笔记大全,从入门到精通(持续更新)_第7张图片
    Linux常用命令笔记大全,从入门到精通(持续更新)_第8张图片
    则表示只查找?位置上不同的文件和目录进行显示。

0.4 cd跳转路径

Linux常用命令笔记大全,从入门到精通(持续更新)_第9张图片
语法:cd [路径]
功能:更改路径,改变工作目录,将当前的工作目录改变到指定的目录之下
常用选项:

  • cd … :返回上级目录
    在这里插入图片描述
  • cd /home/linux/ : 绝对路径
  • 在这里插入图片描述
  • cd …/day02/ :相对路径
  • 在这里插入图片描述
  • cd ~ :进入用户家目录
  • 在这里插入图片描述
  • cd :后面什么都不跟,也直接进入到家目录
  • cd - :访问最近访问的目录

小技巧: clear 在Linux之中是清屏操作。

0.5 目录操作

  1. 创建
    语法:mkdir 目录名
    功能:在当前目录下创建一个目录
    常用选项:
  • -p (–parents)可以是一个路径名称,此时若路径中的某些目录尚未创建,加上此则立即创建那些尚不存在的目录,即一次可以创建多个目录。
    在这里插入图片描述
    此操作表示创建目录b后在b之中创建c目录,再在c目录之中创建目录d。
    在这里插入图片描述
    单纯在a目录中创建b。
  1. 删除
    rmdir是一个和mkdir相对应的命令,mkdir是创建目录,而rmdir则是删除目录
    语法:rmdir [dirName]
    适用对象:具有当前目录操作权限的所有使用者
    功能:删除空目录
    常用选项:
    Linux常用命令笔记大全,从入门到精通(持续更新)_第10张图片
  • rmdir[-p][dirName]
    当子目录被删除后,如果父目录也变为空目录的话,则连带父目录一同删除。
    rm命令的话,则可以同时删除文件或者目录
    语法:rm [-f-i-r-v] [dirName/dir]
    适用对象:所有使用者
    功能:删除文件或目录
    常用选项:
  • -f 即使⽂文件属性为只读(即写保护),亦直接删除
    在这里插入图片描述
  • -i 删除前逐⼀一询问确认
  • -r 删除目录及其下所有⽂文件
    在这里插入图片描述
  1. 移动(mv指令)
    mv命令是move的缩写,可以用来移动文件或者将文件改名(move(rename)files),是Linux系统下常用的命令,经常用来备份文件或目录。
    语法:mv [选项] 源文件或目录 目标文件或目录
    功能:
  • 当第⼆个参数类型是文件时, mv命令完成文件重命名,此时,源⽂件只能有⼀个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标⽂件名。
    Linux常用命令笔记大全,从入门到精通(持续更新)_第11张图片
  • 当第⼆个参数是已存在的目录名称时,源⽂文件或目录参数可以有多个, mv命令将各参数指定的源文件均移⾄至目标目录中。
    Linux常用命令笔记大全,从入门到精通(持续更新)_第12张图片
  1. 复制(cp指令)
    语法:cp [选项] 源文件或目录目标文件或目录
    功能:复制文件或者目录
    说明:cp指令用于复制文件或者目录,如果同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到此目录之中。
    常用选项:
  • -f 或 --force 强⾏行复制⽂文件或目录, 不论⺫⽬目的⽂文件或目录是否已经存在
  • -i 或 --interactive 覆盖⽂文件之前先询问⽤用户
    在这里插入图片描述

0.6 touch指令

语法:touch [选项] 文件
功能:touch命令参数可以更改文档或者目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件,更多的被使用于创建一个新文件。
常用选项:

  • touch 直接加文件名
    Linux常用命令笔记大全,从入门到精通(持续更新)_第13张图片

0.7 查看文件内容指令

  • cat
    语法:cat[选项][文件]
    功能:查看目标文件的内容
    Linux常用命令笔记大全,从入门到精通(持续更新)_第14张图片
  • more
    语法:more [选项][文件]
    功能:和cat类似,都是输出文件中的所有内容,并且是分屏显示,空格表示翻到下一屏幕,b表示翻到上一屏幕,q表示退出
    常用选项:
    Linux常用命令笔记大全,从入门到精通(持续更新)_第15张图片
  • head
    用来显示开头的文字区块,用来显示档案的开头至标准的输出之中
    语法:head[参数][文件]
    功能:默认head命令打印其相关文件的开头10行
    常用选项:
  • -n(行数),表示所要显示的行数
    Linux常用命令笔记大全,从入门到精通(持续更新)_第16张图片
    Linux常用命令笔记大全,从入门到精通(持续更新)_第17张图片
  • tail
    用来显示结尾的文字区块,用来显示档案的结尾至标准的输出之中
    语法:tail[参数][文件]
    功能:用于显示指示文件末尾的内容,不指定文件时,作为输入信息进行处理,常用查看日志信息,并且可以不断刷新,使你看到最新的文件内容。
    常用选项:
  • -f 循环读取
  • -n<⾏行数> 显⽰示⾏行数
    Linux常用命令笔记大全,从入门到精通(持续更新)_第18张图片
  • wc 统计打印的行
    Linux常用命令笔记大全,从入门到精通(持续更新)_第19张图片
    语法:head / etc / passwd | wc - l
    功能:统计我们所打印出的文件信息是多少行,一般和cat,more等共用
    常用选项:
  • -l 表示一行只显示一个
    在这里插入图片描述
    Linux常用命令笔记大全,从入门到精通(持续更新)_第20张图片
    小技巧: echo abc > hehe 输出重定向,改变输出的去向

1. vim指令

Linux常用命令笔记大全,从入门到精通(持续更新)_第21张图片

  • 第一个命令 在终端界面上 输入 vim [文件名] 旨在创建一个新的项目,之后会自动进入我们所创建到的这个项目之中。
  • 第二个命令 要想在此项目之中进行插入操作,也就是我们平时敲代码之中的写入操作,我们只需要按i就可以进行写入操作了。
  • 第三个命令 书写完成之后按Esc进行退出编辑模式,也就是我们所说到的书写模式。
  • 第四个命令 书写完成之后就需要进行保存和退出,那也就需要我们按,之后按wq进行保存,或者分步进行,先按w,之后再重复上述步骤后按q

1.1 vim界面中光标移动操作

  • l 光标向右移动
  • h光标向左移动
  • j光标向下移动
  • k光标向上移动

1.2 vim时不同位置插入的基本操作

  • i插入到光标当前位置处
  • I插入到光标当前行的行首位置处
  • O插入到光标当前行的上面插入一行
  • o插入到光标当前行的下面插入一行
  • a插入到光标的下一个位置处
  • A插入到光标当前行的末尾进行追加

1.3 vim的复制粘贴撤销替换操作

  • yw 复制光标位置的完整单词
  • nyy复制光标位置开始的n行
  • y$复制光标当前位置到行尾
  • y^复制光标当前位置到行首
    ————————————————————
  • p粘贴
  • u撤销上一步操作
  • ctrl + r重做此操作
    ————————————————————
  • ndd删除当前光标位置开始的总共n行
  • x 删除光标所在的当前字符
  • r 替换光标当前所在位置的字符
  • D 删除光标位置到当前行的行尾
  • R 从光标位置开始进行替换,按Esc结束
  • dG 删除从当前行到文件的结尾位置
    ————————————————————
  • :%s/old/new/ 替换操作,一行如果有多个的话,则只替换第一个找到的
  • :%s/old/new/g替换操作,不论一行有多少个,全部进行替换
  • :3,5s/old/new/g替换操作,替换从第三行到第五行的所有存在的
    Linux常用命令笔记大全,从入门到精通(持续更新)_第22张图片
  • :$ 在查看一个文件时候,按此操作,则直接移动到文件的最后位置。

1.4 vim块可视化操作

  • Ctrl + v 块可视化操作
  • v 字符可视化操作
  • shift + v 行可视化操作
  • :xxx.h 把xxx.h的内容放到目前光标所存在的位置处,一般用于包含头文件。
    ————————————————————
    加注释操作:
  1. ctrl + v进入块可视化
  2. 选中你要注释的行
  3. I按大写的i后输入//
  4. 最后Esc操作进行退出

2. 用户管理操作

Linux下有两种用户:超级用户(root),普通用户;超级用户的命令提示符时#,普通用户的命令提示符时$

  • 超级用户:可以在Linux系统下做任何的事情,不会受到限制。
  • 普通用户:在Linux下做有限的事情。

2. 1 创建删除和修改切换用户

  • useradd 用户名 表示创建一个用户
  • id 用户名 查看当前用户名的具体信息
  • /home/用户名 表示家目录 之后ls -a 将能够查看配置信息
  • passwd设置密码,如果自己练习的话尽可能地把密码设置简单一些
  • 等我们创建好用户后,系统会在/etc/passwd中增加一条记录,来记录此用户的信息;而会在/etc/shadow之中保存我们设置好的密码
    ————————————————————————
  • userdel 用户名 删除此用户 -r同时删除用户的家目录
  • usermod 修改用户信息 -d 修改用户的家目录
    Linux常用命令笔记大全,从入门到精通(持续更新)_第23张图片
  • su - 用户 从当前用户切换到需要切换的用户,切记切换之后要退出,否则会引起不断的递归操作
    Linux常用命令笔记大全,从入门到精通(持续更新)_第24张图片

2.2 创建组加入组操作

  • groupadd 创建组操作
  • usermod -g group1 user1 将user1 加入到group1之中
    usermod -g group1 user2 将user2 也加入到group1之中
  • sudo 此操作表示以自己的身份去运行其他用户身份才能够运行的命令
    Linux常用命令笔记大全,从入门到精通(持续更新)_第25张图片
    如这样的操作,如果用超级用户进行了关机操作,是没有办法用user1的命令去取消关机的,如果需要完成这一操作,是需要在相关文件之中进行配置,给予user1一定的权限。
    Linux常用命令笔记大全,从入门到精通(持续更新)_第26张图片

2.3 /etc/下的passwd和shadow文件操作

在这里插入图片描述
其中前面的w表示他的用户名,x表示密码占位符,/home/w2表示家目录,/bin/bash表示当前的状态是可以登录的,若是上面/nologin的话,则表示此用户无法进行操作。
在这里插入图片描述
shadow之中所存放的则是w用户乱码密码!

二:权限和网络管理

1. 文件权限

1.1 文件权限的解读

Linux常用命令笔记大全,从入门到精通(持续更新)_第27张图片

  • – 的位置所出现的不同,则代表着不同七种文件

1.2 修改文件的权限

Linux常用命令笔记大全,从入门到精通(持续更新)_第28张图片
对于修改文件的权限有着两种方式,一种是用命令+[对应指令] ,而另一种则是使用十进制的方法来进行修改。

  • u + r
    Linux常用命令笔记大全,从入门到精通(持续更新)_第29张图片
  • 0740
    Linux常用命令笔记大全,从入门到精通(持续更新)_第30张图片

2. 目录的权限

当然了,文件有着对应的权限,目录也有着属于自己的对应的权限
目录的权限:

  1. r: 表示可以ls
  2. w:表示可以创建touch
  3. x:表示可以执行cd
    Linux常用命令笔记大全,从入门到精通(持续更新)_第31张图片

2.1 用户设置位

Linux常用命令笔记大全,从入门到精通(持续更新)_第32张图片
对于用户设置位的话,为了方便记忆和理解,我将其理解成为了网吧老板,网管关系,一般来说实际用户也就是网吧老板,有效用户是网管(一般情况就是老板),而在设置用户设置位后,也就相当于开通了管理的权限,网管不一定是老板了,但一定是管理这家网吧的那个拥有者。
Linux常用命令笔记大全,从入门到精通(持续更新)_第33张图片

2.2 粘贴位

Linux常用命令笔记大全,从入门到精通(持续更新)_第34张图片
此操作主要起到的作用也就是做出一c定的权限管理。
Linux常用命令笔记大全,从入门到精通(持续更新)_第35张图片

3. 网络管理

1. 查看网络状态

查看网络状态 ifconfig 命令,一般情况下网卡信息都是eth0,如果不是eth0,则需要进行修改(其中网卡改名牵扯到两个相关的信息,就是biosdevname 和net.fnames
在这里插入图片描述
Linux常用命令笔记大全,从入门到精通(持续更新)_第36张图片

2. 网卡改名的基本操作步骤

    1. vim /etc/default/grub进入之后将这句话最后的位置改为我们需要改正的后保存退出。
  • 进入到cd/etc/sysconfig/network-scripts/ 之后ls我们会看到一个名为ifcfg-ens33的文件夹,我们将其改名mv ifcfg-ens33 ifcfg-eth0
  • 之后进入到这个文件夹之中vim ifcfg-eth0,将其中的内容改为和图片中一样的即可保存退出。
  • 进行grub的更新后进行重启。
    Linux常用命令笔记大全,从入门到精通(持续更新)_第37张图片

3. 网卡网关等信息修改

Linux常用命令笔记大全,从入门到精通(持续更新)_第38张图片

三:软件安装进程和磁盘分区管理

1. Linux内部安装软件

在这里插入图片描述

  • 其中具体的操作为:rpm -i安装软件 rpm -e卸载软件
    Linux常用命令笔记大全,从入门到精通(持续更新)_第39张图片

2. yum软件仓库安装软件

Linux常用命令笔记大全,从入门到精通(持续更新)_第40张图片

  • 其中具体的操作为:yum install安装软件 yum remove卸载软件
  • grep需要过滤的文件
    Linux常用命令笔记大全,从入门到精通(持续更新)_第41张图片
  • list查看软件的列表展示

3. 进程管理

  • 查看进程 :ps -e
    Linux常用命令笔记大全,从入门到精通(持续更新)_第42张图片
  • 进程的解读
    Linux常用命令笔记大全,从入门到精通(持续更新)_第43张图片
  • pstree 查看进程树操作
    Linux常用命令笔记大全,从入门到精通(持续更新)_第44张图片
  • 动态查看进程 top
    Linux常用命令笔记大全,从入门到精通(持续更新)_第45张图片
  • 动态进程的解读
    Linux常用命令笔记大全,从入门到精通(持续更新)_第46张图片
  • 查看内存
    在这里插入图片描述
    Linux常用命令笔记大全,从入门到精通(持续更新)_第47张图片

4. 磁盘

  • 查看磁盘
    Linux常用命令笔记大全,从入门到精通(持续更新)_第48张图片
    Linux常用命令笔记大全,从入门到精通(持续更新)_第49张图片

5. 分区

Linux常用命令笔记大全,从入门到精通(持续更新)_第50张图片

  • 硬链接 :ln 原本的文件名 新文件名 旨在让多个文件名指向同一个索引,也就是i节点。
    Linux常用命令笔记大全,从入门到精通(持续更新)_第51张图片
  • 软链接:也就是快捷方式的存在,ln -s 第一个文件名,第二个文件名找到hehe目录号,寻找到test.txt,之后根据test.txt去找到他的目录号,寻找到数据块中的内容。
    Linux常用命令笔记大全,从入门到精通(持续更新)_第52张图片

6. 时间戳和find命令

  • data 直接显示当前年月日时间
    在这里插入图片描述

  • data + %s 显示时间戳,一个从1900年开始得秒
    在这里插入图片描述

  • touchdate + % s.log 创建以时间戳为名的文件
    在这里插入图片描述
    在这里插入图片描述

  • cal日历的查找
    Linux常用命令笔记大全,从入门到精通(持续更新)_第53张图片
    (后面加上年份,则打印那一年的日历)
    Linux常用命令笔记大全,从入门到精通(持续更新)_第54张图片

(-n,表示将月份一行之内打印几个月)
Linux常用命令笔记大全,从入门到精通(持续更新)_第55张图片

  • find指令
    在这里插入图片描述

7. 打包解压

  • tar -czvf xxx.tar.gz + 要压缩的目录 进行压缩
  • tar -xzvf xxx.tar.gz 进行解压
    Linux常用命令笔记大全,从入门到精通(持续更新)_第56张图片

四:编译和调试

1. gcc编译工具

gcc 命令,直接进行编译。
在这里插入图片描述
在这里插入图片描述

1.1 预处理

gcc -E
Linux常用命令笔记大全,从入门到精通(持续更新)_第57张图片
在这里插入图片描述

1.2 编译

gcc -S 编译命令
Linux常用命令笔记大全,从入门到精通(持续更新)_第58张图片

在这里插入图片描述

1.3 汇编

gcc -c
Linux常用命令笔记大全,从入门到精通(持续更新)_第59张图片
在这里插入图片描述

Linux常用命令笔记大全,从入门到精通(持续更新)_第60张图片
Linux常用命令笔记大全,从入门到精通(持续更新)_第61张图片

1.4 链接

``
Linux常用命令笔记大全,从入门到精通(持续更新)_第62张图片
Linux常用命令笔记大全,从入门到精通(持续更新)_第63张图片

2. gdb调试工具

gdb -g命令
调试工具的作用:

  • 跟踪程序的执行
  • 程序崩溃前的状态
    quit 退出gdb调试。

2.1 启动gdb

2.1.1 直接启动

gdb ——————> file + 要调试的程序
gdb 程序名
gdb 程序名 core文件

Linux常用命令笔记大全,从入门到精通(持续更新)_第64张图片

2.1.2 动态链接

gdb 程序名 pid 使用这条命令之后被调试的程序将会被暂停了continue才能够继续运行
run 运行到第一个断点
start 运行在程序的开始处停下来
Linux常用命令笔记大全,从入门到精通(持续更新)_第65张图片

set args 传递命令行参数
Linux常用命令笔记大全,从入门到精通(持续更新)_第66张图片

在这里插入图片描述
Linux常用命令笔记大全,从入门到精通(持续更新)_第67张图片

2.2 设置断点

2.2.1 在函数上设置断点

break func_name
在这里插入图片描述

2.2.2 在行上设置断点

break filename:line
在这里插入图片描述

2.2.3 查看断点信息和删除断点

info breakpoints 查看断点信息
delete 删除我们所设置的断点。
Linux常用命令笔记大全,从入门到精通(持续更新)_第68张图片

2.2.4 调试其他基本命令

list 查看调试程序的代码
Linux常用命令笔记大全,从入门到精通(持续更新)_第69张图片

next 下一步
Linux常用命令笔记大全,从入门到精通(持续更新)_第70张图片

step 有函数则进入函数的内部
until 行号 跳到这个行
在这里插入图片描述

jump+ 行号 同样为跳到这个行
return 遇见问题时,强制离开此函数
print 变量 打印变量的信息
Linux常用命令笔记大全,从入门到精通(持续更新)_第71张图片

set var p=malloc() 调试过程中 重新制定变量的指向

2.2.5 运行

./a.out 运行链接完成后的程序
Linux常用命令笔记大全,从入门到精通(持续更新)_第72张图片

_start 从main函数开始进行运行,若是没有main函数,也是可以直接从缺省的地方开始进行运行

2.2.6 查看内存空间

Linux常用命令笔记大全,从入门到精通(持续更新)_第73张图片
通过gdb来打印大小端字节序
Linux常用命令笔记大全,从入门到精通(持续更新)_第74张图片

2.2.7 打印函数栈帧

  • 看栈帧 bt
    Linux常用命令笔记大全,从入门到精通(持续更新)_第75张图片
    Linux常用命令笔记大全,从入门到精通(持续更新)_第76张图片

  • 查看当前栈帧的信息 info frame
    Linux常用命令笔记大全,从入门到精通(持续更新)_第77张图片

  • 看寄存器info registers
    Linux常用命令笔记大全,从入门到精通(持续更新)_第78张图片

  • 修改寄存器的值set $rax=
    在这里插入图片描述

3. Linux环境安装中文输入法

[root@luckily ~]# yum install  ibus - libpinyin

Linux常用命令笔记大全,从入门到精通(持续更新)_第79张图片

五:Makefile 项目管理

1. 计算器

  • add函数
#include "add.h"

int add(int a, int b) {
	return a + b;
}

//add头文件
#ifndef __ADD_H__
#define  __ADD_H__

int add(int a, int b);

#endif //__ADD_H__
  • sub函数
ine  __SUB_H__

int sub(int a, int b);

#endif //__SUB_H__

//sub函数
#include "sub.h"

int sub(int a, int b) {
	return a - b;
}

  • mul函数
#ifndef __MUL_H__
#define  __MUL_H__

int mul(int a, int b);

#endif //__MUL_H__

//mul函数

#include "mul.h"

int mul(int a, int b) {
	return a * b;
}
  • parse函数
#ifndef __PARSE_H__
#define __PARSE_H__

void parse(char* buf);

#endif //__PARSE_H__


//parse函数
#include 
#include 
#include "parse.h"
#include "add.h"
#include "sub.h"
#include "mul.h"

#define IN 1
#define OUT 0

typedef int FUNC(int, int);

FUNC* p_fun = NULL;
char op;


struct expr_t {
	FUNC* pFun;//add(int ,int )
	char* name;//add sub
	char op; //+ - fuhao
};

struct expr_t expr[] = {
	{add,"add",'+'},
	{sub,"sub",'-'},
	{mul,"mul",'*'},
	{NULL,NULL,0}
};

void do_action(int argc, char* argv[]) {
	int left = atoi(argv[1]);
	int right = atoi(argv[2]);

	int ret = p_fun(left, right);
	printf("%s%c%s=%d\n", argv[1], op, argv[2], ret);
}

void main_math(int argc, char* argv[]) {
	int i;
	p_fun = NULL;
	for (i = 0; ; i++) {
		if (expr[i].name == NULL) {
			printf("%s ciminglingbucunzai1n", argv[0]);
			return;
		}
		if (strcmp(expr[i].name, argv[0]) == 0) {
			p_fun = expr[i].pFun;
			op = expr[i].op;
			break;
		}
	}
	do_action(argc, argv);
}

void parse(char* buf) {
	int i;
	int argc = 0;
	char* argv[8] = {};
	int flag = OUT;
	for (i = 0; buf[i] != 0; i++) {
		//haizaidanciwaim ,bingqie dangqiande weizhibushi kongbaifu
		if (flag == OUT && !isspace(buf[i])) {
			argv[argc++] = buf + i;
			flag = IN;
		}
		//ruguo zai danci nei ,bingqie dangqian zifu shi kongbaifu ,jiangdangqian zifuqingling ,zhicheng OUT zhuangtai 
		if (flag == IN && isspace(buf[i])) {
			buf[i] = '\0';
			flag = OUT;
		}
	}
	main_math(argc, argv);
}
  • main主函数
#include 
#include 

#include "parse.h"

int main(void) {
	char buf[512] = {};

	while (1) {
		printf("ji suan qi\n ");
		printf("please in you data:");
		memset(buf, 0x00, sizeof(buf));
		scanf("%[^\n]%*c", buf);
		//printf("buf=[%s]\n",buf);
		parse(buf);
	}
}


2. Makefile

#我 的 第 一 个 makefile
# $@ 目标
# $^ 所有依赖文件
# $ < 第一个依赖文件
# .PHONY 后面写的目标,不论是否是最新的,都强制执行
	.PHONY : clean main all

	CC = gcc
	SRCS = $(wildcard * .c) #wildcard 过滤(通配)函数 当前目录下的所有.c文件

# /root/study/day02/progress
	BASEDIR = $(shell pwd)

# /root/study/day02/progress/obj
	OBJDIR = $(BASEDIR) / obj
	$(shell mkdir - p $(OBJDIR))

	OBJS = $(SRCS:.c = .o) #将SRCS对应的.c换乘.o

#/root/study/day02/progress/obj/main.o
	OBJS : = $(addprefix $(OBJDIR) / , $(OBJS))

	BIN : = main

	all : $(BIN)

	main : $(OBJS)
	$(CC) - o $@ $ ^
# %通配符
	$(OBJDIR) / % .o : % .c
	$(CC) - c $ < -o $@

	clean :
	rm - rf $(OBJS)

	rebuild : clean main

3. makefile基本操作

  1. make 将我们所需要的主函数进行编译
    在这里插入图片描述
    再次进行make操作时候,系统会显示已是最新版本的main.o
    如果需要编译某个文件,则进行 make 某.o文件
    在这里插入图片描述
  2. make一次输入,全部编译
    Linux常用命令笔记大全,从入门到精通(持续更新)_第80张图片

4. makefile的文件分类

Linux常用命令笔记大全,从入门到精通(持续更新)_第81张图片
make rebuild 查找到相关目标的信息
Linux常用命令笔记大全,从入门到精通(持续更新)_第82张图片

  • 在这里插入图片描述
    在这里插入图片描述

六:冯诺依曼体系

0. 缓存

  • scanf 缓存
    Linux常用命令笔记大全,从入门到精通(持续更新)_第83张图片
int main() {
	int num;
	do {
		printf("请输入:");
		if (scanf("%d", &num) != 1) {
			printf("输入非法\n");
			scanf("%d*[^\n]%*c");
			continue;
		}
		break;
	} while (1);
	printf("你充值了多少%d\n",num);
}
  • printf 缓存
    Linux常用命令笔记大全,从入门到精通(持续更新)_第84张图片
int main(void) {
	int num;
	do {
		printf("请输入:");
		if (scanf("%d", &num) != 1) {
			printf("输入非法\n");
			scanf("%d[^\n]%*c");
			continue;
		}
		break;
	} while (1);
	printf("你充值%d\n", num);
}
  • 打印进度条
#include 
#include 


int main(void) {
	char buf[100] = { '#' };
	char* p = "|/-\\";
	int i;
	for (i = 0; i < 100; i++) {
		buf[i] = '#';
		printf("[% -100s][%d%%][%c]\r", buf, i + 1, p[i % 4]);
		fflush(stdout);
		usleep(500000);
	}
}


1. 冯诺依曼

1.1 五部分组成

Linux常用命令笔记大全,从入门到精通(持续更新)_第85张图片

1.2 以二进制形式存在

Linux常用命令笔记大全,从入门到精通(持续更新)_第86张图片

1.3 自动从存储器中取出命令并执行

Linux常用命令笔记大全,从入门到精通(持续更新)_第87张图片

1.4 执行指令的过程

Linux常用命令笔记大全,从入门到精通(持续更新)_第88张图片
Linux常用命令笔记大全,从入门到精通(持续更新)_第89张图片

2. 进程 PCB

2.1 进程

进程:是程序进行运行后所产生的。
Linux常用命令笔记大全,从入门到精通(持续更新)_第90张图片
查看进程
在这里插入图片描述

  • 进程是操作系统粉配资源的基本单位,也是分配资源的最小单位
  • 每个进程有自己独立的地址空间和运行状态

进程中一个重要的练习:

int main(){
	const int a =10;
		int* p=(int*)&a;
		 *p=11;
		 printf("p =%d,a=%d\n",*p,a);
}

C语言编译后打出来的是“11 ,11”,
C++编译后打出来的是“11,10”;
const是一个不变的变量,它自身所修饰的变量是没有办法改变的,但是变量的空间是可以通过其他方式来进行改变的。

volatile const int a = 10;volatile 阻止编译器进行优化 防止其他地方将其进行修改,所以打印出来后是“11,11”.每一次都要从内存之中取数据。

2.2 内核中断技术(上下文切换)

Linux常用命令笔记大全,从入门到精通(持续更新)_第91张图片
先运行A进程,当需要运行B进程时,将A进程得环境信息存放到内存之中,开始运行B进程,当需要再次运行A进程得时候,将B进程的环境信息存放倒内存之中,再从内存之中将A进程的环境信息恢复出来。

2.3 进程task_struct- PCB

2.3.1 进程的内部信息

在Linux中描述进程的结构体叫做task_struct,是Linux内核的一种数据结构,它会被装载倒RAM(内存)里并且包含着进程的信息。
task_struct 中管理的信息:
Linux常用命令笔记大全,从入门到精通(持续更新)_第92张图片
我们将进程看作一个链表,因此操作系统管理进程的话,只要抓住链表的头就可以了:
Linux常用命令笔记大全,从入门到精通(持续更新)_第93张图片
task_struct中的mm成员 ,所对应的struct mm_struct管理内存的
mmap指向虚拟的内存空间,它是个链表,每个节点代表的是链表中的一个段, 不如(有的节点代表数据段,有的节点代表代码段,有的节点代表映射段)每一段又拥有起始地址和结束地址
操作系统的内核的话:是想访问那个空间就访问那个空间;用户的代码是不能够这样做的。
Linux常用命令笔记大全,从入门到精通(持续更新)_第94张图片

2.3.2 局部性

局部性 在有限的物理内存中跑更多的进程(把当前运行的代码放到内存之中,当前尚未运行的代码放到交换分区当中,下一次需要运行的时候再从交换分区拉出来)

虚拟内存和对应的物理内存之间的模块 页表
Linux常用命令笔记大全,从入门到精通(持续更新)_第95张图片

  1. 虚拟内存之中连续的页表,到物理内存之中就不一定连续
  2. 如果需要访问不在物理内存之中,则会出现缺页中断,需要将虚拟地址中的数据拉到物理内存之中
  3. 把一个不使用的页换出去的策略,FIFO,先进先出(最远最久没有被使用的,可能很久不用,就提前出去)
    页表的好处:
  • 解决了狼多肉少的问题 (很多的进程,只把有用的放进物理内存)
  • 进程与进程的隔离(fork再次创建出的进程,虚拟地址相同但所对应的物理内存是不同的),进程与操作系统的隔离
int g_data = 100;
int main(void) {
	pid_t pid = fork();
	switch (pid) {
	case -1:
		printf("fork error\n");
		break;
	case 0:
		g_data = 200;
		printf("child : %p,&g_data = %p,g_data=%d\n", &main, &g_data, g_data);
		break;
	default:
		sleep(1);
		printf("parent : %p, &g_data = %p,g_data = %d\n", &main, &g_data, g_data);
		break;
	}
	sleep(1);
}

以此代码为例,所打印出来的main函数地址和data地址是相同的,但是两个data的数据确实不同的。

  • 加载的代码更少,运行的更快
  • 根据需求,可以让两个进程共享同一个物理内存(进程交互,使得其两个进程映射的物理内存相同)
    Linux常用命令笔记大全,从入门到精通(持续更新)_第96张图片
    查看环境变量 env
    自己定义环境变量export +自己定义的环境变量
    系统预定义环境变量PATH

2.4 进程和程序的区别

进程和程序的区别是什么?

  1. 进程是程序的以此动态执行过程
  2. 程序是静态的,进程是动态的
  3. 进程的生命周期相对短暂,程序相对永久
  4. 进程有PCB
  5. 一个程序可以对应多个进程,一个进程只能对应一个程序

2.5 进程的状态变迁

Linux常用命令笔记大全,从入门到精通(持续更新)_第97张图片

  • Linux中的7态
    Linux常用命令笔记大全,从入门到精通(持续更新)_第98张图片
    状态查询的代码:ps aux
    Linux常用命令笔记大全,从入门到精通(持续更新)_第99张图片
    进程组:其中lswc-l是一个组,ls是组长(终端就是一个会话session,进程组在一个会话之中,会话中有很多的进程组)
    Linux常用命令笔记大全,从入门到精通(持续更新)_第100张图片

2.6 进程编号PID

编号的范围:0- 131072(此值是通过下面这样操作来查找出来的,每个人的是不同的)cat/proc/sys/kernel/pid_max

0号进程,负责创建1号和2号进程,负责交换内存和swap

附加命令行参数 argc 和argv知识:main函数的命令函所传给它的
argc 命令行参数的个数
argv 命令行参数

int main(int argc ,char* argv[]){
}

Linux常用命令笔记大全,从入门到精通(持续更新)_第101张图片
环境变量(名字通常大写):envp

for(i=0;i<envp[i]!=NULL;i++){
				printf("%d : %s\n",i,envp[i]);
		 }

获取环境变量,给一个环境名,打印出环境变量getnev()

	char* shell = getenv("SHELL"); //获取环境变量
	printf("%s\n", shell == NULL ? "NULL" : shell);

设置环境变量:

	if (putenv("AAA=abc") == 0) {
		printf("putenv() ok\n");
	}
	else {
		printf("putenv() error\n");
	}

更改命令行参数时,需要将命令行参数和环境变量全部搬走
Linux常用命令笔记大全,从入门到精通(持续更新)_第102张图片

2.7 创建进程

创建进程的一般过程:

  1. 分配一个唯一的标识符,在内核中创建出task_struct
  2. 复制父进程的环境信息
  3. 给新进程分配资源,栈,堆等等
  4. 拷贝父进程的地址空间内容
  5. 将新进程放入就绪队列
    Linux常用命令笔记大全,从入门到精通(持续更新)_第103张图片
    父进程返回的值是子进程的id,而子进程则返回的是0,如果返回-1,表示出错。
    fork的注意点
  • 父子进程交替运行(抢占运行,需要谁调谁)
  • 如果父进程还活着,子进程死了,此时子进程是将是状态
  • 如果父进程死了,子进程就是孤儿进程,由孤儿院1接管
    Linux常用命令笔记大全,从入门到精通(持续更新)_第104张图片
    关于写时拷贝
    其中在创建出子进程后,代码段是不需要再次进行拷贝的,可以共享同一个物理内存,而数据段如果我们只是想要看的话不需要拷贝,一份就够了,如果想要更改这个数据,则需要重新拷贝一份。
    例:一个父进程,创建出两个子进程
    Linux常用命令笔记大全,从入门到精通(持续更新)_第105张图片
    Linux常用命令笔记大全,从入门到精通(持续更新)_第106张图片

2.8 刷新缓存区和exit结束

#include 
#include 
#include 

void Fun1(void) {
	printf("Fun1()\n");
}

void Fun2(void) {
	printf("Fun2()\n");
}

int main(void) {
	//后注册的先调用
	atexit(Fun1);
	atexit(Fun2);
	//1. 输出两次
	//printf("alibaba");
	//fork();
	//2.输出一次
	printf("alibaba\n");
	// fork();
	while (getchar() != '\n')
		;
	exit(0);//默认

}

Linux常用命令笔记大全,从入门到精通(持续更新)_第107张图片
带有换行符的在结束时已自动刷新缓存,而没有换行符的则等待函数结束后刷新
exit 结束符
exit(0) 0-255 只有16位是保存退出码的
Linux常用命令笔记大全,从入门到精通(持续更新)_第108张图片
Linux常用命令笔记大全,从入门到精通(持续更新)_第109张图片

exit和atexit的实现

#include 
#include 

void Fun1(void) {
	printf("Fun1()\n");
}

void Fun2(void) {
	printf("Fun2()\n");
}

typedef struct  Node {
	void(*f)(void);
	struct 	Node* next;
}Node_t;

Node_t* head = NULL;

int my_atexit(void(*f)(void)) {
	Node_t* p = malloc(sizeof(Node_t));
	p->f = f;
	p->next = NULL;

	if (head == NULL) {
		head = p;
	}
	else {
		p->next = head;
		head = p;
	}
}

void my_exit(int s) {
	fflush(stdout);//刷新缓存

	//换行退出处理程序
	while (head != NULL) {
		head->f();
		head = head->next;
	}

	_exit(s);
}

int main(void) {
	//后注册的先调用
	my_atexit(Fun1);
	my_atexit(Fun2);
	//1. 输出两次
	//printf("alibaba");
	//fork();
	//2.输出一次
	printf("alibaba");
	// fork();
	while (getchar() != '\n')
		;
	my_exit(0);
}

2.8 收取僵尸和父进程回僵尸子进程

收取僵尸

#include 
#include 
//#include 
int main(void) {
	pid_t pid;
	/*
		if((pid=fork())==0){
			int i;
			for(i=0;i<10;i++){
				printf(".");
				fflush(stdout);
				sleep(1);
			}
		}
		else{
	*/
	pid_t r = wait(NULL);
	if (r == -1) {
		printf("r==-1\n");
	}
	else {

		printf("wait return\n");
		for (;;) {
			printf("#");
			fflush(stdout);
			sleep(1);
		}
	}
	//	}
}

父进程进入僵尸子进程
Linux常用命令笔记大全,从入门到精通(持续更新)_第110张图片
小技巧:

  1. readelf -h查看头信息
  2. 在这里插入图片描述
    其中text是代码段,data是初始化的数据段,bss未初始化的数据段
  3. 栈空间的大小只有8M

2.9 如何将进程从磁盘拉到物理内存之中

Linux常用命令笔记大全,从入门到精通(持续更新)_第111张图片
从磁盘之中先拿出来后,之后将其放到虚拟地址空间之中,依据所对应的页表,放入到物理内存之中;如果切换时,将其放入交换区,将新的进程开始运行,再次使用时,从交换区再取出来。

2.10 亲缘性(最优化)

Linux常用命令笔记大全,从入门到精通(持续更新)_第112张图片
服务器都是专用的,不会存在中途切出去后被别的进程打断,数据被清楚掉的情况存在。

2.11 错误信息

  1. setjmplongjmp反馈错误信息,谁需要谁再在进行修改。Linux常用命令笔记大全,从入门到精通(持续更新)_第113张图片
  2. Linux常用命令笔记大全,从入门到精通(持续更新)_第114张图片
    Linux常用命令笔记大全,从入门到精通(持续更新)_第115张图片

你可能感兴趣的:(linux,常用命令)