程序退出場景
**執行完畢,結果正確退出
**執行完畢,結果錯誤退出
**異常終止
程序退出
1.正常退出
從main中return中退出;
呼叫void exit(int status)和 void _exit(int status) ,exit在任意位置呼叫都可以終止程式。
兩者區別:
殭屍程序的產生是因為子程序先行退出,父程序沒有關心子程序的退出狀態,一旦產生殭屍程序,kill -9 也不能殺死,並且我們也需要知道子程序執行任務的情況,是對是錯,還是異常,通過父程序等待的方式,我們可以了解情況,而且父程序**子程序資源,獲取子程序的退出資訊,來避免產生殭屍程序。
以下是等待程序的兩個介面:
父程序呼叫wait獲取子程序的退出狀態
pid_t wait(int *status)
等待任意子程序的退出
對引數的理解:
引數statue所指空間存放子程序的退出狀態,不關心子程序是是什麼原因退出的,可以設定為null;
等待任意子程序的退出,父程序被阻塞,如果沒有子程序推遲,就一直等待,直到子程序退出,所以這種等待方式是阻塞式的;
等待成功,返回被等待的子程序的pid,等待失敗,返回-1
對阻塞的理解:
可以等待任意子程序,也可以等待特定子程序
對引數的理解:
pid:pid = -1,功能與wait相同;pid >0時,等待其程序id與pid相同的子程序
status:和wait的第二個引數功能是一樣的。
options:如果設定為0,那麼這個函式就是阻塞式等待,如果設定為wnohanng,就是非阻塞式等待(非阻塞式等待:父程序在等待子程序的同時也可以做其他的事情)
以下解釋適用於wait和waitpid兩個介面
int* status,是乙個輸出型引數,由作業系統填充,如果不關心子程序的退出狀態資訊,就設定為null,否則作業系統會根據該引數,將子程序的退出資訊反饋給父程序。但它不能當做乙個簡單的整數來看,應當做位圖來看,只看低16位位元位
關於兩個巨集:wifextedhe (status)和 wexitstatus(status)
這兩個巨集對於以上兩個介面都可以用
用這兩個巨集來檢查wait和waitpid所返回子程序的退出狀態;
如果wifextedhe (status)不是0,則子程序正常退出,可以利用 wexitstatus(status)來檢視子程序的退出碼,例如子程序exit(3),那麼, wexitstatus(status)的值就是3。需要強調的是,wexitstatus(status)只能用來檢視正常退出的子程序的而退出碼
如果wifextedhe (status)是0,則子程序異常退出。
用fork建立子程序後,人們往往希望它執行和父程序不一樣的程式,所以子程序
往往呼叫一種exec函式執行另外乙個程式,本質來說要想子程序執行其他程式,就是將虛擬位址和頁表裡面的內容替換掉
實現程序替換的函式介面
六種exec開頭的替換函式:
int execl(const char *path,const char *arg,...) //第乙個引數是要替換的程式的路徑(即要替換的程式在**),接下來的引數都平鋪(一般用於linux指令), ...代表不定引數
int execv(const char *path,char *const argv) //char *const argv引數為指標陣列
//兩者區別:引數如何賦予(平鋪,指標陣列)
**如下:
要替換的而程式:
替換執行**:
結果:
後面跟p的
int execlp (const
char *file,const
char *arg,...)
int execvp(const
char *file,char *const argv)
//與第一組的區別就是不需要告訴作業系統的路徑,只需要告訴要替換的程式名稱即可,會自動到路徑下找(通常用於linux指令)
後面跟e 的
int execle(const
char *path,const
char *arg,...char *const envp)
int execve(const
char *path,char *const argv,char *const envp)
//與第一組的區別:帶e的是使用者自己組織環境變數,第一組的則是繼續父程序的環境變數
這些函式執行成功則開始執行新程式,不會在返回,失敗返回-1
//帶p的,不用跟路徑
execlp("test","test",null);
execvp("test",argv);
//帶e的,自己建立壞境變數
char *env = ;
execle("./test","test",null,env);
execve("./test",argv,env);
程序控制 程序建立 程序終止 程序等待 程式替換
程序建立 fork vfork vfork 的子程序不能在main函式中return退出 fork 和 vfork clone 同樣可以建立程序或者執行緒,它的引數更多,功能更強大 在核心中都是呼叫 do fork 實現程序的建立,只是引數不同 fork 要建立 pcb,虛擬位址空間,頁表 程序終止...
Linux程序控制 2 程序等待 程式替換
我們知道,子程序先退出,父程序如果不管不顧,就會導致殭屍程序,進而造成資源洩漏等嚴重問題 一旦產生殭屍程序,殺人不眨眼 的kill 9也無能為力,因為沒有辦法殺死乙個已經僵死的程序 那麼如何避免產生殭屍程序呢?父程序通過程序等待的方式,子程序資源,獲取子程序退出資訊 這裡先說一下阻塞和非阻塞 阻塞 ...
程序建立,程序等待,程序終止
1 程序建立,2 程序等待,3 程序終止 程序建立被定義為通過父程序建立子程序的過程。fork函式 函式原型 pid t fork void 特點 1.fork函式呼叫一次,返回兩次兩次返回值得區別分別是子程序當中的返回值為0,父程序當中的返回值為新建子程序的id 將id返回給父程序的原因是沒有函式...