進程控制(創建,等待,終止)

  • 創建進程(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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章