如何創建一個進程


 

基礎概念

  要想了解進程,我們先看一下什么是程序。

  程序:

    為了完成特定任務的一系列指令的有序集合

    存儲在磁盤上

    程序 : 代碼 + 數據

 

  那么什么時進程呢?

  進程:

    程序的一次動態執行過程

    存儲在內存中

    每個程序都有自己的狀態

    每個進程都有自己的虛擬地址空間

    進程 : 代碼 + 數據 + 堆棧 + PCB

  PCB (進程控制塊)

    pid 進程標識符

    pwd 進程標識符

    ppid 父進程進程號

進程狀態的轉換

進程與內核的互交

  

創建一個進程的一般工作

  1 、分配一個 PID 從小到大找一個未被使用的進程號 (0 - 32768 依機器而定 筆者為 ubuntu 18.04 64bit)

   cat /proc/sys/kernel/pid_max 具體查看方式

    0 號進程時內核進程,它創建 1 號進程、還將物理內存搬到磁盤 和 磁盤搬到物理內存

  2 、分配PCB,拷貝父進程的 PCB的絕大部分數據

  3 、給子進程分配資源

  4 、 復制父進程地址空間

  5 、 將子進程置成就緒狀態,放入就緒隊列

如何創建一個進程

  pid_t fork( void ) ; 

    當返回 0 時 代表的是子進程 , 當返回 >0 時代表的是父進程

  例:

  #include <stdio.h>
  #include <unistd.h>
  #include <stdlib.h>
​
  int main()
  {
      printf("Before Fork\n");
      pid_t pid = fork();
    
      if (pid == 0)
      {   
          printf("child\n");
      }   
      else if (pid > 0)
      {   
          printf("parent\n");
      }
  }
  執行結果:
  Before Fork
  parent
  child 

  為什么會打印兩個 ?不應該打印一個parent 或者是 child 嗎?

    

    先是由父進程打印出 Before Fork ,運行到紅色箭頭處調用 fock 創建出一個子進程

    該子進程也在紅色箭頭處運行,然后兩個進程獨立的運行,

    父進程的fork() 返回 >0 的 數,打印出 parent ;

    子進程 fork() 返回 0 ,打印出 child ;

    打印的順序與系統的進程調度有關。

  fork注意點:

    1 、 fork 父子進程交替進行

    2 、父進程死亡,子進程將變成孤兒進程,由 1號 進程領養

    3 、 子進程死亡,成為僵屍進程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM