你需要知道的linux基础编程(三)

  1. 其他命令

    1. man man命令(手册共九个章节)
      1. 可执行程序或shell命令
      2. 系统调用(内核提供的函数)
      3. 库调用(程序库中提供的函数)
      4. 特殊文件(通常位于/dev)
      5. 文件格式和规范(如:/etc/passwd)
      6. 游戏
      7. 杂项
      8. 系统管理命令
      9. 内核例程
    2. 设置或查看别名
      1. 查看:alias
      2. 设置:alias pag=‘ps aux | grep’(需要长久有效需要去设置配置文件: .bashrc)
    3. echo(在显示器上显示数据)
      1. 普通的数据:echo 字符串
      2. 显示环境变量:echo $PATH($的作用就是从变量中取值)
      3. 显示上一次程序退出值:echo $?(?最近一次程序退出时的返回值)
    4. 关机/重启(必须使用管理员权限)
      1. poweroff(关机)
      2. reboot(重启)
      3. shut down
        1. 参数:
          1. -t秒数:设定在切换不同的runlevel之前,警告和删除
          2. -k:仅送出警告讯息文字
          3. -r:shutdown之后 重新开机
          4. -h:shutdown之后 关机
          5. -n:不经过init,由shutdown指令本身来做关机动作
          6. -f:重新开机时,跳过fsck指令,不检查档案系统
          7. -F:重新开机时,强迫做fsck检查
          8. -c:将已经正在shutdown的动作取消
        2. 例子:
          1. shutdown -r now 立刻重新开机
          2. shutdown -h now 立刻关机
          3. shutdown -k now 'Hey! Go away! Now….'发出讯息,但没有真的关机
          4. shutdown -t3 -r now 立刻重新开机,但在警告和删除processes之间,延迟3秒
          5. shutdown -h 10:42 ‘Hey! Go away!’ 10:42分关机
          6. shutdown -r 10 ‘Hey! Go away!’ 10分钟后关机
          7. shutdown -c 将刚才下的shutdown指令取消,必须切换值其他的tty
          8. shutdown now 切换至单人操作模式(不加任何选项)
  2. vi --vim

     vim是vi发展过来的一种静态文本编辑器
     vi a.txt
     前提:安装了vim软件
     工作模式:
     	1. 命令模式:打开文件之后,默认进入命令模式
     	2. 编辑模式:需要输入一些命令,切换到编辑模式
     	3. 末行模式:在末行模式下可以输入一些命令
    

    在这里插入图片描述
    vim编辑器的使用

    1. 光标位置的移动
      1. H光标向前移动
      2. J光标向下移动
      3. K光标向上移动
      4. L光标向后移动
      5. 将光标移动到当前行的行首0
      6. 将光标移动到当前行的行末$
      7. 将光标移动到当前文件的开始位置:GG
      8. 将光标移动到当前文件的尾部位置:gg
      9. 将光标移动到当前文件的第几行: 行数 + G
    2. 删除操作(本质是剪切)
      1. 字符的删除
        1. 删除光标后面的字符:x
        2. 删除光标前面的字符:X
      2. 单词的删除(dw)
        将光标移动到单词的第几个字母上,是删除第几个字母以后的内容
      3. 删除光标前面的内容(d0)
      4. 删除光标后面的内容(d$ / D)
      5. 删除光标所在的行(dd)
      6. 删除n行(ndd)
    3. 撤销操作
      1. 撤销操作:u
      2. 反撤销:ctrl + r
    4. 复制和粘贴
      1. 复制
        1. yy复制一行
        2. nyy复制多行
      2. 粘贴
        1. P粘贴到光标所在的当前行
        2. P粘贴到光标所在行的下一行
      3. 剪切 == 删除
    5. 可视模式
      1. 切换到可视模式:v
      2. 选择内容通过移动光标来进行选取HJKL
      3. 操作:
        1. 复制y
        2. 删除d
    6. 查找操作
      1. “/” + 单词 文字向下查找
      2. “?” + 单词 文字向上查找
      3. # ----- 把光标移动到单词的身上,按#键
      4. 遍历的时候快捷键:N/n;
    7. r:替换当前字符
    8. 缩进:
      1. 向右:>>
      2. 向左:<<
    9. man文档的查看
      1. 光标移动到要查看的单词身上
      2. 然后按shift + k会跳转到man文档
      3. 数字加上shift + k会跳到man文档的第几章
    10. 命令模式切换到文本模式(IAOS iaos)
      1. a – 在光标所在位置的后边插入
      2. A – 在当前行的尾部进行插入
      3. i – 在光标所在位置的前面插入
      4. I – 在当前行的行首进行插入
      5. o – 在光标所在行的下边开辟一个新的行
      6. O – 在光标所在行的上边开辟一个新的行
      7. s – 删除光标后面的字符
      8. S – 删除光标所在的行
    11. 末行模式的命令(冒号使从命令模式进入到末行模式)
      1. 数字 光标跳转到多少行

      2. 替换字符串
        /s/要替换的字符串/替换后的字符串(替换第一个)
        /s/要替换的字符串/替换后的字符串/g(当前行全部替换)
        %s/要替换的字符串/替换后的字符串/g(当前的文本全部被替换)
        起始行号,终止行号s/tom/jack/g(起始行和终止行号的文本被替换)

      3. 保存退出

        1. Q:退出
        2. Q!:强制退出
        3. W:保存
        4. Wq:保存退出
        5. X == wq

        在命令模式下保存退出:ZZ

      4. 分屏操作

        1. 水平分屏:

          1. :sp 分屏的是当前的文件
          2. :sp/文件 分屏的是指定文件的内容
        2. 垂直分屏:

          1. :vsp 分屏的是当前的文件
          2. :vsp/文件 分屏的是指定文件的内容
        3. 在两个屏幕之间切换:ctrl + ww

        4. 退出
          保存并退出wq(退出哪一个决定于光标在哪个屏幕中)
          保存并退出所有的wqall

    12. 修改配置文件
      1. 系统级配置文件目录:/etc/vim/vimrc
      2. 用户级配置文件目录:~/.vim/vimrc
  3. gcc编译器

    1. gcc编译器的安装

      1. sudo apt-get install build-essential
      2. 查看版本 gcc --version
    2. 常用编译命令选项
      (-o:指定生成文件的名字
      -D:再编译的时候定义宏
      -I:指定头文件的路径
      -g:gdb调试的时候需要添加该参数
      -O:编译优化,3个等级 -O(1-3)
      -Wall:编译期间输出警告信息)
      假设源程序文件名为test.c

      1. 无选项编译链接
        i. 用法:gcc test.c
        ii. 将test.c预处理、汇编、编译并连接形成可执行文件。未指定输出文件,默认输出文件为a.out
      2. 选项-o
        i. 用法:gcc test.c -o test
        ii. 作用:将test.c预处理、汇编、编译并链接形成可执行文件。-o选项用来指定输出文件的文件名
      3. 选项-E
        i. 用法:gcc -E test.c -o test.i
        ii. 作用:将test.c预处理输出test.i文件
      4. 选项-S
        i. 用法:gcc -S test.i
        ii. 作用:将预处理文件test.i汇编成test.s文件
      5. 选项-c
        i. 用法:gcc -c test.s
        ii. 作用:将汇编输出文件test.s编译输出test.o文件
      6. 无选项链接
        i. 用法:gcc test.o -o test
        ii. 作用:将编译输出文件test.o链接成最终可执行文件test
      7. 选项-O
        i. 用法:gcc -O1 test.c -o test
        ii. 作用:使用编译优化级别1编译程序。级别为1-3,级别越大优化效果越好,但编译时间
    3. 多源文件编译的方法
      假设有多个源文件,基本上由两种编译方法:
      如果由两个源文件为test.c和testfun.c

      1. 多个源文件一起编译
        i. 用法:gcc testfun.c test.c -o test
        ii. 作用:将testfun.c和test.c分别编译后链接成test可执行文件
      2. 分别编译各个源文件,之后对编译输出后的目标文件进行链接
        用法:
        1. gcc -c testfun.c //将testfun.c编译成testfun.o
        2. gcc -c test.c //将test.c编译成test.o
        3. gcc -o testfun.o test.o -o test //将testfun.o和test.o链接成test

      两种方法的比较,第一种方法编译时需要所有文件重新编译,第二种方法可以只重新编译修改的文件,未修改的文件不用重新编译

    4. gcc编译分步详解
      gcc编译c文件一共分为四步,预处理(preprocess),编译(compilation),汇编(assembly)和链接(linking)

      1. 预处理(preprocess)(gcc -e)
        预处理时预处理会展开以#起始的行,包括#if、#ifdef、#ifndef、#else、#elif、#endif、#define、#include、#line、#error、#pragma以及单独的#。其实就是把除了函数(包括main)以外的东西都展开成指定的形式,比如加上行号等,并将头文件里包含的东西所对应的文件(包括子文件)也都写入进去以便调用。同时也会把写在文件里的注释都删除掉
      2. 编译(compilation)(gcc -s)
        编译的作用就是把预处理的文件进行一系列语法分析及优化后生成相应的汇编文件
      3. 汇编(Assembly)(gcc -c)
        汇编就是把生成的汇编指令逐条翻译成机器可识别的形式,即机器码,这一步会产生平台相关性,即决定了在哪种平台下运行
      4. 链接(Linking)(没有参数)
        将生成的目标文件和其所依赖的库文件进行链接,生成一个可执行文件
  4. 静态库的制作

    1. 命名规则
      a. lib + 库的名字 + .a
      libtest.a 库的名字是test
    2. 制作步骤
      1. 生成对应的.o(gcc -c *.c)
      2. 将生成的.o文件打包 ar rcs + 静态库的名字(Libtest.a) + 生成的所有的.o
    3. 发布和使用静态库
      1. 发布静态库
      2. 头文件
    4. 一个完整案例:
      在一个test目录下存放三个目录(include、src、lib)、一个文本文件(main.c)
      1. 在Include目录下建立一个head.h文本
        在这里插入图片描述

      2. 在src目录下建立四个文本文件(add.c、sub.c、mul.c、div.c)
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

      3. 将src里面的四个文本文件用gcc命令生成.o文件

        1. 命令:gcc -c *.c -I…/include
        2. 运行结果:
          在这里插入图片描述
      4. 用刚刚生成.o文件生成静态库(静态库的名字:test)

        1. 命令:ar rcs Libtest.a *.o
        2. 运行结果:
          在这里插入图片描述
      5. 将生成好的静态库移动到lib目录下

        1. 命令:mv Libtest.a …/lib
        2. 运行结果:
          在这里插入图片描述
      6. 进行main.c的文本编辑
        编辑结果:
        在这里插入图片描述

      7. 编译:

        1. 命令:gcc main.c lib/Libtest.a -o main -Iinclude
          gcc main.c -Llib -lLibtest -o main -Iinclude
        2. 运行结果:生成一个可执行问件:
          在这里插入图片描述
      8. 运行:

        1. 命令:./main
        2. 运行结果:
          在这里插入图片描述
    5. 静态库的有缺点(静态库的内容已经被整合到了可执行文件中,在链接阶段静态完成的)
      1. 优点:
        i. 发布程序的时候不需要提供对应的库
        ii. 运行的速度快
      2. 缺点:
        i. 库被打包到应用程序中,导致应用程序体积大
        ii. 库发生了改变,需要重新进行程序的编译
  5. 动态库的制作
    在这里插入图片描述

    1. 命名规则:
      lib + 名字 + .so
    2. 制作步骤
      1. 生成与位置无关的代码(生成与位置无关的.o)
        gcc -fPIC -c *.c -I…/include
      2. 将.o打包成共享库(动态库)
        gcc -shared -o libtest.so *.o -Iinclude
    3. 发布和使用共享库
      生成可执行文件(两种方式):
      1. gcc main.c lib/libtest.so -o main -Iinclude
      2. gcc main.c -Iinclude -L./lib -ltest -o main
      第一种生成的main直接可用,第二种生成的main文件不能用(链接不到动态库)
      ldd命令:查看可执行文件在执行的时候查看所依赖的所有的共享库
    4. 解决程序执行时动态库无法加载的问题
      1. 将生成的动态库拷贝到根目录下的lib目录下(如果生成的动态库和系统的动态库名字一样就会发生覆盖)
      2. 配置环境变量(临时设置关掉终端后再次开启就会失效):
        1. echo $LD_LIBRARY_PATH查看路径
        2. export LD_LIBRARY_PATH=./lib 进行路径的设置(.lib是相对路径)
      3. 修改用户目录下的bashrc文件,用vi bashrc打开,增加一行代码:export LD_LIBRARY_PATH=/home/sjq/test/lib,需要重启终端才会生效
      4. 需要找到动态链接器的配置文件 (/etc/ld.so.conf)
        将动态库的路径写到配置文件中(/home/sjq/test/lib)
        更新 – sudo idconfig -v(参数v的作用是配置信息的输出)
    5. 优缺点(可执行程序在执行的时候需要用动态链接器的进行链接动态库)
      1. 优点:
        1. 执行程序体积小
        2. 动态库更新后,不需要重新更新程序(前提条件是:接口不变)
      2. 缺点:
        1. 发布的时候,需要将动态库提供给用户
        2. 动态库没有被打包的应用程序中,加载速度较慢

下面的是笔者的微信公众号,欢迎关注,会持续更新c++、python、tensorflow、机器学习、深度学习、计算机视觉等系列文章,公众号中含300+本pdf电子书籍,肯定有你需要的一本,关注公众号即可领取哦。
在这里插入图片描述
如果你对JAVA方面感兴趣,可以关注下面JAVAERS公众号,陪你一起学习,一起成长,一起分享JAVA路上的诗和远方。在公众号里面都是JAVA这个世界的朋友,公众号每天会有技术类文章,面经干货,也有进阶架构的电子书籍,如Spring实战、SpringBoot实战、高性能MySQL、深入理解JVM、RabbitMQ实战、Redis设计与实现等等一些高质量书籍,关注公众号即可领取哦。
在这里插入图片描述

发布了41 篇原创文章 · 获赞 95 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/105183140
今日推荐