Linux系統(tǒng)基礎(chǔ)知識(shí)
Linu__是一套免費(fèi)使用和自由傳播的類Uni__操作系統(tǒng),嚴(yán)格的來講,Linu__ 不算是一個(gè)操作系統(tǒng),只是一個(gè) Linu__ 系統(tǒng)中的內(nèi)核,即計(jì)算機(jī)軟件與硬件通訊之間的平臺(tái)。下面就讓小編帶你去看看Linu__系統(tǒng)基礎(chǔ)知識(shí),希望能幫助到大家!
整理了Linu__全套自學(xué)教程!
為什么要用Linu__?
Linu__極其強(qiáng)大,可以讓聰明人干任何他們想干的事情。
Linu__ 從誕生之日起,它的工作方式就比 Windows 的先進(jìn)。
Linu__ 屬于能勇敢面對(duì)符號(hào)的人。只有符號(hào)才能完全操縱計(jì)算機(jī)。
歐美發(fā)達(dá)國(guó)家的傳統(tǒng)科研單位、黑客們從幾十年前就從事這些行當(dāng)了,使用Linu__/Uni__的習(xí)慣延續(xù)至今。
鼠標(biāo)雖然是很好的工具,但是它的表達(dá)能力是有限的。
你不可能光用鼠標(biāo)就讓電腦完全明白你的意思,它畢竟只有3個(gè)按鈕。所以我們雖然很喜歡鼠標(biāo),但是卻不能完全依賴它。
熟練的Linu__黑客可以很快敲出一行命令,組合系統(tǒng)里面的各種工具來完成一個(gè)任務(wù)。很多工具本身就是一個(gè)黑客工具,壓根就沒考慮windows用戶們,在圖形界面下用起來反而非常麻煩。圖形界面的優(yōu)勢(shì)是數(shù)據(jù)展示方式多樣,劣勢(shì)是從使用者的角度看,它混淆了數(shù)據(jù)展示和數(shù)據(jù)本身。
在Linu__大量工作抽象地看是這樣的:
把一堆數(shù)據(jù)扔進(jìn)一個(gè)程序,得到另一堆數(shù)據(jù),再扔進(jìn)另一個(gè)程序……
不用關(guān)心數(shù)據(jù)展示,它要的是數(shù)據(jù)本身。
什么是 Windows 能干而 Linu__ 干不了的事情?
“Windows 能干而 Linu__ 干不了的事情,那就是不需要干的事情。”
幾乎所有科學(xué)計(jì)算程序,EDA 程序,高性能圖像處理程序都不是基于 Windows 的。
消除學(xué)計(jì)算機(jī)很難的幻覺,勇敢的拿起像 bash, FVWM, Te__, VIM, Emacs, Mutt ……這樣強(qiáng)大的程序,勇敢的面對(duì)符號(hào)。不要再埋怨“Linu__ 為什么不能像 Windows 那樣”,不要再浪費(fèi)時(shí)間試用這樣那樣的程序,不要再忙著升級(jí)。你需要理解 UNI__ 的工作方式,因?yàn)槟鞘谴蠖鄶?shù)科學(xué)家的工作方式。
Linu__運(yùn)維學(xué)習(xí)路線,實(shí)用Linu__教程,推薦學(xué)習(xí)收藏
Linu__操作系統(tǒng)在短短的幾年之內(nèi)得到了非常迅猛的發(fā)展,這與linu__具有的良好特性是分不開的。Linu__包含了UNI__的全部功能和特性。簡(jiǎn)單來說,linu__具有以下主要特性:遵循GNU GPL,開放性,多任務(wù),多用戶,設(shè)備獨(dú)立性,提供了豐富的網(wǎng)絡(luò)功能,可靠的系統(tǒng)安全,良好的可移植性。下面給大家說說Linu__運(yùn)維學(xué)習(xí)路線,實(shí)用LINU__教程推薦大家學(xué)習(xí)收藏。
關(guān)于Linu__運(yùn)維學(xué)習(xí)很多人都有自己不同的理由,我們不妨來分析一下:
Linu__是免費(fèi)的不用花一分錢,能夠節(jié)約大筆的成本;
Linu__是開源的,你可以根據(jù)自已的需要修改源代碼;
Linu__是開放的,有廣泛的社區(qū),關(guān)于Linu__的討論要遠(yuǎn)遠(yuǎn)高于windows操作系統(tǒng);
學(xué)習(xí)Linu__可以更好的掌握計(jì)算機(jī)技術(shù);
Linu__是未來發(fā)展的趨勢(shì),服務(wù)器,手機(jī),掌上電腦,平板機(jī)很多都采用Linu__操作系統(tǒng);
Linu__有非常多的發(fā)行版本,你可以根據(jù)需要做出不同的選擇;
Linu__讓你多了一個(gè)選擇,而且Linu__下的病毒相比Window可以忽略不計(jì);
Linu__是一種自由哲學(xué),一種開源的信仰;
最后Linu__很好玩,可以裝逼,哈哈……
我覺得我有必要把我學(xué)習(xí)linu__的基礎(chǔ)的經(jīng)驗(yàn)分享一下:
1、掌握Linu__基礎(chǔ)
俗話說“思則有備,有備無患”,學(xué)習(xí)之前你先要搭建好學(xué)習(xí)環(huán)境(紅帽RHEL7)然后在虛擬機(jī)安裝它,開始使用它。學(xué)習(xí)Linu__,命令使用是學(xué)習(xí)的前提,就像你和外國(guó)人說話就得說英語(yǔ)不然別人怎么知道你說的是什么。例如:
命令名,選項(xiàng),各個(gè)參數(shù)都作為命令的輸入項(xiàng),都是獨(dú)立的項(xiàng),他們之間必須用空格隔開。Linu__中命令格式如下:
命令名 【選項(xiàng)】 【參數(shù)1】 【參數(shù)2】……
學(xué)習(xí)Linu__,要熟練掌握命令的使用,雖然命令多,但是熟能生巧,在以后的學(xué)習(xí)運(yùn)用中能大大節(jié)約你的時(shí)間。還有學(xué)習(xí)linu__切不可粗心大意,往往一個(gè)小小的空格也會(huì)報(bào)錯(cuò),當(dāng)然在linu__中,大小寫是很敏感的,切記!
2、從基礎(chǔ)入手,切勿眼高手低
linu__如果一旦學(xué)習(xí)一段時(shí)間之后你會(huì)發(fā)現(xiàn)其實(shí)也沒想象中那么難,甚至比windows更簡(jiǎn)單已操作,通常認(rèn)為GLI沒有GUL那么方面用戶操作。因?yàn)槊钚薪缑娴能浖ǔP枰脩粲洃洸僮鱽硗瓿擅?,但是,由于其本身的特點(diǎn),命令行界面要較圖形用戶界面節(jié)約計(jì)算機(jī)系統(tǒng)的資源。所以,熟記命令的前提下,使用命令行界面往往要較使用圖形用戶界面的操作速度要快,這也是你以后玩轉(zhuǎn)Linu__的基本條件之一。
3、多總結(jié),勤思考,多記筆記
如果想學(xué)好Linu__系統(tǒng)知識(shí),不是一天兩天就能學(xué)會(huì)的,也是經(jīng)過一朝一夕,慢慢積累的,這個(gè)過程中要學(xué)會(huì)去總結(jié),多思考,多動(dòng)手去練,去實(shí)踐,在理解的基礎(chǔ)上去記憶,把原理搞懂,把重要的知識(shí)點(diǎn)積累下來,以便在以后的工作中方便查找,當(dāng)做查詢手冊(cè),同時(shí)也能鍛煉我們編寫文檔的能力,對(duì)以后都是有很大幫助的。
4、及時(shí)充電,提高自學(xué)能力
要具備良好的自學(xué)能力,除了老師講的,你還要去考慮老師的知識(shí)點(diǎn)還可以怎樣去擴(kuò)充,這時(shí)候一本好的資料書就非常必要了,把這些基礎(chǔ)的都學(xué)會(huì)了,建議你再去深入學(xué)習(xí)Linu__進(jìn)階技術(shù),不斷的去提高自己。
以上也只是我個(gè)人學(xué)習(xí)經(jīng)驗(yàn)所談,希望我的學(xué)習(xí)經(jīng)驗(yàn)可以幫助到像我原來這樣的新手。學(xué)好linu__基礎(chǔ)要扎實(shí),切不可好高騖遠(yuǎn),踏踏實(shí)實(shí)的去練習(xí)思考。指尖和思維的跳動(dòng)才能跳出linu__的華爾茲!
Linu__系統(tǒng)零基礎(chǔ)編程入門,想當(dāng)大神?這些你都要學(xué)
? 文件和文件系統(tǒng)
文件是Linu__系統(tǒng)中最重要的抽象,大多數(shù)情況下你可以把linu__系統(tǒng)中的任何東西都理解為文件,很多的交互操作其實(shí)都是通過文件的讀寫來實(shí)現(xiàn)的。
? 文件描述符
在Linu__內(nèi)核中,文件是用一個(gè)整數(shù)來表示的,稱為 文件描述符,通俗的來說,你可以理解它是文件的id(唯一標(biāo)識(shí)符)
? 普通文件
? 普通文件就是字節(jié)流組織的數(shù)據(jù)。
? 文件并不是通過和文件名關(guān)聯(lián)來實(shí)現(xiàn)的,而是通過關(guān)聯(lián)索引節(jié)點(diǎn)來實(shí)現(xiàn)的,文件節(jié)點(diǎn)擁有文件系統(tǒng)為普通文件分配的唯一整數(shù)值(ino),并且存放著一些文件的相關(guān)元數(shù)據(jù)。
? 目錄與鏈接
? 正常情況下文件是通過文件名來打開的。
? 目錄是可讀名稱到索引編號(hào)之間的映射,名稱和索引節(jié)點(diǎn)之間的配對(duì)稱為鏈接。
? 可以把目錄看做普通文件,只是它包含著文件名稱到索引節(jié)點(diǎn)的映射(鏈接)
? 進(jìn)程
進(jìn)程是僅次于文件的抽象概念,簡(jiǎn)單的理解,進(jìn)程就是正在執(zhí)行的目標(biāo)代碼,活動(dòng)的,正在運(yùn)行的程序。不過在復(fù)雜情況下,進(jìn)程還會(huì)包含著各種各樣的數(shù)據(jù),資源,狀態(tài)甚至虛擬計(jì)算機(jī)。
你可以這么理解進(jìn)程:它是競(jìng)爭(zhēng)計(jì)算機(jī)資源的基本單位。
? 進(jìn)程、程序與線程
? 程序
程序,簡(jiǎn)單的來說就是存在磁盤上的二進(jìn)制文件,是可以內(nèi)核所執(zhí)行的代碼
? 進(jìn)程
當(dāng)一個(gè)用戶啟動(dòng)一個(gè)程序,將會(huì)在內(nèi)存中開啟一塊空間,這就創(chuàng)造了一個(gè)進(jìn)程,一個(gè)進(jìn)程包含一個(gè)獨(dú)一無二的PID,和執(zhí)行者的權(quán)限屬性參數(shù),以及程序所需代碼與相關(guān)的資料。
進(jìn)程是系統(tǒng)分配資源的基本單位。
一個(gè)進(jìn)程可以衍生出其他的子進(jìn)程,子進(jìn)程的相關(guān)權(quán)限將會(huì)沿用父進(jìn)程的相關(guān)權(quán)限。
? 線程
每個(gè)進(jìn)程包含一個(gè)或多個(gè)線程,線程是進(jìn)程內(nèi)的活動(dòng)單元,是負(fù)責(zé)執(zhí)行代碼和管理進(jìn)程運(yùn)行狀態(tài)的抽象。
線程是獨(dú)立運(yùn)行和調(diào)度的基本單位。
? 進(jìn)程的層次結(jié)構(gòu)(父進(jìn)程與子進(jìn)程)
在進(jìn)程執(zhí)行的過程中可能會(huì)衍生出其他的進(jìn)程,稱之為子進(jìn)程,子進(jìn)程擁有一個(gè)指明其父進(jìn)程PID的PPID。子進(jìn)程可以繼承父進(jìn)程的環(huán)境變量和權(quán)限參數(shù)。
于是,linu__系統(tǒng)中就誕生了進(jìn)程的層次結(jié)構(gòu)——進(jìn)程樹。
進(jìn)程樹的根是第一個(gè)進(jìn)程(init進(jìn)程)。
? 過程調(diào)用的流程:fork & e__ec
一個(gè)進(jìn)程生成子進(jìn)程的過程是,系統(tǒng)首先復(fù)制(fork)一份父進(jìn)程,生成一個(gè)暫存進(jìn)程,這個(gè)暫存進(jìn)程和父進(jìn)程的區(qū)別是pid不一樣,而且擁有一個(gè)ppid,這時(shí)候系統(tǒng)再去執(zhí)行(e__ec)這個(gè)暫存進(jìn)程,讓他加載實(shí)際要運(yùn)行的程序,最終成為一個(gè)子進(jìn)程的存在。
? 進(jìn)程的結(jié)束
當(dāng)一個(gè)進(jìn)程終止時(shí),并不會(huì)立即從系統(tǒng)中刪除,內(nèi)核將在內(nèi)存中保存該進(jìn)程的部分內(nèi)容,允許父進(jìn)程查詢其狀態(tài)(這個(gè)被稱為等待終止進(jìn)程)。
當(dāng)父進(jìn)程確定子進(jìn)程已經(jīng)終止,該子進(jìn)程將會(huì)被徹底刪除。
但是如果一個(gè)子進(jìn)程已經(jīng)終止,但父進(jìn)程卻不知道它的狀態(tài),這個(gè)進(jìn)程將會(huì)成為 僵尸進(jìn)程
? 服務(wù)與進(jìn)程
簡(jiǎn)單的說服務(wù)(daemon)就是常駐內(nèi)存的進(jìn)程,通常服務(wù)會(huì)在開機(jī)時(shí)通過init.d中的一段腳本被啟動(dòng)。
? 進(jìn)程通信
進(jìn)程通信的幾種基本方式:管道,信號(hào)量,消息隊(duì)列,共享內(nèi)存,快速用戶控件互斥。
? 程序,進(jìn)程和線程
現(xiàn)在我們?cè)俅卧敿?xì)的討論這三個(gè)概念
? 程序(program)
程序是指編譯過的、可執(zhí)行的二進(jìn)制代碼,保存在儲(chǔ)存介質(zhì)上,不運(yùn)行。
? 進(jìn)程(process)
進(jìn)程是指正在運(yùn)行的程序。
進(jìn)程包括了很多資源,擁有自己獨(dú)立的內(nèi)存空間。
? 線程
線程是進(jìn)程內(nèi)的活動(dòng)單元。
包括自己的虛擬儲(chǔ)存器,如棧、進(jìn)程狀態(tài)如寄存器,以及指令指針。
在單線程的進(jìn)程中,線程即進(jìn)程。而在多線程的進(jìn)程中,多個(gè)線程將會(huì)共享同一個(gè)內(nèi)存地址空間
? 運(yùn)行一個(gè)進(jìn)程
創(chuàng)建一個(gè)進(jìn)程,在uni__系統(tǒng)中被分為了兩個(gè)流程。
● 把程序載入內(nèi)存并執(zhí)行程序映像的操作:e__ec
● 創(chuàng)建一個(gè)新進(jìn)程:fork
? e__ec
? 最簡(jiǎn)單的e__ec系統(tǒng)調(diào)用函數(shù):e__ecl()
● 函數(shù)原型:
int e__ecl(const char __ path,const chr __ arg,...)
e__ecl()調(diào)用將會(huì)把path所指的路徑的映像載入內(nèi)存,替換當(dāng)前進(jìn)程的映像。
參數(shù)arg是以第一個(gè)參數(shù),參數(shù)內(nèi)容是可變的,但最后必須以NULL結(jié)尾。
● 舉例:
int ret;ret = e__ecl("/bin/vi","vi",NULL);if (ret == -1) { perror("e__ecl");}
上面的代碼將會(huì)通過/bin/vi替換當(dāng)前運(yùn)行的程序
注意這里的第一個(gè)參數(shù)vi,是uni__系統(tǒng)的默認(rèn)慣例,當(dāng)創(chuàng)建、執(zhí)行進(jìn)程時(shí),shell會(huì)把路徑中的最后部分放入新進(jìn)程的第一個(gè)參數(shù),這樣可以使得進(jìn)程解析出二進(jìn)制映像文件的名字。
int ret;ret = e__ecl("/bin/vi","vi","/home/mark/a.t__t",NULL);if (ret == -1) { perror("e__ecl");}
上面的代碼是一個(gè)非常有代表性的操作,這相當(dāng)于你在終端執(zhí)行以下命令:
vi /home/mark/a.t__t
● 返回值:
正常情況下其實(shí)e__ecl()不會(huì)返回,調(diào)用成功后會(huì)跳轉(zhuǎn)到新的程序入口點(diǎn)。
成功的e__ecl()調(diào)用,將改變地址空間和進(jìn)程映像,還改變了很多進(jìn)程的其他屬性。
不過進(jìn)程的PID,PPID,優(yōu)先級(jí)等參數(shù)將會(huì)被保留下來,甚至?xí)A粝滤蜷_的文件描述符(這就意味著它可以訪問所有這些原本進(jìn)程打開的文件)。
失敗后將會(huì)返回-1,并更新errno。
● 其他e__ec系函數(shù)
略,使用時(shí)查找
? fork
通過fork()系統(tǒng)調(diào)用,可以創(chuàng)建一個(gè)和當(dāng)前進(jìn)程映像一模一樣的子進(jìn)程。
● 函數(shù)原型
pid_t fork(void)
調(diào)用成功后,會(huì)創(chuàng)建一個(gè)新的進(jìn)程(子進(jìn)程),這兩個(gè)進(jìn)程都會(huì)繼續(xù)運(yùn)行。
● 返回值
如果調(diào)用成功,
父進(jìn)程中,fork()會(huì)返回子進(jìn)程的pid,在子進(jìn)程中返回0;
如果失敗,返回-1,并更新errno,不會(huì)創(chuàng)建子進(jìn)程。
● 舉例
我們看下面這段代碼
#include #include int main (){ pid_t fpid; //fpid表示fork函數(shù)返回的值 int count=0; printf("this is a process\n"); fpid=fork(); if (fpid < 0) printf("error in fork!"); else if (fpid == 0) { printf("i am the child process, my process id is %d\n",getpid()); printf("我是爹的兒子\n"); count++; } else { printf("i am the parent process, my process id is %d\n",getpid()); printf("我是孩子他爹\n"); count++; } printf("統(tǒng)計(jì)結(jié)果是: %d\n",count); return 0;}
這段代碼的運(yùn)行結(jié)果比較神奇,是這樣的:
this is a processi am the parent process, my process id is 21448我是孩子他爹統(tǒng)計(jì)結(jié)果是: 1i am the child process, my process id is 21449我是爹的兒子統(tǒng)計(jì)結(jié)果是: 1
在執(zhí)行了fork()之后,這個(gè)程序就擁有了兩個(gè)進(jìn)程,父進(jìn)程和子進(jìn)程分別往下繼續(xù)執(zhí)行代碼,進(jìn)入了不同的if分支。
如何理解pid在父子進(jìn)程中不同?
其實(shí)就相當(dāng)于鏈表,進(jìn)程形成了鏈表,父進(jìn)程的pid指向了子進(jìn)程的pid,因?yàn)樽舆M(jìn)程沒有子進(jìn)程,所以pid為0。
● 寫時(shí)復(fù)制
傳統(tǒng)的fork機(jī)制是,調(diào)用fork時(shí),內(nèi)核會(huì)復(fù)制所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu),復(fù)制進(jìn)程的頁(yè)表項(xiàng),然后把父進(jìn)程的地址空間按頁(yè)復(fù)制給子進(jìn)程(非常耗時(shí))。
現(xiàn)代的fork機(jī)制采用了一種惰性算法的優(yōu)化策略。
為了避免復(fù)制時(shí)系統(tǒng)開銷,就盡可能的減少“復(fù)制”操作,當(dāng)多個(gè)進(jìn)程需要讀取他們自己那部分資源的副本時(shí),并不復(fù)制多個(gè)副本出來,而是為每個(gè)進(jìn)程設(shè)定一個(gè)文件指針,讓它們讀取同一個(gè)實(shí)際文件。
顯然這樣的方式會(huì)在寫入時(shí)產(chǎn)生沖突(類似并發(fā)),于是當(dāng)某個(gè)進(jìn)程想要修改自己的那個(gè)副本時(shí),再去復(fù)制該資源,(只有寫入時(shí)才復(fù)制,所以叫寫時(shí)復(fù)制)這樣就減少了復(fù)制的頻率。
? 聯(lián)合實(shí)例
在程序中創(chuàng)建一個(gè)子進(jìn)程,打開另一個(gè)應(yīng)用。
pid_t pid;pid = fork();if (pid == -1) perror("fork");//子進(jìn)程if (!pid) { const char __ args[] = {"windlass",NULL}; int ret; // 參數(shù)以數(shù)組方式傳入 ret = e__ecv("/bin/windlass",args); if (ret == -1) { perror("e__ecv"); e__it(E__IT_FAILURE); }}
上面的程序創(chuàng)建了一個(gè)子進(jìn)程,并且使子進(jìn)程運(yùn)行了/bin/windlas程序。
? 終止進(jìn)程
? e__it()
● 函數(shù)原型
void e__it (int status)
該函數(shù)用于終止當(dāng)前的進(jìn)程,參數(shù)status只用于標(biāo)識(shí)進(jìn)程的退出狀態(tài),這個(gè)值將會(huì)被傳送給當(dāng)前進(jìn)程的父進(jìn)程用于判斷。
還有一些其他的終止調(diào)用函數(shù),在此不贅述。
如果你也很想學(xué)編程,可以來我的C語(yǔ)言/C++編程學(xué)習(xí)基地【Q群:1083154082】!
還有(源碼,零基礎(chǔ)教程,項(xiàng)目實(shí)戰(zhàn)教學(xué)視頻)!帶你入個(gè)門還是簡(jiǎn)簡(jiǎn)單單啦~
涉及:游戲開發(fā)、課程設(shè)計(jì)、常用軟件開發(fā)、編程基礎(chǔ)知識(shí)、黑客等等...
Linu__系統(tǒng)基礎(chǔ)知識(shí)相關(guān)文章:
★ 認(rèn)識(shí)網(wǎng)絡(luò)的基礎(chǔ)知識(shí)教程
Linux系統(tǒng)基礎(chǔ)知識(shí)
上一篇:沒有了