原创 Linux-簡單的shell實現

當我們在Linux下打開一個終端時,可以通過在上面輸入一些命令,來實現與終端的互動。例如: 可以看到,當我們輸入一條命令後,終端會等待下一條命令的輸入。這就類似於一個死循環,不停的輸入命令。 在編寫shell解釋器之前,我

原创 數據結構---回溯法解決迷宮問題

回溯法:深度優先搜索,對一個包括有很多個結點,每個結點有很多個搜索分支的問題,把原問題分解爲若干個子問題求解的算法;當搜索到某個結點發現無法在繼續搜索時,就讓搜索過程回溯(回退)到該結點的前一個結點,繼續搜索該結點外的其他尚未搜

原创 Linux--自主shell加強版(支持輸入輸出重定向)

前面我們寫了一個基礎版本的shell,但有些功能沒有實現。這次我們直接在上次的基礎上將代碼稍加修改,使其支持輸入輸出重定向。 過程還是一樣: · 獲取命令行 · 解析命令行 · 創建子進程(fork)

原创 Linux---進程的調度算法

系統中的cpu資源是有限的,當同時有多個進程處於就緒狀態,要競爭cpu資源時,操作系統就要負責完成分配資源的任務。在操作系統中,由調度程序來完成這一選擇分配的工作,調度程序所使用的算法即是調度算法。 調度算法一般有以下幾種:

原创 數據結構---二叉樹的相關操作

提起樹,大家肯定想到了平時生活中見到的樹,它由根、樹枝和樹葉組成。而我們這裏說的樹,其實就是把生活中的樹的模型給顛倒過來了。如下圖所示: 二叉樹是通過上述5種形式的組合或嵌套而形成。 二叉樹的概念: 一棵二叉樹其實是結

原创 Linux---環境變量

基本概念: 環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數,通常具有全局屬性。 例如:當我們在寫c/c++代碼時,我們並不知道所鏈接的動態靜態庫在哪裏,但照樣可

原创 Linux---進程組、作業、會話

1.進程組 每個進程除了有一個進程ID之外,還屬於一個進程組。進程組是一個或多個進程的集合。通常,它們與同一作業相關聯,可以接收來自同一終端的各種信號。每個進程組有一個唯一的進程組ID,可以有一個組長進程。 組長進程的標識是,其

原创 數據結構 --- 二叉樹的先序、中序和後序遍歷(非遞歸版本)

之前,我們寫過二叉樹的一些基本操作,大部分是通過遞歸來實現的。想想看,要是不採用遞歸的方式,我們該如何對二叉樹進行操作? 下面,我們用非遞歸方式完成二叉樹的先序、中序和後序遍歷。 1.通過循環實現樹的先序遍歷 還是我們的那顆二叉

原创 Linux---創建、等待、終止進程

進程創建 父進程通過 fork(), vfork() 函數創建子進程 fork()測試代碼: #include<stdio.h> #include<unistd.h> int main() { printf("Bef

原创 Linux---popen、system函數

system函數 在一個程序中執行命令字符串很方便。例如,我們想把時間和日期放到一份文件中,先用time得到當前日曆時間,接着調用localtime將日曆轉換爲年、月、日、時、分、秒,然後調用strftime對上面結果進行格式化

原创 Linux---模擬實現殭屍進程和孤兒進程

我們先了解一下進程都有哪幾種狀態。 kernel源代碼裏定義了進程的如下狀態: · R 運行狀態(running):表明進程要麼是在運行中要麼是在運行隊列裏。 · S 睡眠狀態(sleeping):意味着進程在等待事件完

原创 數據結構-順序隊列和鏈式隊列的實現

上篇博客說的棧是操作受限制的線性表,同樣的,隊列也是操作受限制的線性表,不同於棧,它的頭和尾兩頭都受限制,只能在一端進行插入(只進不出),我們稱爲隊尾,在另一端進行刪除(只出不進),稱作隊首。 遵循的原則是:”先進先出“(fir

原创 數據結構---多出口迷宮找出一條最短路徑

前面我們實現了基礎版本的迷宮求解,只有一條路徑。現在如果有多個出口,我們該如何去找到一條最短的路徑。 我們先來思考一下我們是如何在一個數組裏找最小值的? 有下面一個數組: 我們可以先把第一個數設爲最小值,然後遍歷數組,拿它

原创 數據結構-順序棧和鏈式棧的實現

棧是一種特殊的線性表,它特殊在對線性表的操作進行了限制,只能在它的一端進行插入和刪除,如下圖所示: 遵循的是“先進後出”(first in last out)的規則,簡稱爲”FILO”。 既然棧也是線性表,那麼線性表的存儲

原创 Linux---淺談進程PCB

在說PCB是什麼之前,我們先了解一下進程到底是什麼。它和程序又有什麼區別? 程序:二進制可執行文件,是一個機器代碼指令和數據的集合,存儲在硬盤裏,是一個靜態的實體。 //指令+數據 進程:是操作系統對一