對linux中進程建立的一點理解(1)

來源:互聯網
上載者:User
 前幾天,我們作業系統老師講了個關於用fork建立進程的問題。
引用了如下的一個程式:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
  int pid;
  pid=fork();

  if(pid<0)
  {
    fprintf(stderr,"FORK FAILED/n");
    exit(-1);
  }
  else if(pid==0)
    {
      execlp("/bin/ls",NULL);
    }
  else {
    wait(NULL);
    printf("Child Complete/n");
    exit(0);
  }

}

然後講,在最後(也就是if塊語句後)加一句例如 printf("error/n"); 執行該程式之後會列印兩句。

回去之後執行了下,一句error都沒有。
為什麼呢?
fork()是用來建立新進程的一個相當有趣的系統函數。他給人的感覺是調用了一次卻返回了兩次值,在父進程中返回子進程的ID,在子進程中返回了0。也就是在本程式中對子進程和父進程來說pid的值是不一樣的,成功建立子進程的話,父進程中的pid大於零,即執行
wait(NULL); 等待子進程執行完畢然後
printf("Child Complete/n");
然後通過exit(0);退出了
子進程中pid為0,執行 execlp("/bin/ls",NULL); 也就是執行ls來代替當前進程的執行映像,ls程式最終會調用exit函數結束進程。
最終在if塊語句中父進程和子進程都退出了,根本不會去執行最後添加那一句列印語句。
如果你想讓它列印兩句error則只需要將if語句塊去掉。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.