程序建立與退出小談

2021-06-04 10:32:22 字數 867 閱讀 1467

個人學習筆記,僅為加深記憶,水平有限,有錯的地方,大家指正。

1、程序建立使用fork()

使用者空間執行fork,陷入核心執行系統呼叫,建立子程序,實現父程序的拷貝,拷貝包括(程序控制塊、頁表)。父程序和子程序的頁表共享物理頁,沒有實現記憶體的拷貝,linux採用了copy-on-write技術,就是子程序執行後如果有往記憶體寫入的操作,作業系統就為子程序拷貝乙份父程序記憶體的資料,父子程序的頁表各自有自己的物理頁相對應。

往往子程序建立以後都是通過exec執行另外的程式,此時釋放從父程序複製過來的全部資源。這種情況就不需要拷貝父程序的大量資料了,cow技術避免了拷貝父程序的大量無用資料。

子程序建立完成後,返回2次,子程序返回0,父程序返回子程序的程序號(pid),pid存放在程序控制塊(task_struct)中。返回後,父子程序各自執行任務。

我們還可以使用vfork()函式建立子程序,vfork()和fork()相比最大的好處是沒有拷貝頁表項.vfork()建立子程序後,父程序只能等待子程序終結或者執行另外程式後,父程序才能繼續執行。

2、exit通常是子程式中用來終結程式的,呼叫後,程序終結。

exit內部機制是怎麼執行的呢。

子程式exit**在使用者空間執行系統呼叫,系統呼叫陷入核心執行,作業系統釋放程序控制塊(pcb)中的資源,包括(頁表項、檔案描述符、訊號量等),此時pcb還存在,然後設定returncode,傳送sigcld訊號給父程序,此時子程序的狀態為zomble(僵死)。

父程序呼叫wait系統呼叫,陷入核心等待子程序傳送的sigcld訊號,接受到後,父程序取得子程序pcb中的errorcode,子程序執行的滴答數資訊,然後wait呼叫返回。

子程序釋放pcb資源,排程合適的程序執行(程序上下文切換),執行另一程序,此時子程序完全消亡。

建立程序並等待程序退出

cereatepross.cpp 定義控制台應用程式的入口點。include stdafx.h include include include include include using namespace std bool findandkillprocessbyname lpctstr strp...

程序的建立,等待,退出,

標頭檔案 include 定義函式 int system const char string 函式說明 system 會呼叫fork 產生子程序,由子程序來呼叫 bin sh c string來執行引數string字串所代表的命令,此命令執行完後隨即返回原呼叫的程序。在呼叫system 期間sigc...

程序等待與退出

程序等待就是等待子程序的狀態改變,獲取子程序的退出狀態碼,允許系統釋放子程序的所有資源,這時候子程序在所有資源才會被釋放掉。程序等待是避免產生殭屍程序的主要方式 程序等待的方式 1.pid t wait int status status 用於獲取子程序 退出狀態碼 返回值是返回退出的子程序pid ...