程序控制 程序建立 程序終止 程序等待 程式替換

2021-09-24 10:14:55 字數 2570 閱讀 4569

程序建立

fork()

vfork()vfork()的子程序不能在main函式中return退出

fork() 和 vfork()clone() 同樣可以建立程序或者執行緒,它的引數更多,功能更強大

在核心中都是呼叫 do_fork() 實現程序的建立,只是引數不同

fork() 要建立 pcb,虛擬位址空間,頁表…

程序終止

程序退出的場景

正常退出:結果符合預期

正常退出:結果不符合預期

異常退出

終止方式:

main函式中return

exit(int statu) 庫函式,退出時重新整理緩衝區

_exit(int statu) 系統呼叫介面,退出時,不會重新整理緩衝區,直接釋放資源,因為不會重新整理緩衝區,所以 printf("hello~~ "); 不會列印

程序等待:等待子程序退出—為了避免產生殭屍程序+獲取子程序返回值

pid_t wait(int *status); :

阻塞等待任意乙個子程序退出,如果當前沒有子程序退出則一直等待

status:用於獲取子程序的退出碼(8位);不關注則置空即可

阻塞:發起乙個系統呼叫完成功能,當前如果不具備完成條件,則等待直到完成功能後返回

非阻塞:當前如果不具備完成條件,則立即報錯返回

pid_t waitpid(pid_t pid, int * statu, int options);

可以等待任意乙個子程序退出/等待指定子程序退出

pid:== -1:等待任意子程序;> 0:等待指定子程序

status:用於獲取子程序的退出碼(8位);不關注則置空即可

options:

返回值:>0:退出的子程序pid、 ==0:當前沒有子程序退出、 <0:出錯

獲取程序退出碼(exit(n) 中的 n):wexitstatus(status) 直接獲取程序退出碼

wtermsig(status) 直接獲取程序退出訊號值

statu & 0x7f == 0(低7位==0表示程式正常退出 否則表示異常退出)

0xff & (statu >> 8) 異常退出才獲取程序退出碼,正常退出退出碼的為0

有些訊號導致的退出會 coredump 這些訊號的退出碼 = 訊號編號+128,因此會將 coredump 位 置1

有些訊號不會導致 coredump,因此 coredump 位為0,低7位儲存的是退出時的訊號值

程式替換:

程式替換:

替換乙個程序所正在執行的程式 – 讓程序的虛擬位址空間對映到記憶體中另乙個程式的**和資料位置 --> 讓子程序執行其他任務(讓子程序背鍋–讓自己執行更穩定)

定義:如何進行程式替換:

l 和 v 的區別:

l 是程式執行引數使用函式的實參平鋪的形式賦予 execl(ls, ls, -l, -a, null);

v是程式執行引數使用字串指標陣列賦予 ar**[0]=ls ar**[1]=-l execl(ls, ar**);

帶 p 不帶 p 的區別:

帶p:程式名稱可以不帶路徑,直接去path環境變數所指定的路徑下找程式 execlp(ls, …);

不帶p:程式名稱必須帶路徑 execl(/bin/ls, …);

帶 e 不帶 e 的區別:

帶e:給程序自定義環境變數 env[0]=「myenv=100」 execle(ls, …, null, env);

不帶e:繼承原有預設的環境變數 execl(ls, …);

自主實現乙個 minishell

Linux程序控制 程序終止 程序等待

目錄 程序終止 程序中退出的方式 void exit int status 與void exit int status 的不同 程序等待 pid t wait int status void waitpid pid t,int status,int options 阻塞與非阻塞 status 判斷程...

Linux程序控制 程序建立

linux下建立程序的方式有三種,通過fork vfork clone系統呼叫實現程序的建立 1.fork fork函式用於建立乙個新的程序,其建立的程序和當前程序為父關係,子程序建立自己的task struct 之後初始化子程序的互斥變數 cpu定時器 自旋鎖 掛起訊號 程序資料結構等並且設定程序...

程序建立,程序等待,程序終止

1 程序建立,2 程序等待,3 程序終止 程序建立被定義為通過父程序建立子程序的過程。fork函式 函式原型 pid t fork void 特點 1.fork函式呼叫一次,返回兩次兩次返回值得區別分別是子程序當中的返回值為0,父程序當中的返回值為新建子程序的id 將id返回給父程序的原因是沒有函式...