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