Unix-Linux 編程實踐教程 第八章 小結
- 執行程序的函數---execvp() execvp中的argv是一個指針數組(數組元素爲指針),最後一個指針需爲NULL;execvp將在環境變量PATH中尋找file。execvp是先擦除當前進程空間的數據,而後再將目標程序代碼從磁盤上載入到當前進程空間。
- 複製當前程序到新的進程空間---fork()。進程調用fork(),轉到內核,內核進行如下操做:
- 分配新的內存塊和內核數據結構
- 複製原來的進程到新的進程
- 向運行進程集添加新的進程
- 將控制權返回給兩個進程(在父進程中,fork()返回值不爲0,在子進程中fork()返回值爲0)
- 等待子進程結束函數---wait()。wait()實際上時阻塞地等待SIGCHILD信號,若是設置了SIGCHILD處理函數,那麼會先執行處理函數,再wait()返回。
- exit()->調用由atexit()或on_exit()註冊的函數->_exit()。
- _exit()流程:
- 關閉全部文件描述符和目錄描述符
- 將該進程的PID設置爲init進程的PID
- 若是父進程調用wait,即通知父進程
- 向父進程發送SIGCHILD
- 已經死亡卻沒有給exi()沒有賦值的進程叫作殭屍(zombie)進程
歡迎關注本站公眾號,獲取更多信息