进程(day09)
進程的管理
一、進程的基礎
進程和程序的區別
每個進程有自己的pid、PCB
操作系統上運行的所有進程構成一顆樹。
如何查看這顆樹?
pstree(1)
樹根進程是init pid是 1進程間的親緣關系兩種 父子關系 兄弟關系使用top(1)命令觀察進程的狀態
使用ps(1)命令也可以查看進程。二、進程的創建
父進程創建子進程父進程如何去創建子進程?
父進程調用fork(2),創建新的子進程。
#include <unistd.h>
pid_t fork(void);
功能:創建一個子進程
參數:
void:
返回值:
在父進程中 -1 錯誤 errno被設置
成功 在父進程中 子進程的pid被返回在子進程中 0 被返回寫時復制技術舉例說明 使用fork(2),創建新的子進程
代碼參見 fork.c三、進程的退出
1、注意return和exit(3)的區別
return只是從函數返回。結束函數的生命周期。
exit(3)結束進程的生命周期exit(3)
#include <stdlib.h>
void exit(int status);
功能:使進程正常終止
參數:
status:指定進程的退出狀態碼。
返回值:
返回這個值 status & 0377給父進程
舉例說明 exit(3)的使用
代碼參見 exit.c目前,在bash下執行的程序,這個進程的父進程是bash。2、可以使用atexit(3)或者on_exit(3)向進程注冊函數,在進程退出的時候調用這寫注冊的函數。
從main函數中返回的時候,進程結束了嗎?
進程沒有結束。atexit(3)
#include <stdlib.h>
int atexit(void (*function)(void));
功能:向進程注冊函數,在進程退出的時候被調用
參數:
function:指定遺言函數返回值:
0 成功
非0 失敗注意:
1、同一個函數注冊一次就被調用一次,注冊多次就被調用多次。
2、函數注冊的順序和調用的順序相反
3、注冊的遺言函數被子進程繼承void (*function)(void)舉例說明 使用atexit向進程注冊遺言函數
代碼參見 atexit.con_exit(3)
#include <stdlib.h>
int on_exit(void (*function)(int , void *), void *arg);
功能:注冊一個函數在進程終止的時候被調用
參數:
function:指定了遺言函數的名字
arg:指定了function函數的第二個參數,function的第一個參數是exit(3) 的退出狀態碼。返回值:
0 成功
非0 失敗void (*function)(int , void *)舉例說明 使用on_exit(3)注冊遺言函數
代碼參見 on_exit.c_exit(2)父進程創建子進程,然后父進程馬上退出,子進程還沒有終止的情況下,子進程過繼給init進程。這些子進程被稱為孤兒進程。演示孤兒進程的現象
代碼參見alone.c四、進程資源的回收
在進程終止的時候,會向父進程發送SIGCHLD信號,父進程收到這個信號以后,調用wait(2)家族的函數,去回收子進程的資源。在父進程還沒有回收子進程的資源的時候,這時候,子進程處于僵尸狀態。這時候的子進程稱為僵尸進程。舉例說明僵尸進程 代碼參見zomble.cwait(2)
#include <sys/types.h>
#include <sys/wait.h>
pid_t wait(int *status);
功能:等待進程狀態的改變
參數:
status:如果不為空,存儲子進程的信息。
這個整數可以使用宏來檢測。
WIFEXITED(status) 如果子進程正常終止,返回true。
WEXITSTATUS(status) 返回子進程的退出狀態碼。只有在上邊的宏返回真的時候,被使用
WIFSIGNALED(status) 如果子進程被信號終止,那么返回true
WTERMSIG(status) 只有在上邊的宏為真的情況下使用。返回的是使子進程終止的信號編號。返回值:
-1 錯誤
返回終止的子進程的pid。舉例說明 使用wait(2)回收子進程的資源。
代碼參見 wait.c補充:
如何給進程發送信號,終止進程?
kill -信號編號 pid信號編號 2 3 9pid_t waitpid(pid_t pid, int *status, int options);
功能:等待子進程狀態的改變
參數:
pid:指定了要等待的子進程的pid。
<-1: 等待任意子進程,子進程的組id等于pid的絕對值。
-1:等待任意子進程
0 :等待任意子進程,這寫子進程的組id等于當前進程組id。
>0:pid指定了要等待的子進程pid。status:如果不為空,存儲子進程的信息。
options:可以改變是否等待子進程的終止。
WNOHANG:如果沒有子進程退出,立即返回。
0 如果沒有子進程退出,阻塞等待子進程退出。返回值:
成功 返回子進程的pid
錯誤 -1
如果WNOHANG被指定 。0 代表等待的所有子進程都沒有終止。wait(&s)===waitpid(-1,&s,0)
進程組中有1個或更多個進程。一般情況下子進程和父進程屬于同進程組。總結:
一、進程的基礎
pstree ps top
二、進程的創建 fork(2)三、進程的退出
exit _exit atexit on_exit
孤兒進程四、回收子進程的資源wait waitpid僵尸進程
?
轉載于:https://www.cnblogs.com/Kernel001/p/7732604.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
- 上一篇: 微信小程序 - 实战小案例 - 简易记事
- 下一篇: 《软件需求(第二版)》阅读笔记02