目錄
程序終止
程序中退出的方式
void _exit(int status)與void exit(int status)的不同
程序等待
pid_t wait(int * status)
void waitpid(pid_t, int* status, int options)
阻塞與非阻塞
status
判斷程序是否正常退出
程序終止就是退出乙個程序
程序退出的三個場景
1:正常退出,結果符合預期
2:正常退出,結果不符合預期結果
3:異常退出
1:在main函式中return,退出程序
2:void _exit(int status),退出程序
3:void _exit(int status),退出程序
void _exit(int status)是系統呼叫介面,退出程序時不會重新整理緩衝區,直接釋放資源
void exit(int status)是庫函式,退出程序時會重新整理緩衝區
#include #include #include void func()
int main()
status時退出的返回值,它的作用等會在程序等待中再講
程序等待的作用
程序等待時為了避免殭屍程序的產生,殭屍程序就是處於退出狀態的程序,但是資源沒有得到完全釋放,產生殭屍程序的原因是因為子程序先於父程序退出,而父程序沒有獲取子程序的退出資訊,則該子程序就成為殭屍程序
為了避免這種情況,父程序等待子程序退出,獲取子程序的推出資訊,釋放子程序資源,避免產生殭屍程序
阻塞等待任意乙個子程序的退出,通過status獲取子程序的退出返回值,pit_d wait(int* status)的返回值為子程序的該pid
#include #include #include #include int main()
sleep(10);//為了方便觀察程序的狀態
int status;
wait(&status)
//只有父程序才能走下來
我們在上面提到過wait(int* status)等待任意乙個子程序的退出,那麼就是說wait不僅僅處理的是剛剛退出的程序,只要是在呼叫子程序退出,wait都會獲取子程序的退出返回值,釋放資源
引數的說明:
pid_t:值為-1表示等待任意乙個程序的退出
status:程序退出的返回值
options:值為0則阻塞等待子程序的退出,waitpid( -1, &status, 0) == wait( &status) / 當值為wnohong---將waitpid設定為非阻塞
waitpid的返回值:-1 表示出錯;0 表示沒有子程序退出;>0表示又子程序退出,退出的子程序pid就是它的返回值
阻塞:為了完成功能,發起呼叫,若當前不具備完成完成功能的條件,則一直等待
非阻塞:為了完成功能,發起呼叫,若當前不具備完成功能的條件,則直接報錯
用wait和waitpia獲取status的返回值是,要注意 :status有四個位元組,但是前十六個位元組未使用;返回值放在低十六位中的高八位
因此status的返回值獲取:(status>>8)&0xff( &0xff 只是為了取得低八位)
程序的退出場景大致分為兩種: 正常退出和異常退出 ,若異常退出則此時程序退出的返回值是不可信的,因此在獲取程序退出的返回值時,應該先判斷程序是否時正常推出的
進程是否正常退出的資訊存放在status的低七位中,低七位為0 則表示程序正常退出,反之異常退出
因此獲取status中程序是否正常退出資訊:status & 0x7f
程序控制 程序建立 程序終止 程序等待 程式替換
程序建立 fork vfork vfork 的子程序不能在main函式中return退出 fork 和 vfork clone 同樣可以建立程序或者執行緒,它的引數更多,功能更強大 在核心中都是呼叫 do fork 實現程序的建立,只是引數不同 fork 要建立 pcb,虛擬位址空間,頁表 程序終止...
Linux程序控制(建立 等待 終止)
一 linux程序建立 1.1 fork函式 在linux中fork函式是乙個非常重要的函式,它從已存在程序中建立了乙個新程序。新程序為子程序,而原程序為父程序 include pid t fork void 返回值 自程序中返回0,父程序返回子程序id,出錯返回 1 程序呼叫fork,當控制轉移到...
Linux程序控制 程序建立
linux下建立程序的方式有三種,通過fork vfork clone系統呼叫實現程序的建立 1.fork fork函式用於建立乙個新的程序,其建立的程序和當前程序為父關係,子程序建立自己的task struct 之後初始化子程序的互斥變數 cpu定時器 自旋鎖 掛起訊號 程序資料結構等並且設定程序...