http://blog.csdn.net/zs634134578/article/details/20475741
問題聚焦: 進程是Linux作業系統環境的基礎。 本篇討論以下幾個內容,同時也是面試經常被問到的一些問題: 1 複製進程映像的fork系統調用和替換進程映像的exec系列系統調用 2 殭屍進程 3 處理序間通訊的方式之一:管道 4 3種System V進程通訊方式:訊號量,訊息佇列和共用記憶體
fork系統調用 定義: [cpp] view plain copy #include <sys/types.h> #include <unistd.h> pid_t fork( void ); 函數說明: 該函數每次調用返回兩次 在父進程中返回的是子進程的PID,在子進程中返回的是0,由此判斷當前進程是父進程還是子進程(傳回值是0的為子進程) 作用: fork函數複製當前進程 子進程的代碼和父進程完全相同 子進程複製父進程的大部分資料(堆資料,棧資料,待用資料) 寫時複製 父進程中開啟的檔案描述符等在子進程中預設開啟,因此它們的引用變數均+1.
Exec系列系統調用(6個) 在子進程中執行其他程式,即替換當前進程映像,需要使用exec系列函數 定義: [cpp] view plain copy #include <unistd.h> extern char** environ; int execl( const char* path, const char* arg, ... ); int execlp( const char* file, const char* arg, ... ); int execle( cost char* path, const char* arg, ... , char* const envp[] ); int execv( const char* path, char* const argv[] ); int execvp( const char* file, char* const argv[] ); int execve( const char* path, char* const envp[] ); 參數說明: path:指定可執行檔的完整路徑 file:接受檔案名稱,該檔案的具體位置則在環境變數PATH中搜尋 arg:接收可變參數 argv:接收參數數組,它們都會被傳遞給新程式的main函數 envp:用於設定新程式的環境變數,如果未設定,則新程式使用由全域變數environ指定的環境變數
返回: 成功時,不返回;出錯,返回-1,並設定errno 如果沒出錯,則來源程式中exec調用之後的代碼都不會執行,因為此時來源程式已經被exec的參數指定的程式完全替換(包括代碼和資料)
exec函數不會關閉原程式開啟的檔案描述符,除非該檔案描述符被設定了類型SOCK_CLOEXEC的屬性。
殭屍進程 殭屍進程:兩種情況導致子進程導致殭屍態 如果父進程需要查詢子進程的退出狀態,那麼子進程結束後,核心不會立即釋放該進程的進程表表項,以滿足父進程後續對該子進程退出資訊的查詢。在子進程結束之後,父進程讀取其退出狀態之前,該子進程處於殭屍態。 如果父進程退出或異常終止,而子進程繼續運行,此時子進程的PPID(父進程PID)被設定成1,即init進程,即init進程接管了該進程,並等待它結束。在父進程退出之後,子進程退出之前,該子進程處於殭屍態。 即:父進程沒有正確處理子進程的返回資訊,將導致子進程處於殭屍態,佔據核心資源,造成核心資源的浪費。 下面介紹的函數,就是為了立即結束子進程的殭屍態。 [cpp] view plain copy #include <sys/types.h> #include <sys/wait.h> pid_t wait( int* stat_loc ); pid_t waitpid( pid_t pid, int* stat_loc, int options ); 函數說明: wait函數:阻塞該進程,直到某個子進程結束運行為止。返回子進程的PID,並將該子進程的退出狀態資訊儲存於stat_loc參數指向的記憶體中。 sys/wait.h標頭檔中定義了幾個宏,解釋子進程的退出狀態資訊