黑马服务器开发之linux基础编程视频——笔记

目录

视频链接:13_软硬链接_哔哩哔哩_bilibili

注:命令操作中的文件名,若是当前文件夹下的文件,可不加路径,若是其他文件夹下的,要添加路径。

1. 命令解析器:shell 

2. Linux 快捷键

3. Linux系统目录结构: 

4. 用户目录:

5. 文件和目录操作

6.用户权限,用户和用户组

7.压缩包的管理

8.软件的安装与卸载

9.vim的使用

10.gcc的使用

11.库的介绍

12.makefile

13.gdb的使用


视频链接:13_软硬链接_哔哩哔哩_bilibili


注:命令操作中的文件名,若是当前文件夹下的文件,可不加路径,若是其他文件夹下的,要添加路径。

1. 命令解析器:shell 

        shell -- unix操作系统
        bash -- Linux操作系统
    本质: 根据命令的名字, 调用对应的可执行程序,shell就是将命令翻译为内核可执行的指令。

2. Linux 快捷键

 1>. 命令和路径补齐:  tab
 2>. 主键盘快捷键:
       1). 历史命令:
            历史命令:        history
            向上遍历:        方向上
            向下遍历:        方向下
      2). 光标移动:
            向左:        ctrl+←
            向右:        ctrl+→
            移动到头部:    ctrl+a
            移动到尾部:    ctrl+e
     3). 删除字符:
          删除光标前边的字符:    ctrl+h   /   backsapce  
          删除光标后边的字符: ctrl+d / delete
          删除光标前的所有内容: ctrl+u​ 
          删除光标后的所有内容: ctrl+k​ 


3. Linux系统目录结构: 


        1>. /  根目录: 
        2>. /bin:        可执行二进制文件,shell命令就在这个文件夹下。

        3>. /boot:        Ubuntu内核和启动文件/boot Ubuntu内核和启动文件 
        4>. /dev:         外部设备的驱动文件。
        5>. /etc:         存放一些系统配置文件,比如用户账号和密码文件,各种服务的起始地址
        6>. /home:    存放所有用户的主目录,当前系统下的所有用户。
        7>. /lib:        系统最基本的动态链接共享库,几乎所有的应用程序都要用到
        8>. /media:    系统自动识别的一些设备,如U盘、光驱...
        9>. /mnt:        用户手动挂载外部设备时,可以选择挂载到mnt下

        10> ./opt :        可选的文件和程序存放目录,给第三方软件放置的目录。
        11>. /root:        管理员文件

       12>. /srv :        服务相关目录。比如网络服务。

       13>  /sys         记录内核信息,虚拟文件系统。

        14>./tmp:         临时目录

       15>. /var:         存放一些变化的文件,比如日志文件

       16 >   /sbin :        和/bin类似,也是存放一些二进制可执行文件。sbin下面的一般是系统开机过程中所需要的命令。是super bin,是管理员使用的程序
        17>. /usr:       存放于系统用户有关的文件,会占用很大的存储空间!类似于windows下的program files目录 

        18>.   /proc:   虚拟文件系统,数据放置到内存中,存放系统运行信息

4. 用户目录:

         1>. 绝对路径: 从根目录开始写 /home/itcast/aa
         2>. 相对路径: bb 相对于当前的工作目录而言
                . -> 当前目录
                .. -> 当前的上一级目录
                - -> 在临近的两个目录直接切换 cd -
        3>. itcast@ubuntu:~$
                    itcast: 当前登录用户
                    @: at 在
                    ubuntu: 主机名
                    ~: 用户的家目录(宿主目录)
                    $: 当前用户为普通用户
                    #: 超级用户 -- root

5. 文件和目录操作

        1> 查看目录下所有文件:

           1) tree 文件夹路径(必须先install tree软件)                                                               

           2)ls -a 文件夹路径(如果要显示当前目录下的文件,可不加路径):显示全部文件,包括隐藏
           3)  ls  -l  文件夹路径(如果......,可不....)   :  列表形式列出目录下文件,不包括隐藏   

             此时若显示目录文件,大小为4096,只是目录所占大小,并不包括目录下其他文件。  

           4)ls   -la : 列表形式列出目录下的全部文件,包括隐藏文件。 相当于 ll(L).

        2> 进入某个目录

             1) cd : 进入家目录                                                                                                                 

             2)cd  - :返回上次的目录                                                                                                   

             3)cd .                                                                                                                                 

             4)  cd ..                                                                                                                                  

             5)  cd  绝对路径或相对路径 ;进入某个文件夹                                                                     

             6)pwd: 查看当前所在路径

        3> 创建目录:

              1)mkdir dirName                                                                                                                

              2)   mkdir dir/dir1/dir2 -p :多级目录

        4> 删除目录:

               1)rmdir  空目录: 删除空目录                                                                                           

               2)rm -r 目录   (-r表示递归删除, 逐步进入目录进行删除) :  删除非空目录                  

               3)rm -ri 目录  (会出现提示:是否删除...)    

        5> 创建文件

                1)touch 文件名   文件名不存在,新建文件;文件名存在,修改文件最后操作时间

        6> 删除文件

                rm 文件名 /    rm -i  文件名 (提示是否删除)

        7> 拷贝文件/目录

                1)拷贝文件:  cp    源文件  目标文件  (目标文件不存在会自动创建,文件存在,则会 用 源文件中的内容覆盖掉原来的内容)
                2)拷贝目录:  cp   源目录   目标目录  -r(实现递归) (目标文件不存在会自动创建,存在,择把源目录增加到目标目录下)

                3)拷贝文件到目录下:cp  源文件  目标目录(存在)

        8> mv 原文件   目标文件

                改名:mv file (存在)  file1(不存在):file 改名为file1                                                      

                           mv dir(存在)  dir1(不存在) :目录改名

                移动:mv file(存在) dir(存在) : file 移动到dir 处                                                          

                           mv dir(存在) dir1 (存在)  :dir  移动到dir1下                                                           

                           mv file(存在)  file1(存在) :file的内容覆盖到fle1,file删除

        9> 查看文件内容

                  1)cat  文件名 ;  (在终端不能全部显示,适合查看短小文件)

                        cat -A 文件名  (显示文件中的空格)
                  2)more 文件名: (可通过回车键显示下一行,按空格键翻页, 按q退出;ctrl+p往前翻页,ctrl+n往后翻页)
                  3)head   -n  文件名 (不写n默认显示前10行,写了n显示n行)
                  4)tail      文件名:显示后10行    

        10> 新建链接文件

                 1)软链接: ln -s  源文件路径  新文件名 (新的iinode,新文件中是源文件的路径,即源文件名,所以源文件路径是绝对路径时,可以把新文件移动到任何文件夹下都可访问该文件)          

                 2)  硬链接:  ln  原文件名  新文件名 ( 共用inode,硬链接数加1)

6.用户权限,用户和用户组

        1> 修改文件或目录权限  --chmod

            1) 文字设定法 

                chmod  who[+|-=]mode  文件名

                who : u -user, 文件所有者

                         g - group, 文件所属组

                         o - other ,其他人

                         a -all ,所有人(不写who表示默认)

                mode: w / r / x/ -   ,写/读/执行/无任何权限

                例:file文件所有者和其他人减去读写权限:  chmod  uo-wr  file

                        file文件所有者加上读权限,其他人加写权限,chmod u+r,o-w file

              2) 数字设置法

                  421:分别表示读写执行,

                 chmod 0文件所有者权限数字 同组用户全新数字 其他用户权限数字  file

                 例:chmod  0777 file    

                        chmod -440 file  : 文件所有者和同组用户减去了读权限,其他不变

           2> 修改文件所有者或所属组  -chown

                  1)修改所有者:chmod 新的所有者  文件名

                  2)修改所有者,所有组:chmod 新的所有者 新的组  文件名

                        注:在etc/passwd 文件下查看所有用户

        3> 文件查找和检索

              1)根据文件属性查找  -find

                     文件名 :        find 查找的目录  -name  "查找的文件名"

                     文件类型:     find 查找的目录 -type 文件类型

                                           文件类型(7种): f / d / l / c / b / p / s /  f普通文件

                     文件大小:       find 查找的目录 -size  10k / -10k /+10k

                                            +: 大于, 如大于10k ,+10k

                                            -:小于, 如小于10k ,-10k

                                                 等于:如等于10k, 10k

                                              单位是k必须小写,单位是M,必须大写。

                                              例:查找家目录大于10k,小于100k, find ~ -size  +10k -size  -100k

                     按日期:  创建日期:find -ctime -n/+n , 例查找一天以内的, find -ctime -1

                                       修改日期:find -mtime -n/+n

                                       访问日期:find -atime -n/+n

                                                           -n: n天以内

                                                           +n: n天以外

                    深度:    find   要查找的目录/  -maxdepth n (层数): 最多搜索n层

                                  find   要查找的目录/  -mindepth n (层数)  :最少搜索n层

                   高级查找:   例:查找指定目录,并列出该目录中的文件详细信息  

                                              如:  find ./ -type d -exec ls -l {} \ ;

                                                        find ./ -type d -ok ls -l {} \ ; //ok比较安全,每次查找都会询问,需要输入y或n

                                                        find ./ -type d |  xargs ls -l (shell命令)

              2)根据文件中内容查找  -grep -r / -w /......

                       grep -r (搜索路径有目录时要加,-r表示递归)   ”查找的内容“  搜索的路径

                        例:家目录下,哪个文件中包含helloworld 字符串的文件,    grep -r "hello world" ~  -n(加上会显示行号)

              3) 总结:

                        find 搜索的路径  -属性类型 属性值 

                        grep 搜索的内容 搜索的路径     

7.压缩包的管理

        1> linux下常见压缩包的格式

             gz -- gzip

             bz2--bzip2

        2>常用压缩命令

            1)  tar - 打包

                参数: c  - 创建压缩文件

                           x - 释放压缩文件

                           v - 打印提示信息

                           f - 指定压缩包的名字

                           z - 使用gzip方式压缩文件            -xxx.tar.gz   用tar进行了打包,然后用gzip方式进行了压缩

                           j - 使用bzip2的方式压缩文件

                压缩:tar 参数  压缩包名字  原材料(可多个目录或文件)。  例:以gz方式压缩:tar  zcvf  test.tar.gz  file dir        

                解压缩:解压到当前文件夹下  tar 参数 压缩包的名字 。例:tar zxvf test.tar.gz

                              解压到指定文件夹下   tar  参数  压缩包的名字  -C 指定路径。 例: tar zxvf test.tar.gz  -C dir

          2) rar:使用前需要先安装 sudo apt-get install rar

               压缩:          rar a 压缩包名 (不用指定后缀) 压缩内容

               解压缩:      rar x 压缩包名  解压目录   

           3)  zip/unzip

                   压缩:    zip 参数 压缩包名(不用指定后缀)  原材料

                                 参数     有目录: -r

                   解压缩:unzip 压缩包的名字  -d  解压缩目录 

练习:1.写出命令查找宿主目录下小于10M大于100k的文件,并将详细信息列到某个目录下

             find ~ -size +100k -size -10M | xargs ls -l  > file

           2.写出查找目录下含有字符串helloworld的文件,并显示行号

              grep -r "helloworld" ~ -n

8.软件的安装与卸载

        1.在线安装

            安装命令:  sudo   apt-get install 安装包的名字

             卸载命令: sudo apt-get remove 软件的名字

             软件列表的跟新:sudo apt-get update

             清除缓存:sudo apt-get clean 

             安装命令执行后,会把安装包先下载到 /var/cache/apt/archives, 然后进行安装。清除缓存便是清除该目录下的安装包

             安装包格式: xxx.deb

        2. 软件安装(ubuntu下的.deb)

             安装:sudo dpkg -i xx.deb

             卸载:sudo dpkg -r 软件的名字

        3.源码安装

            一般这种源码目录下会有readme,根据里边的命令进行安装

9.vim的使用

     1> 命令模式

      保存退出:ZZ

      对齐操作:gg=G

      光标的移动:

                上下左右:                        k j h l

                光标移动到行首:            0 

                光标移动到行尾:            $

                光标移动到文件首部:     gg

                光标移动到文件尾部:     G

                光标移动到某行:            nG

        删除:

                删除光标前字符:X

                删除光标后字符:x

                删除光标后一个单词全部字符:dw

                删除光标后全部字符:d$ / D

                删除光标前全部字符:d0

                删除当前行:dd

                删除n行:ndd (从光标开始记起的n行)

               撤销操作:u

               反撤销:ctrl + r

        复制黏贴和替换:

                复制:yy

                          nyy:n表示数,复制n行

                黏贴:p 黏贴在光标所在位置的下一行

                          P 黏贴在光标所在位置的上一行

                替换:

                        替换一个字符:按下r,然后在按下要替换的字符        

                        替换多个字符:按下R,然后在按下要替换的字符,实现替换

                可视模式:v ,上下左右相当于windows系统下按鼠标选择

                       复制:y

                       删除:d

                       黏贴:p   黏贴到光标后面;P黏贴到光标前面

               查找/搜索:

                       在命令模式下:

                      1)从当前位置向下查找;输入/xxx   然后按回车,按n切换到查找到的下一个,N切换到查找到的上一个

                      2)从当前位置向上查找;输入?xxx   然后按回车,按n切换到查找到的上一个,N切换到查找到的下一个    

                      3)查找一个单词,将光标移动到要查找的单词处,然后按#,然后用n/N切换 

              函数查找:

                       k 

                       精确定位:章节号K

              man 章节数  要查找的内容

                       1   可执行程序或 shell 命令
                       2   系统调用(内核提供的函数)
                       3   库调用(程序库中的函数)
                       4   特殊文件(通常位于 /dev)
                       5   文件格式和规范,如 /etc/passwd

        2> 文本编辑模式

              a: 从光标后开始插入

              A:从光标所在的行最后面开始插入

              i:  从光标前开始插入

              I:从光标所在行首开始插入

              o: 光标所在的下一行开始插入

              O:光标所在的上一行开始插入

              s: 删除光标所在的字符,开始插入

              S:删除光标所在的行,开始插入

        3> 末行模式

             :+ 内容

           1)  保存&退出

             :数字n       :   跳转到n行

             :q!             :退出不保存

             :wq / x      : 退出并保存

             :q              : 退出

             :w             : 保存不退出

          2)替换 

                :s/A/B          ---->  把所在当前行的第一个A 替换 为 B

                :s/A/B/g       ---->  把所在当前行的所有的A 替换 为 B

                :s/A/B/gc      ---->  把所在当前行的所有的A 替换 为 B, 每个替换前都会询问是否替换,

                :m,n/A/B/g    ---->  把m到n行所有的A 替换 为 B    

                :m,n/A/B/gc   ---->  把m到n行所有的A 替换 为 B, 每个替换前都会询问是否替换,    

                :%S/A/B/g    ---->  把该文本下所有的A 替换 为 B 

                :%S/A/B/gc    ---->  把该文本下所有的A 替换 为 B ,每个替换前都会询问是否替换,

          3)分屏

                :sp                 ----> 横向分分1个屏出来,此时屏数为n+1,n为分屏前数目

                :vsp               ----> 竖向分分1个屏出来,此时屏数为n+1,n为分屏前数目

                :vsp  xxx        ----> 新的竖屏打开xxx文件

                :q                   ----> 退出光标所在屏分屏

                ctrl+ww         ----> 按两次实现光标在屏幕间切换

                :qall               ----> 退出所有屏分屏

                :wall               ----> 保存所有屏修改

                :wqall               ----> 保存退出所有屏修改

                注:在终端用vim打开文件时,输入命令vi -O xxx   xxxx xx  ----> 以竖屏方式打开这几个文件

                        在终端用vim打开文件时,输入命令vi -o xxx   xxxx xx  ----> 以横屏方式打开这几个文件  

                        末行模式下执行shell,:! shell命令

4)

1.多行注释:

1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式;

2. 在行首使用上下键选择需要注释的多行;

3. 按下键盘(大写)“I”键,进入插入模式;

4. 然后输入注释符(“//”、“#”等);

5. 最后按下“Esc”键。 注:在按下esc键后,会稍等一会才会出现注释,不要着急~~时间很短的

2.删除多行注释:

1. 首先按esc进入命令行模式下,按下Ctrl + v, 进入列模式;

2. 选定要取消注释的多行;

3. 按下“x”或者“d”. 注意:如果是“//”注释,那需要执行两次该操作,如果是“#”注释,一次即可

5)显示空格

:set list

10.gcc的使用

        1> gcc的工作流程( 整个过程中编译最为耗时)

             1) 预处理:    -E  文件格式转换 xxx.c -> xxx.i (仍然是c文件)

                 工具: gcc调用 预处理器 cpp 完成

                 任务:宏替换;头文件展开;注释去掉;

             2) 编译:        -S  文件格式转换 xxx.i -> xxx.s 

                 任务:高级语言转换为汇编语言

                工具: gcc完成

             3) 汇编:        -c   文件格式转换 xxx.s -> xxx.o      

                  任务:汇编转换为机器语言

                  工具:gcc调用 汇编器 as  完成

             4) 链接:       不需要参数          xxx.o -> xxx(可执行的)

                 工具:gcc调用 链接器 ld  完成

        2> gcc常用参数

             -v/--vision   :  查看版本

             -I                :  指定头文件的路径。使用场景:当.c文件中包含的头文件路径不在同一文件夹下,可通过-I 指定路径

             -c               :  j将汇编文件生成二进制文件,得到1个.o文件

             -o               : 指定生成的可执行文件文件的名字

             -g               : gdb调试的时候加

             -D               : 在编译的时候指定一个宏 ,例gcc example.c -D debug  -o example .相当于在.c文件中添加了#define debug

             -wall           : 添加警告信息

             -On            : 优化代码,n是优化级别:1 ,2,3

11.库的介绍

1.库是什么?

      库是二进制文件xxx.o; 将源代码.c  或 .cpp  ---->二进制的源代码;  将源代码加密

2.库制作出,如何给用户使用?

      将头文件和制作出的库提供给用户

3.静态库的制作和使用 (windows下xxx.lib ,    linux下是 xxx .a)

   1> 命名规则:libxxx.a

        xxx: 用户自己定义,库的名字

    2> 制作步骤:

         原材料: 源代码.c  .cpp 

         .c生成.o :  生成二进制文件,gcc  xx.c  -c 

         将.o打包 :  ar -r libxxx.a  原材料(xx.o)

    3>库的使用:

        1)将头文件和二进制的库文件提供给用户。

        2)用户调用时在程序中包含头文件

        3)gcc编译时 gcc xxx.c  -I(大i)   头文件路径   -L  静态库路径   -l(小L) 静态库的名字(掐头去尾,只要xxx)-o x

             例: gcc test.c -I  ./include   -L ./lib  -l mycal  -o app 

 4.动态库的制作和使用 (windows下xxx.dll ,    linux下是 xxx .so)

     1>命名规则:libxxx.so,     xxx: 用户自己定义,库的名字

     2>制作步骤:1)将原材料(.c)生成.o      gcc 原材料(xx.c)  -c -fpic

                           2) 将.o 打包为.so           gcc -shared -o libxxx.so   原材料(xx.o )

     3> 库的使用:1)提供头文件a.h,和库文件libtest.so给用户

                            2)用户调用时在程序中包含头文件

                            3)gcc编译时 gcc xxx.c  -I(大i)   头文件路径   -L  动态库路径   -l(小L) 动态库的名字(掐头去尾,只要xxx)-o x

     4>解决动态库执行./x时出现报错:

         对于 elf 格式( gcc生成的可执行文件都是elf格式)的可执行程序,库文件加载是由ld-linux.so*(动态加载器)来完成的,它先后搜索elf文件的DT_RPATH段 —— 环境变量LD_LIBRARY_PATH —— /etc/ld.so.cache文件列表 —— /lib/, / usr/lib  目录找到库文件后将其载入内存。

     注: ldd  可执行程序:查看可执行程序运行时需要哪些库。

     1)报错原因:动态加载器在DT_RPATH、LD_LIBRARY_PATH 、/etc/ld.so.cache、 /lib/, / usr/lib 没有加载到需要的动态库

   2)解决方法:可在LD_LIBRARY_PATH 、/etc/ld.so.cache的路径下添加动态库路径

     (1)使用环境变量:

         1. 临时设置(关掉终端后会失效)

          在终端输入:export LD_LIBRARY_PATH=动态库的路径

         上述写法会覆盖  LD_LIBRARY_PATH  中的内容,可将其更改为

            export    LD_LIBRARY_PATH =  动态库的路径 : $  LD_LIBRARY_PATH                       

         :表示拼接,$ 表示取内容。

        2 .永久设置 

         (1)用户级别 (设置完成后只针对于当前用户生效)

             ~./.bashrc ,在这个文件下添加   export LD_LIBRARY_PATH=动态库的路径: $  LD_LIBRARY_PATH

              配置完成后:(1)重启终端  或  (2)输入命令 source ~/.bashrc。目的是为了刷新~./.bashrc

         (2)系统级别  (设置完成后针对于全部用户生效)       

            /etc/profile , 在这个文件下添加 export LD_LIBRARY_PATH=动态库的路径: $  LD_LIBRARY_PATH  

             配置完成后:(1)重启虚拟机  或  (2)输入命令 source  /etc/profile。目的是为了刷新profile    

       (2)更新文件列表 /etc/ld.so.cache

              1. 首先找到一个配置文件 /etc/ld.so.conf, 把动态库的绝对路径添加到文件中

              2. 执行一个命令,sudo idconfig -v (参数-v可不加)

     3. 知识点拓展:系统调用 dlopen   dlclose  dlsym            

  5. 静态库动态库的工作原理和优缺点

     1.静态库的优缺点

        静态库生成过程 : 

                             

         优点:静态库被打包到应用程序中(调用程序和被调用函数打包为一个程序),加载速度快

                  发布程序无需提供静态库,移植方便

        缺点:消耗系统资源,浪费内存(多个程序包含相同的库,当它们加载进内存执行时,内存中有多个相同的库,浪费内存)

                  更新、部署、发布需要重新生成,麻烦。     

    2. 动态库的优缺点  

        优点: 可实现进程间资源共享,可共享一个动态库

                    程序升级简单

                    程序员可控制何时加载动态库 (使用 dlopen   dlclose  dlsym )  

       缺点:加载速度比静态库慢

                 发布程序需要提供依赖的动态库   

12.makefile

         1. make

                gcc   ——编译器, 

                make ——linux自带的构建器,构建的规则在makefile中。make命令执行后,会根据makefile构建的规则执行gcc

        2. 命名规则

                makefile、Makefile

        3. makefile编写的规则

             - 三部分:目标、依赖、命令

                目标:依赖

                (tab缩进)命令   (命令可以没有目标和依赖)

             - makefile中由一条或多条规则组成

        4.  makefile的编写

                1> 第一个版本

app:main.c add.c sub.c mul.c
    gcc main.c add.c sub.c mul.c -o app

                 缺点: 效率低,修改一个文件,所有文件都会被重新编译

                2>第二个版本

app:main.o add.o sub.o mul.o
    gcc main.o add.o sub.o mul.o -o app

main.o:main.c
    gcc  main.c -c 
add.o:add.c
    gcc  add.c -c 
sub.o:sub.c
    gcc  sub.c -c 
mul.o:mul.c
    gcc mul.c -c

               makefile的工作原理:

                检查依赖是否存在,如果不存在向下搜索下边的规则,如果有规则是用来生成查找的依赖的,执行规则中的命令。                                                                         如果存在,则会对比依赖和目标的时间,若目标的时间比依赖的早,则会重新生成目标

                缺点:冗余

               3> 第三个版本:

                   1) 自定义变量:obj=a.o b.o c.o

                       变量的取值:aa = $(obj)    

                    2) makefile自带的变量:大写

                          CPPFLAGS:(是预处理的时候需要加的参数)。

                                赋值:CPPFLAGS=

                          CC   

                     3)自动变量:(只能在规则的命令中使用)

                           $@: 规则中的目标

                           $<:规则中的第一个依赖

                           $^: 规则中所有的依赖 

obj=main.o add.o sub.o mul.o
target=app

$(target):$(obj)
    gcc $(obj) -o $(target)
 
#模式匹配
%.o:%.c
    gcc -c $< -o $@

                缺点:可移植性差

         4> 第四个版本:

               1)使用makefile中的函数(makefile中所有的函数都有返回值)

                    (1)查找指定目录下指定类型的文件  

                                src=$(wildcard ./*.c): 搜索当前目录下所有.c类型的文件,搜索到的字符串保存在src变量里

                    (2)匹配替换

                                 obj = $(patsubst %.c,%.o, $(src)) : 将所有的.c文件后缀替换为.o文件,.c文件是src下的文件;返回的字符串保存在obj

src=$(wildcard ./*.c)
obj=$(patsubst %.c %.o $(src))
target=app

$(target):$(obj)
    gcc $^ -o $@

%.o:%.c
    gcc -c $< -o $@


                  缺点: 不能清理项目     

        5> 第五个版本

             1) 让make生成不是终极目标的目标

                  (1)编写一个清理项目的规则           

#语法规则
目标名:
    命令


例:
clean:    
    rm $(obj) $(target) -f #-f表示强制删除
    #或
    -rm $(obj) $(target) #rm前面加-表示rm执行失败,向下执行其他命令
    
#当clean受到目录下相同名称文件的影响,可用伪目标来解决
.PHONY:clean
clean:
    rm $(obj) $(target) -f #-f表示强制删除

                  执行:make 目标名。如:make clean      

13.gdb的使用

1.生成可调试的可执行程序

  gcc 原材料 -o 可执行程序 -g   -g会保留函数名和变量名。   例:gcc a.c b.c -o app -g     

2.启动gdb

   gdb  可执行程序,例gdb app 

   可执行程序若带参数,传参命令 set args xxx xxx

3.查看源代码

   l = list 

l默认显示main函数下的代码
show listsize查看 list 默认显示的行数
set listsize n设置list 默认显示的行数为 n 行
l   行号显示该行附进的代码
l  函数名显示该函数的代码
l 文件名 :行号显示该文件下该行的代码
l 文件名 :函数显示该文件下该函数的代码

4.设置断点

bb  n (行号)在第n行设置断点 break
b 函数名   在该函数处打断点
b 文件名:行号
b 文件名:函数名 

b n if 变量== val 

例 b 17 if i==val

设置条件断点
ii  b   查看设置的所有的断点info 
d

d num(断点编号)   

 删除第num个断点delete
d num1 num2 ..... 删除num1,num2....的断点
d num1 - num6   删除num1-num6之间的所有断点 
dis

dis num         

设置第num个断点无效disable
dis num1 num2 ..... 设置num1,num2....的断点无效
dis num1 - num6   设置num1-num6之间的所有断点 无效  
ena

ena num         

设置第num个断点生效enable
ena  num1 num2 ..... 设置num1,num2....的断点生效
ena num1 - num6 设置num1-num6之间的所有断点生效

5.调试命令

enter键默认执行上一次输入的命令
r运行到第一个断点处停止run
start运行到main入口,即 { 处
n单步运行,遇到函数跳过next
s进入函数内step
finish退出函数
当函数中无有效断点或无断点才有效
c全速运行continue
until退出循环
当函数中无有效断点或无断点才有效
q退出调试
p 变量名打印当前变量的值
ptype 变量名查看变量的类型
display 变量名每次停止,显示该变量的值
i display 查看所有自动显示的变量
undisplay num 取消第num 个变量的自动显示
set var  变量名=val    调试过程中,如果在循环内打了断点:当i=5时下

14.标准c库函数和linux系统函数的区别

 

通过文件描述符找到 inode 节点,从而在外存找到文件

内核缓冲区默认是8k,其大小可以修改;有了缓冲区后,缓冲区与外存硬盘只交换一次数据。 

 

 15.虚拟地址空间

 

1.用户区

虚拟地址空间,不是物理内存上的空间,而是磁盘上的。程序运行时,通过MMU将虚拟地址映射到物理内存上。

2.内核区

 文件描述符:寻找磁盘文件

16 linux三剑客

grep(global regular expression print)全局正则表达式打印

# grep 选项 模式 文件名

选项	含义
-c	仅列出文件中包含模式的行数。
-i	忽略模式中的字母大小写。
-l	列出带有匹配行的文件名。
-n	在每一行的最前面列出行号。
-v	列出没有匹配模式的行。
-w	把表达式当做一个完整的单字符来搜寻,忽略那些部分匹配的行。

模式 正则表达式或字符串

通配符	功能
c*	将匹配 0 个(即空白)或多个字符 c(c 为任一字符)。
.	将匹配任何一个字符,且只能是一个字符。
[xyz]	匹配方括号中的任意一个字符。
[1-9]   匹配方括号中1-9之间的任意一个字符。
[^xyz]	匹配除方括号中字符外的所有字符。
[!xyz]	匹配除方括号中字符外的所有字符。
^	锁定行的开头。
$	锁定行的结尾。

如果是搜索多个文件,grep 命令的搜索结果只显示文件中发现匹配模式的文件名;而如果搜索单个文件,grep 命令的结果将显示每一个包含匹配模式的行。

sed

awk

awk 命令也是逐行扫描文件(从第 1 行到最后一行),寻找含有目标文本的行,如果匹配成功,则会在该行上执行用户想要的操作;反之,则不对行做任何处理。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值