linux系統命令大全分享 linux原理和方法

linux原理和方法,linux系統命令大全分享,金華號帶你了解相關信息 。

linux系統命令大全分享 linux原理和方法

文章插圖
劇本起因無意間用 vim 打開了一個 10 G 的文件,改了一行內容,:w 保存了一下,慢的我喲,耗費的時間夠泡幾杯茶了 。這引起了我的奇怪,vim 打開和保存到底做了啥?
vim — 寫器之神
vim 號稱寫器之神,以極其厲害的擴展性和功能聞名 。vi/vim 作為標準的寫器存在于 Linux 的幾乎每一種發行版里 。vim 的學習曲線有那么一點陡峭的,前期一定有一個磨煉的過程 。
vim 是一個終端寫器,在可視化的寫器橫行的今天,怎么 vim 還如此重要?
因為一些場景非它不可,例如線上服務器終端,除 vi/vim 這種終端寫器,你別無選擇 。
vim 的簡史很悠久,Github 有個文檔歸納了 vim 的簡史進程:vim 簡史,Github 開源代碼:代碼倉庫 。
筆者今天不講 vim 的用法,這種文章網絡隨便搜一大把 。筆者將從 vim 的存儲 IO 原理的角度來剖析下 vim 這種神器 。
思考幾個小問題,讀者如果有興趣,應該繼續往下讀哦:
vim 寫文件的原理是啥,用了啥黑科技嗎?
vim 打開一個 10G 的大型文件,怎么怎么這么慢,里面做了啥?
vim 改寫一個 10G 的大型文件,:w 保存的時候,感覺更慢了?怎么?
vim 貌似會發生多余的文件?~ 文件 ?.swp 文件 ?都是做啥的呢?
劃重要時機:由于 vim 的功能過于厲害,一篇共享開始說不完,本文文章聚焦 IO,從存儲的角度剖析 vim 原理 。
vim 的 io 原理聲明,系統和 Vim 版本如下:操作面板系統版本:Ubuntu 16.04.6 LTSVIM 版本:VIM – Vi IMproved 8.2 (2019 Dec 12, compiled Jul 25 2021 08:44:54)測試文件名:test.txt
vim 只是一個二進制程序而已 。讀者朋友也應該 Github 安裝,編譯,自己調試哦,效果更優質 。
往往一般使用 vim 寫文件很無腦,只要 vim 后面跟文件名就可:
vim test.txt這樣就打開了文件,并且應該進行寫 。這種命令敲下去,往往一般狀態下,我們就能很快在終端很觀看到的文件的內容了 。
Linux 寫器之神 vim 的 IO 存儲原理
這種過程發生了什么?先明確下,vim test.txt 到底是啥意思?
本質只是運行一個叫做 vim 的程序,argv[1] 參數是 test.txt 嘛 。跟你曾經寫的 helloworld 程序沒啥不一樣,只不過 vim 這種程序應該終端人機交互 。
所以這種過程無非只是一個進程初始化的過程,由 main 開始,到 main_loop(后臺循環監聽) 。
1 vim 進程初始化vim 有一個 main.c 的入口文件,main 函數就定義在這里 。首先會做一下操作面板系統有關的初始化( mch 是 machine 的縮寫):
mch_early_init();
之后會,做一下賦值參數,全局變量的初始化:
/*
* Various initialisations shared with tests.
*/
common_init(?ms);
舉個舉例 test.txt 這樣的參數必定要賦值到全局變量中,因為未來是要總是使用的 。
另外類似于命令的 map 表,是靜態定義好了的:static struct cmdname
{
char_u*cmd_name;// name of the command
ex_func_T cmd_func;// function for this command
long_ucmd_argt;// flags declared above
cmd_addr_T cmd_addr_type; // flag for address type
} cmdnames [] = {
EXCMD(CMD_write, "write", ex_write,
EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILE1|EX_ARGOPT|EX_DFLALL|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
ADDR_LINES),
}
劃重要時機::w,:write,:saveas 這樣的 vim 命令,其實是對應到定義好的 c 回調函數:ex_write。ex_write 函數是資料寫入的核心函數 。再例如,:quit 對應 ex_quit,用來退出的回調 。
換句話說,vim 里面支持的類似 :w,的命令,其實在初始化的時候就確認了 。人為的交互只是輸入字符串,vim 進程從終端讀到字符串之后,尋找對應的回調函數,執行就可 。再來,會初始化一些 home 目錄,目前目錄等變量 。
init_homedir(); // find real value of $HOME
// 保存交互參數
set_argv_var(paramp->argv, paramp->argc);
配置一下跟終端窗口展現有關的東西,這部分往往一般是一些終端庫有關的:
// 初始化終端一些配置
termcapinit(params.term); // set terminal name and get terminal
// 初始化光標地點
screen_start(); // don't know where cursor is now
// 獲取終端的一些消息
ui_get_shellsize(); // inits Rows and Columns
再來會加載 .vimrc 這樣的配置文件,讓你的 vim 與眾不一樣 。
// Source startup scripts.
source_startup_scripts(?ms);

推薦閱讀