linux shell 的技巧
linux 的程序模型
執行乙個程式
建立乙個程序
父程序和子程序的通訊
forkexecwaitexit
程式:儲存在檔案中的機器指令序列,一般由編譯器將源**編譯成2進製格式的**。
執行乙個程式意味著將這個指令序列載入記憶體然後讓cpu逐條執行這些指令
linux 中:乙個可執行程式是乙個機器指令及其資料的序列
乙個程序是程式執行時的記憶體空間和設定
資料和程式儲存在磁碟檔案中,程式在程序中執行。
程序存在於使用者空間==存放執行的程式和他們的一部分記憶體空間/
ps :檢視使用者空間的內容
pid:每個程序都有乙個唯一標識它的數字。
每個程序都與乙個終端相連,每個程序都有乙個已執行的時間。
ps -a
ps -la
ps -fa
ps -ax : 檢視系統任務程序 to see every process on the system using bsd syntax
核心管理記憶體中的程序和磁碟上的檔案。
檔案包含資料,程序包含可執行**。
程序:記憶體中的一些位元組
linux的記憶體分為系統空間和使用者空間。程序存在於使用者空間。記憶體實際上就是乙個位元組序列,或者乙個很大的陣列。
乙個程序不一定要佔一段連續的記憶體,就像檔案在磁碟被分成小塊,程序在記憶體池中也被分成小塊。
程序也有儲存分配到的記憶體頁面的資料結構。
建立乙個程序:類似建立乙個磁碟檔案,核心找到一些用來存放程式指令和資料的空閒記憶體頁。
核心還要建立資料結構來存放相應的記憶體分配情況和程序屬性
shell 的三個主要功能
1.執行程式
2.管理輸入和輸出
3.可程式設計
shell 具備的功能:
1.執行乙個程式
2.建立乙個程式
3.等待exit()
乙個程式在乙個程序中執行--(程序=一些記憶體和核心中的相應的資料結構)
execvp將程式從磁碟載入程序以便它可以被執行。
核心將新程式載入到當前程序,替代當前程序的**和資料。
在指定路徑查詢並執行乙個檔案execvp
#include
extern char **environ;
int ret=execl(const char *path, const char *arg, ...);
intret=execlp(const char *file, const char *arg, ...);
intret=execle(const char *path, const char *arg,..., char * const envp);
intret=execv(const char *path, char *const ar**);
intret=execvp(const char *file, char *const ar**);
path=路徑名/檔名
file=檔名
arg=字串陣列
ret:-1=失敗
建立程序fork
#include
pid_t ret=fork(void);
ret: -1=失敗,0=返回到子程序,其餘=子程序pid給父程序
等待程序結束wait
#include
#include
pid_t ret=wait(int *status);
status=子程式執行結果
ret:-1=失敗,pid=結束程序的程序id
wait的兩個重要特徵:
1.wait 阻塞呼叫它的程序直到子程序結束
2.wait 返回結束程序的pid
系統呼叫wait() 做了兩件事,wait 暫停呼叫它的程序直到子程序結束,然後wait 取得子程序結束時傳給exit的值
wai()執行兩個操作:通知和通訊。
wait 的重要特徵:
1.wai阻塞呼叫它的程序直到子程式結束。
2.wait 返回結束程序的pid。
用程序程式設計:
函式和程序之間的相似性:
1.execvp/exit 就像call/return, exec/exit
2.全域性變數和fork/exec
程序死亡:exit 和 _exit
exit 是 fork 的你操作,程序通過呼叫exit來停止執行,fork建立新的程序,exit 刪除程序。
exit 重新整理所有的流,然後呼叫atexit和 on_exit 註冊的函式,執行當前系統定義的其他與exit相關的操作。
終止當前程序:_exit()
#include
void _exit(int status);
statue=返回值
_exit 小結:終止當前程序並執行所有必須的清理工作
1.關閉所有檔案描述符和目錄描述符
2.將該程序的pid置為init程序的id
3.如果父程序呼叫wait() 或者 waitpid 來等待子程序的結束,則通知父程序
4.向父程序傳送sigchld.
shell 是一種程式語言。
是一種程式語言直譯器,這個直譯器解釋從鍵盤輸入的命令,也解釋儲存在指令碼中的命令序列。
1.sh的程式設計特徵:變數,i/o和if。。then
指令碼包含的元素
變數:指令碼可以定義變數,用字首 ¥ 取變數的值
使用者輸入: read 命令告訴shell 從標準輸入中讀入乙個字串,可以用 read 來建立互動的指令碼, 也可以從檔案或者管道中讀入資料
控制:if..then..ekse..fi,while, case, for .
環境:指令碼可以使用全域性變數,如 home (主目錄路徑)
程序和程式 編寫命令直譯器sh
shell是乙個管理程序和執行程式的程式,所有常用的shell有三個主要功能。1 執行程式 grep date ls echo和mail都是一些普通程式,用c編寫,並被編譯成機器語言。shell將它們載入記憶體並執行它們。很多人把shell看作乙個程式啟動器。2 管理輸入和輸出 使用 和 符號可以將...
DOS命令解釋程式的編寫
13物聯網 余佳梓 201306104118 一 目的和要求 1.實驗目的 1 認識dos 2 掌握命令解釋程式的原理 3 掌握簡單的dos呼叫方法 4 掌握c語言程式設計初步。2 實驗要求 編寫類似於dos,unix的命令列解釋程式 1 自行定義系統提示符 2 自定義命令集 8 10個 3 使用者...
實驗一 命令解釋程式的編寫
1.實驗目的 1 掌握命令解釋程式的原理 2 掌握簡單的dos呼叫方法 3 掌握c語言程式設計初步。2 實驗要求 編寫類似於dos,unix的命令列解釋程式 1 自行定義系統提示符 2 自定義命令集 8 10個 3 使用者輸入help以查詢命令的幫助 4 列出命令的功能,區分內部還是外部命令 5 使...