- 創建進程(fork)
- 進程的等待(wait)
- 進程終止(exit)
- 封裝fork/wait
1.創建進程(fork)
fork的運行規則:
- 以父進程爲模板,創建子進程
- fork會把父進程的PCB拷貝一份,稍加修改成爲子進程的PCB
- fork會把父進程的虛擬地址空間拷貝一份,作爲子進程的虛擬地址空間
- 父子進程會共用一份代碼和數據,如果發生修改會給拷貝一份數據(寫時拷貝)
- fork有兩個返回值 父進程返回子進程的pid,子進程返回0,在fork之後分別繼續執行
2.進程的等待(wait/waitpid)
進程等待的必要性:
- 如果子進程退出,父進程不關心就會導致殭屍進程,內存泄漏問題
- 如果導致殭屍進程,kill -9都不會殺死,因爲誰也沒辦法殺死一個已經死去的進程
- 父進程要知道交代子進程的任務完成的怎麼樣了
- 父進程通過進程等待的方式,回收子進程資源,獲取子進程退出信息
3.進程終止
正常退出:
- 代碼執行完的情況
- 1.main()函數返回 能刷新緩衝區
0-------正確 非0 -------錯誤- 2.exit 庫函數 本質是調用_exit exit結束前會關閉所有流再調用_exit
- 3._exit 進程退出 系統調用
異常退出:
- ctrl+c 信號終止
4.封裝fork/wait
編寫函數 process_create(pid_t* pid, void* func, void* arg), func回調函數就是子進程執行的入口函數, arg是傳遞給func回調函數的參數.
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
typedef void (*FUNC)(void *);
void func(void* arg)
{
printf("%s\n",arg);
}
void process_create(pid_t* pid, void* func,char* arg)
{
*pid = fork();
if(*pid<0){
perror("error");
exit(-1);
}
else if(*pid == 0){
//child
FUNC funct = (FUNC)func;
funct(arg);
sleep(5);
}
else{
//father
pid_t ret = wait(NULL);
printf("chirld: %d\n",ret);
}
}
int main()
{
pid_t pid;
char* arg = "child";
process_create(&pid,func,arg);
return 0;
}