程序等待和程序替換

2021-08-25 17:33:23 字數 3227 閱讀 7917

程序退出場景

**執行完畢,結果正確退出

**執行完畢,結果錯誤退出

**異常終止

程序退出

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返回給父程序的原因是沒有函式...