成为Linux大神——必须要具备的基本技能!
要努力,但不要著急,繁花錦簇,碩果累累,都需要過程!
?
目錄
1.Linux軟件包管理器yum
2.Linux編輯器—vim的使用
2.1vim的基本概念:
2.2vim的基本操作:
2.3vim正常模式命令集:
2.4vim底行模式命令集:
2.5關于vim的配置:
3.Linux編譯器-gcc/g++的使用
3.1gcc如何完成?
4.Linux項目自動化構建工具—make和makefile
5.Linux第一個小程序—進度條
5.1行緩沖區的概念
5.2倒計時小程序
5.3進度條小程序
6.使用git命令行
7.Linux調試器—gdb使用
總結
?1.Linux軟件包管理器yum
1.如何安裝軟件?
yum install?(-y) +? 安裝的軟件名
-y:表示安裝的時候不需要進行詢問是否需要安裝
1.1.軟件安裝舉例:lrzsz
軟件的功能:支持Windows操作系統和Linux操作系統之間進行文件互傳
rz:將Windows操作系統的文件傳輸到Linux操作系統中
sz:?將Linux操作系統的文件傳輸到Windows操作系統中
2.如何查找安裝包?
yum list
3.如何刪除安裝包?
yum remove(-y) +? 刪除的軟件名
-y:表示刪除的時候不需要進行詢問是否需要刪除
2.Linux編輯器—vim的使用
2.1vim的基本概念:
vim是Linux中的編輯器,使用vim這個工具可以使在Linux中編輯代碼更加便捷高效
既然vim用來編輯代碼的工具,那如何使用vim呢?
1.創建文件
2.使用vim打開文件,然后進行編輯
使用vim打開文件——默認界面:?
2.2vim的基本操作:
上面我們已經可以使用vim打開一個文件了,那如何使用vim進行編輯代碼呢?
想要使用vim進行編輯代碼,首先需要了解vim的三種模式:正常模式,插入模式,底行模式
正常模式:vim打開時的默認模式
?插入模式:可以進行編輯代碼
?底行模式:用來退出vim工具
?了解了三種模式后,該如何正確轉換,使用vim寫出代碼呢?
正常模式轉換插入模式:輸入i或a或o
插入模式轉換正常模式:按左上角鍵盤Esc鍵
正常模式轉換底行模式:輸入冒號“ :”
底行模式轉換正常模式:按左上角鍵盤Esc鍵
注:插入模式和底行模式不能進行相互轉換
下面我們就可以使用vim編寫一段代碼了:
2.3vim正常模式命令集:
1.光標定位:
$:移動到光標所在的行尾
^:移動光標到所在行的行首
G:光標移動到末尾
?gg:光標移動到最開始
?n + G:跳轉光標到指定行,n代表行數
2.移動光標:可以使用鍵盤的上下左右鍵或者H J k L鍵
?3.復制/刪除文本:
yy:復制光標所在行的內容
p:粘貼所復制的內容
dd:刪除光標所在行
注:nyy或npp或ndd:支持對文本內容進行多行復制或粘貼或刪除(n代表行數)
ndd + p:剪貼操作(n代表行數)
4.撤銷操作:
u:撤銷上一步操作
ctrl + r:恢復上一步的撤銷
5.文本編輯:
~:可以進行文本內容的大小寫轉換
R:批量化替換
r:替換一個字符
nr:可以同時替換n個字符(n代表個數)
x:行內向后刪除
X:行內向前刪除
注:支持nx或nX,同時刪除n個字符(n代表個數)
6.更改:
cw:更改光標所在處的字到字尾處
ncw:更改n個字
2.4vim底行模式命令集:
set nu :設置行號
?set nonu:取消行號
?w:表示寫入
w!:表示強制寫入
q:表示退出
q!:表示強制退出
wq:表示保存并退出
vs:可以同時打開兩個文件在同一個屏幕上
注:雖然可以在同一個屏幕上打開兩個文件,但是光標只有一個,光標移動到哪個位置,就進行編輯哪個位置的代碼,光標在不同文件切換Ctrl ww
!+命令:可以不用退出vim就可以執行命令
%s///g:指定文本全替換:
替換前:
?
?替換后:
2.5關于vim的配置:
上面我們已經可以通過vim編輯器編寫代碼了,但是編寫的時候會發現,很不好用,比如在寫代碼的時候沒有自動補齊,自動換行,自動縮進等……這是因為默認的vim工具是沒有任何的配置的,需要進行手動配置:
vim普通配置:需要通過網上搜素指令一一進行配置
1.需要在自己家目錄下創建一個文件:.vimrc
2.使用vim打開進行配置:
3.配置的指令可以在網上進行搜索
vim一鍵配置:一鍵配置鏈接
安裝完成后的界面演示:?
3.Linux編譯器-gcc/g++的使用
上面我們已經可以熟練的使用vim工具編寫代碼了,但是當我們寫好代碼后該如何將代碼編譯成可執行程序呢?
下面介紹兩個工具:gcc和g++,分別用來將C語言和C++語言編寫成可執行程序
3.1gcc如何完成?
格式:gcc + 要編譯的文件
gcc將代碼變成可執行程序會執行4個階段:預處理,編譯,匯編,生成可執行程序
預處理:
功能:頭文件的展開,去注釋,宏替換,條件編譯等
預處理指令是以#開頭的代碼行
實例:gcc -E test.c -o test.i
選項:"-E"的功能是在預處理之后停止編譯過程
選項:"-o"是將test.c文件指明為test.i,".i"是經過預處理的C原始程序
?
?
編譯:
功能:將代碼翻譯成匯編語言,然后停下來
實例:gcc -S test.i -o test.s
-S:編譯生成匯編代碼
-o:"-o"是將test.i文件指明為test.s
匯編:
功能:將編輯階段生成的.s文件轉換成可重定向的目標二進制文件
實例:gcc -c test.s -o test.o
-c:從現在開始,生成目標二進制文件就停下來
-o:將test.s文件指明為test.o
鏈接:
功能:將自己寫的代碼和引用庫的函數鏈接起來,生成可執行的二進制程序
實例:gcc test.o -o test
?
上述步驟中,在最后一個鏈接階段會將自己寫的代碼和引用的庫函數鏈接起來,那這些庫函數是什么呢?如何使用這些庫函數呢?這些庫函數又存在在哪里呢?
庫函數:是已經在庫當中實現好的,使用的時候只需要調用就可以了。
如何使用庫函數呢?
使用庫函數時,只需要包含相對應的頭文件就可以了,如:使用printf函數時需要包含頭文件#include<stdio.h>
庫函數又存在在哪里呢?
庫函數存在函數庫中,函數庫一般分為靜態庫和動態庫
動態庫:使用動態庫,這個鏈接過程就叫做動態鏈接
靜態庫:使用靜態庫,這個鏈接過程就叫做靜態鏈接
舉個簡單的例子:上網
現在你有上網的需求,但是家里沒有電腦,需要到網吧上網,到網吧上網的這個過程就可以理解為動態鏈接,使用網吧的電腦就可以理解使用動態庫;
現在你覺得使用一直到網吧使用電腦不方便,然后就在家里買了一臺電腦,在家里上網這個過程可以理解為靜態鏈接,使用家里的電腦可以理解為使用靜態庫;
通過這個例子可以得出一個結論:靜態鏈接的本質就是一份拷貝,相當于例子中的在家里買一臺電腦,而動態鏈接是在使用的時候到指定的地方使用就可以了,相當于例子當中的到網吧上網,不需要進行拷貝
通過動態鏈接和靜態鏈接的特性可以總結出它們的優缺點:
動態鏈接的優點:形成的可執行程序小,節省內存,磁盤和網絡資源
動態鏈接的缺點:當庫升級或刪除時不能再使用
靜態鏈接的優點:不受庫升級等影響
靜態鏈接的缺點:形成的可執行程序大,會消耗很多資源
下面通過指令來觀察一下動態鏈接和靜態鏈接:
1.形成一個可執行程序:
2.通過file指令觀察是動態鏈接還是靜態鏈接:
?注:在Linux在生成的可執行程序默認是動態鏈接的
那如何使用靜態庫呢?
1.首先需要安裝靜態庫,因為默認不包含靜態庫
安裝指令:sudo yum install -y glibc-static?
2.?
?如何區分動態庫還是靜態庫?
?動態庫:是以.so為結尾的
靜態庫:是以.a為結尾的?
靜態鏈接程序和動態鏈接程序的區別:
通過圖片可以觀察出靜態鏈接所占內存遠遠大于動態鏈接形成的二進制程序?
注:關于g++完成程序的編譯與gcc過程相同
4.Linux項目自動化構建工具—make和makefile
make和makefile是什么?
make:是一條命令
makefile:是一個文件
make和makefail的作用是什么?
make的作用:執行makefile文件里面的內容
makefile的作用:在makefile中編寫源文件生成對應的可執行程序的指令
make和makefile如何使用?
在使用之前首先應該理解在makefail中編寫指令遵循依賴關系和依賴方法的原則
舉例說明:依賴關系和依賴方法
假設找你爸打電話要錢,這說明你和你爸之間存在依賴關系,當你給你爸說“我要錢”這句話就是依賴方法
了解了依賴關系和依賴方法之后,接下來就看看Linux系統中如何使用的:
1.創建一個makefile文件:
??2.用vim打開makefile文件編寫指令:
3.使用make命令執行makefile里面的內容:
??4.可以生成可執行程序,那如何清理生成的可執行程序呢?
現在可以使用make指令和makefile文件生成和刪除對應的可執行程序了,但是在清理文件時在makefile中寫的.PHONY又是什么呢?
.PHONY:是一個關鍵字用來修飾對象clean,表示這個對象是一個偽目標
偽目標:該目標總是被執行
下面通過指令現象再解釋:
使用make指令時如果第一次已經形成了可執行程序,該源文件(test.c)?沒有再被更改,則不會再執行make指令。
?相對于make指令,make clean指令總是能被執行,這就是.PHONY這個關鍵字修飾的作用,使得clean這個對象總是被執行
再這里有一個小問題就是第一次生成可執行程序后,gcc為什么知道不需要在重新編譯了呢?
關于這個問題來介紹一下文件的三個時間:Access Modify Change
Modify:內容被修改的時間
Change:屬性修改時間
Access:文件訪問時間
Modeify:
源文件修改之前:
源文件修改之后:
?通過兩圖對比在內容修改后,Modify的時間就被改變了
?Change:
屬性修改之前:
?屬性修改之后:
通過兩圖對比,屬性被修改之后,Change的時間就被改變了
Acess:
?訪問之前:
?訪問之后:
通過兩圖對比,訪問前后時間Access時間發生了改變
注:如果連續頻繁訪問文件內容,Access時間不會發生改變,在底層中Acess時間的改變有一定的時間間隔?
了解了以上三個時間就可以回答,為什么gcc將第一次編譯好的可執行程序不會再進行編譯第二次了,是通過Modify的時間對比來進行判斷的,因為可執行程序的生成一定依賴于源文件,所以源文件的Modify時間肯定比可執行程序時間早,gcc在編譯的時候對比源文件和可執行程序的Modify的時間來確定是否需要重新生成可執行程序
所以.PHONY修飾后能夠被一直執行是因為忽略了通過Modfiy時間進行判斷的準則
注:make命令執行makefile中的命令默認從第一條開始,執行完一條命令之后就停下來!
makefile的推導規則:
執行make命令時根據依賴關系從后往前執行makefile中的命令:
5.Linux第一個小程序—進度條
上面我們已經掌握了如何在Linux上使用vim進行編輯,下面就嘗試著通過所掌握的工具在Linux上寫一個小程序—進度條
5.1行緩沖區的概念
下面先來看一段現象:
?這是什么原因呢?
是因為我們寫的代碼默認放到緩沖區里面,圖一中有‘\n’,‘\n’的作用是告訴緩沖區我的代碼已經寫完了,不用在等了,直接將代碼顯示到顯示器上,圖二沒有‘\n’,緩沖區就一直在等,直到程序運行結束的時候,才會將緩沖區的內容顯示到顯示器上!
解決方法:使用fflush(stdout)刷新緩沖區中的內容
?
5.2倒計時小程序
通過這個小程序再來了解一下回車和換行的概念:
?這段小程序是10秒倒計時,但是打印到顯示器上是從上往下打印的,如何將程序在同一個地方進行打印呢?
解決方案:將‘\n’換成‘\r’,然后再刷新一下緩沖區里面的內容就ok了!?
?為什么將‘\n’,換成‘\r’就可以了呢?
因為‘\n’表示:換行并且回到下一行的最開始!
‘\r’表示:回到光標所在行的最開始!
5.3進度條小程序
有了上面的只是鋪墊,下面就可以正式編寫進度條小程序了
1.建立三個文件:main.c,process.c,process.h
?2.寫一個makefile:
編譯成功:
?3.代碼編寫:
process.c
process.h:
6.使用git命令行
1.什么是git?
git:叫版本控制器,是一個工具,可以用來上傳代碼進行備份!
gitee和github是一個網站
2.安裝git:
yum install -y git
3.在gitee上創建一個倉庫:
4.將創建好的倉庫克隆到本地:?
5..gitignore文件介紹:
?凡是在這個文件內部的后綴,對應的文件,都不會被上傳到gitee上去
注:gitignore中文件的內容可以自己修改,如不想上傳.sln文件,可以增加.sln,在上傳的時候默認就不會上傳.sln的文件了
6..git介紹:
??.git就是本地倉庫,本質就是一個目錄,上傳代碼push的時候就是將.git中的內容同步到gitee上
7.git add .:
將代碼放到.git中
8.git commit -m '提交說明'?
將代碼提交到.git中
注:第一次再提交的時候會注冊自己的用戶名和郵箱:
?9.git push?
將代碼推送到遠端倉庫gitee上?
10.git其它命令
git log:查看提交日志
git mv:重命名
git pull:同步內容
git status:查看文件狀態
7.Linux調試器—gdb使用
上面我們已經學習了如何在Linux操作系統上使用vim進行編寫代碼,以及在使用gcc.g++編譯代碼,除此之外當我們編寫代碼出現問題時,該如何進行調試呢?
下面來介紹一個新的工具gdb,可以使用這個工具進行代碼的調試:
1.gdb工具安裝:
yum install -y gdb
2.開始調試:
gdb + 調試的可執行程序:
?3.退出調試:q?
?注:默認情況下,gdb無法對現在生成的出現進行調試,是因為在Linux操作系統中gcc或g++默認生成的是release版本,所以為了調試,需要對生成可執行程序改為debug版本!
如何生成debug版本呢?
gcc test.c -o test -g :加上-g命令
4.調試命令:
1.查看代碼:l
默認一次顯示10,想從0行開始,l 0,如果代碼沒有顯示完整,可以使用回車鍵繼續顯示
2.打斷點:
b + 打斷點的行數:
?3.查看打斷點的信息:
info b
4.刪除斷點:
d + 斷點編號
斷點編號:
?
?5.開始調試:r
到斷點處停下來
?6.逐過程調試:n
7.逐語句調試:s
?8.斷點跳躍:c
從當前斷點直接運行到下一個斷點處
?9.查看調用堆棧:bt
10.運行完一個函數:finish
?11.查看變量的值:p + 變量
?p + 變量:只能觀察當前的一次,在進入循環值發生變化時,如果想常顯示變量的值使用display
?
?undisplay + 對應的編號:取消常顯示
12跳出循環:until + 循環代碼結束的行數?
總結
本篇文章總結了在Linux系統上如何進行編程的相關問題,這也是我們在使用Linux操作系統必備的基礎知識,掌握好這些基礎知識才能為我們以后深入學習Linux操作系統打下堅實的基礎!
?
總結
以上是生活随笔為你收集整理的成为Linux大神——必须要具备的基本技能!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Docker的深入浅出(入门新手篇)
- 下一篇: 海豚调度(DolphinSchedule