理解 pcntl_fork 函式

nongnong發表於2020-03-22
  • 第一種情況
    for ($n = 1; $n <=3; $n++) {
      $pid = pcntl_fork();
      if($pid==0){
      }elseif ($pid>0){
      }
    }
    sleep(10000);

    根據這程式結構可以看出 當第一次fork後 子程式裡面的程式碼和父程式程式碼一樣,此時pid=12577的子程式裡面相當於,注意 父程式12576 也是一樣的,但是他們的執行順序不確定,受cpu排程
    for ($n = 2; $n <=3; $n++) {
      $pid = pcntl_fork();
      if($pid==0){
      }elseif ($pid>0){
      }
    }
    sleep(10000);
    當pid=12576 第二次迴圈是 產生子程式12578 ,而子程式12577 執行時候又產生子程式12581 因為最後的sleep函式導致每個程式都阻塞,所以出現這樣的程式結構
  • 第二種情況
    for ($n = 1; $n <=3; $n++) {
      $pid = pcntl_fork();
      if($pid==0){
      }elseif ($pid>0){
       sleep(10000);
      }
    }

    出現這種程式結構 是因為 父程式睡眠,最外層才執行一次,而子程式執行會繼續fork出子程式,而它自己睡眠,這樣一直下去就出現這種結構
  • 第三種情況
    for ($n = 1; $n <=3; $n++) {
      $pid = pcntl_fork();
      if($pid==0){
       sleep(10000);
      }elseif ($pid>0){
      }
    }

    這種結構 是因為子程式睡眠 導致子程式無法繼續執行,所以父程式裡三個迴圈建立的三個子程式睡眠,然後父程式退出
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章