程序和程式 編寫命令直譯器 sh

2022-09-10 21:12:24 字數 3589 閱讀 6225

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 使...