你需要知道的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設計與實現等等一些高質量書籍,關注公衆號即可領取哦。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章