linux程序控制(編寫命令直譯器)
一、背景
之前在《計算機作業系統》這本書中已經多次接觸了程序這一概念,而程序在作業系統中具體是做什麼的呢?卻沒有實際的與程序發生過互動,因此也就沒有實際的感受。對於我來說程序僅僅停留在概念的層面上:程序是程式執行時的記憶體空間和設定或者說程序就是程式的進行時。沒有過實踐可不好辦,於是就打算進一步的理解程序,為進一步理解程序,就需要對程序進行控制。當然,這個報告中是一些較為簡單的進行控制。 二、
程序的理解
概念層面的程序這裡就不說了。我講講實際一些的,自己理解的程序。
在命令列中輸入ps
,這裡可以看到兩個簡單的程序的資訊。給個引數
-l就可以看到詳細的程序資訊。
,表示這個程序的狀態,s是說
sleep,r
是說running
。uid:程序的使用者id。
pid:程序的程序
id,這個很好理解,程序也需要唯一的數字來標識,和
uid、
gid引入方式類似。
ppid:父程序的
id,也就是呼叫這個程序的程序的
id號。從這裡我就可以看到乙個程序的父程序是誰。
pri:
prior
,程序的優先順序。
ni:程序的
niceness
級別,niceness
級別越高這個程序就越往後排。
sz:size
,程序占用的記憶體大小。
wchan:程序睡眠的原因。剛才也說了,
s列中的
s是表示
sleep
睡眠的。這一列就說明了此程序睡眠的原因。
time:執行時間。
對以上這些名詞也解釋清楚了,可是一台計算機怎麼也不至於就這麼兩個程序在執行吧。肯定是有很多很多的系統程序同時作用的結果。接著用-x
引數就可以看到如下的系統程序。
系統程序實在太多。我只擷取了前面一部分。系統程序大都沒有與終端相連,他們在計算機啟動的時候啟動,而不需要在命令列中啟動他們。 三、
子程序的建立
子程序建立使用系統呼叫fork()
,如此正在執行的程序會一分為二,原程序繼續向下執行,而新建立的子程序也會從建立開始的位置繼續向下執行。
而在背後核心做了許多事情,包括分配新的記憶體塊和核心資料結構,複製原來的程序到新的程序,向執行程序集新增新的程序,將控制返回給兩個程序。這樣兩個程序就兩不相干的繼續朝下執行(並非完全不相干,比如還有父子關係)。 四、
父程序等待子程序執行完畢
此時使用系統呼叫wait()
,這個時候父程序就會等待子程序直到子程序執行完畢了才會繼續執行。這個說起來不直觀。我寫了一段等待程式,以此來理解之前的一些概念。
執行結果是這個樣子的。實際上正如上面寫的,子程序與孫子程序都睡眠了對應的時間。
另外,通過此程式也可以方便的理解之前說到的父子程序在程序id
方面的關係。
看到pid
與ppid
的數字,那麼各個程序間的關係也就一目了然了。
五、程式呼叫
想在乙個程式中呼叫另外一段程式使用庫函式execvp。六、
命令直譯器的實現
先來看看執行結果。
此時一直執行著a.out
這一程式,而ls是
a.out
呼叫的子程式。
以下是實現的程式**:
#include
#include
#include
#include
#define arglen 100
#define argnum 20
void execute(char *list);
char *makestring(char buf);
int main()
} }
void execute(char *list)
else if(re_pid==0)
else
} char *makestring(char buf)
strcpy(cp,buf);
return cp; }
七、總結
程序雖然是計算機中最重要的概念之一,但最為概念方面的程序是非常抽象與難以理解的,而自己進行簡單的程序控制之後就發現程序其實並不很難理解。通過實踐,學習到的概念也才會理解的更快更準。
linux 程序控制
什麼是程序 每乙個程序在系統中都有唯一的id標示它,此id為程序標示符 程序標示符的型別 pit t,其實是乙個無符號整形 乙個程序標示符對應唯一的乙個程序,多個程序標示符可以對應同乙個程式 程序和程式的區別 程式 可執行的二進位制 檔案,這種檔案載入到記憶體中執行就得到了乙個程序 程序 同乙個程式...
Linux程序控制
linux程序控制 獲取pid include include pid t getpdi void 獲取本程序id pdi t getppid vodi 獲取父程序id,及獲取建立子程序的程序id 程序建立 include pid t fork void 建立子程序 呼叫一次返回兩次值 1.父程序中...
Linux 程序控制
1.linux程序 1.1程式和程序 程序控制塊pcb 時間片程序標識 標識號 父程序 init程序 id 為1 1.2程序的執行身份 真實使用者 id 和真實組 id 可以通過函式getuid 和 getgid 獲得 有效使用者 id 和有效組 id 通過函式geteuid 和 getegid 獲...