程序建立
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); :
阻塞等待任意乙個子程序退出,如果當前沒有子程序退出則一直等待pid_t waitpid(pid_t pid, int * statu, int options);status:用於獲取子程序的退出碼(8位);不關注則置空即可
阻塞:發起乙個系統呼叫完成功能,當前如果不具備完成條件,則等待直到完成功能後返回
非阻塞:當前如果不具備完成條件,則立即報錯返回
可以等待任意乙個子程序退出/等待指定子程序退出獲取程序退出碼(exit(n) 中的 n):wexitstatus(status) 直接獲取程序退出碼pid:== -1:等待任意子程序;> 0:等待指定子程序
status:用於獲取子程序的退出碼(8位);不關注則置空即可
options:
返回值:>0:退出的子程序pid、 ==0:當前沒有子程序退出、 <0:出錯
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返回給父程序的原因是沒有函式...