精品日韩在线,日韩精品福利一区二区三区,日韩午夜黄色,国产日韩欧美高清免费

始創于2000年 股票代碼:831685
咨詢熱線:0371-60135900 注冊有禮 登錄
  • 掛牌上市企業
  • 60秒人工響應
  • 99.99%連通率
  • 7*24h人工
  • 故障100倍補償
您的位置: 網站首頁 > 幫助中心>文章內容

linux fork函數的精辟解說

發布時間:  2012/8/25 17:29:44

不妨簡單理解為,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前操作系統中一個進程的情況。

  #include ;

  #include ;

  main ()

  {

  pid_t pid;

  pid=fork();

  if (pid < 0)

  printf("error in fork!");

  else if (pid == 0)

  printf("i am the child process, my process id is %dn",getpid());

  else

  printf("i am the parent process, my process id is %dn",getpid());

  }

  結果是

  [root@localhost c]# ./a.out

  i am the child process, my process id is 4286

  i am the parent process, my process id is 4285

  我就想不到為什么兩行都打印出來了,在我想來,不管pid是多少,都應該只有一行才對

  chg.s 回復于:2004-04-27 21:09:30

  要搞清楚fork的執行過程,就必須先講清楚操作系統中的“進程(process)”概念。一個進程,主要包含三個元素:

  o. 一個可以執行的程序;

  o. 和該進程相關聯的全部數據(包括變量,內存空間,緩沖區等等);

  o. 程序的執行上下文(execution context)。

  不妨簡單理解為,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前操作系統中一個進程的情況。對于單 CPU的情況而言,每一特定時刻只有一個進程占用 CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。

  一個稱為“程序計數器(program counter, pc)”的寄存器,指出當前占用 CPU的進程要執行的下一條指令的位置。

  當分給某個進程的 CPU時間已經用完,操作系統將該進程相關的寄存器的值,保存到該進程在進程表中對應的表項里面;把將要接替這個進程占用 CPU的那個進程的上下文,從進程表中讀出,并更新相應的寄存器(這個過程稱為“上下文交換(process context switch)”,實際的上下文交換需要涉及到更多的數據,那和fork無關,不再多說,主要要記住程序寄存器pc指出程序當前已經執行到哪里,是進程上下文的重要內容,換出 CPU的進程要保存這個寄存器的值,換入CPU的進程,也要根據進程表中保存的本進程執行上下文信息,更新這個寄存器)。

  好了,有這些概念打底,可以說fork了。當你的程序執行到下面的語句:

  pid=fork();

  操作系統創建一個新的進程(子進程),并且在進程表中相應為它建立一個新的表項。新進程和原有進程的可執行程序是同一個程序;上下文和數據,絕大部分就是原進程(父進程)的拷貝,但它們是兩個相互獨立的進程!此時程序寄存器pc,在父、子進程的上下文中都聲稱,這個進程目前執行到fork調用即將返回(此時子進程不占有CPU,子進程的pc不是真正保存在寄存器中,而是作為進程上下文保存在進程表中的對應表項內)。問題是怎么返回,在父子進程中就分道揚鑣。

  父進程繼續執行,操作系統對fork的實現,使這個調用在父進程中返回剛剛創建的子進程的pid(一個正整數),所以下面的if語句中pid<0, pid==0的兩個分支都不會執行。所以輸出i am the parent process…

  子進程在之后的某個時候得到調度,它的上下文被換入,占據 CPU,操作系統對fork的實現,使得子進程中fork調用返回0。所以在這個進程(注意這不是父進程了哦,雖然是同一個程序,但是這是同一個程序的另外一次執行,在操作系統中這次執行是由另外一個進程表示的,從執行的角度說和父進程相互獨立)中pid=0。這個進程繼續執行的過程中,if語句中 pid<0不滿足,但是pid==0是true。所以輸出i am the child process…

  我想你比較困惑的就是,為什么看上去程序中互斥的兩個分支都被執行了。在一個程序的一次執行中,這當然是不可能的;但是你看到的兩行輸出是來自兩個進程,這兩個進程來自同一個程序的兩次執行。

  我的天,不知道說明白了沒……

  zhaojinbo 回復于:2004-04-28 12:35:50

  fork 之后,操作系統會復制一個與父進程完全相同的子進程,雖說是父子關系,但是在操作系統看來,他們更像兄弟關系,這2個進程共享代碼空間,但是數據空間是互相獨立的,子進程數據空間中的內容是父進程的完整拷貝,指令指針也完全相同,但只有一點不同,如果fork成功,子進程中 fork的返回值是0,父進程中fork的返回值是子進程的進程號,如果fork不成功,父進程會返回錯誤。

  可以這樣想象,2個進程一直同時運行,而且步調一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因。

  至于那一個最先運行,可能與操作系統有關,而且這個問題在實際應用中并不重要,如果需要父子進程協同,可以通過原語的辦法解決。

  sniper 回復于:2004-04-28 22:11:15

  哦,偶明白了,在程序段里用了fork();之后程序出了分岔,派生出了兩個進程。具體哪個先運行就看該系統的調度算法了。

  在這里,我們可以這么認為,在運行到"pid=fork();"時系統派生出一個跟主程序一模一樣的子進程。該進程的"pid=fork();"一句中pid得到的就是子進程本身的 pid;子進程結束后,父進程的"pid=fork();"中pid得到的就是父進程本身的pid。因此改程序有兩行輸出。

  注:此處不準確,在子進程中pid的值為0,通過getpid可以獲取子進程的進程id;在父進程中pid為父進程編號。

  勘誤:父進程中的pid值為子進程進程號,只有父進程執行的getpid()才是他自己的進程號。寒,徹底的in了

  jjl3 回復于:2004-07-14 11:43:20

  我做如下修改

  #include ;

  #include ;

  main ()

  {

  pid_t pid;

  printf("fork!"); // printf("fork!n");

  pid=fork();

  if (pid < 0)

  printf("error in fork!");

  else if (pid == 0)

  printf("i am the child process, my process id is %dn",getpid());

  else

  printf("i am the parent process, my process id is %dn",getpid());

  }

  結果是

  [root@localhost c]# ./a.out

  fork!i am the child process, my process id is 4286

  fork!i am the parent process, my process id is 4285

  但我改成printf("fork!n");后,結果是

  [root@localhost c]# ./a.out

  fork!

  i am the child process, my process id is 4286

  i am the parent process, my process id is 4285

  為什么只有一個fork!打印出來了?上一個為什么有2個?

  bashfulboy 回復于:2004-07-14 22:10:52

  我也來一下:

  wujiajia 的理解有些錯誤,

  printf("AAAAAAAA");//print 一次; 這里會print 2次

  如果你將 printf("AAAAAA") 換成 printf("AAAAAAn") 那么就是只打印一次了。

  主要的區別是因為有了一個 n 回車符號

  這就跟Printf的緩沖機制有關了,printf某些內容時,操作系統僅僅是把該內容放到了stdout的緩沖隊列里了,并沒有實際的寫到屏幕上

  但是,只要看到有 n 則會立即刷新stdout,因此就馬上能夠打印了。

  運行了printf("AAAAAA") 后, AAAAAA 僅僅被放到了緩沖里,再運行到fork時,緩沖里面的 AAAAAA 被子進程繼承了

  因此在子進程度stdout緩沖里面就也有了 AAAAAA.

  所以,你最終看到的會是 AAAAAA 被printf了2次!!!!

  而運行 printf("AAAAAAn")后, AAAAAA 被立即打印到了屏幕上,之后fork到的子進程里的stdout緩沖里不會有 AAAAAA 內容

  因此你看到的結果會是 AAAAAA 被printf了1次!!!!

  (精要)

  albcamus 回復于:2005-03-08 15:56:11

  >;>;派生子進程的pid變量并沒有被改變是什么意思 對于子進程來講pid不就是0嗎

  1,派生子進程的進程,即父進程,其pid不變;

  2,對子進程來說,fork返回給它0,但它的pid絕對不會是0;之所以fork返回0給它,是因為它隨時可以調用getpid()來獲取自己的pid;

  3,樓上的樓上的你的觀點是對的,fork之后夫子進程除非采用了同步手段,否則不能確定誰先運行,也不能確定誰先結束。認為子進程結束后父進程才從fork返回的,這是不對的,fork不是這樣的,vfork才這樣。VFORK調用結束后,父進程處于非可中斷狀態,直到子進程運行結束返回。


本文出自:億恩科技【www.zuiquanben.com】

  #include ;

  #include ;

  main ()

  {

  pid_t pid;

  pid=fork();

  if (pid < 0)

  printf("error in fork!");

  else if (pid == 0)

  printf("i am the child process, my process id is %dn",getpid());

  else

  printf("i am the parent process, my process id is %dn",getpid());

  }

  結果是

  [root@localhost c]# ./a.out

  i am the child process, my process id is 4286

  i am the parent process, my process id is 4285

  我就想不到為什么兩行都打印出來了,在我想來,不管pid是多少,都應該只有一行才對

  chg.s 回復于:2004-04-27 21:09:30

  要搞清楚fork的執行過程,就必須先講清楚操作系統中的“進程(process)”概念。一個進程,主要包含三個元素:

  o. 一個可以執行的程序;

  o. 和該進程相關聯的全部數據(包括變量,內存空間,緩沖區等等);

  o. 程序的執行上下文(execution context)。

  不妨簡單理解為,一個進程表示的,就是一個可執行程序的一次執行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完成的。進程表中的每一個表項,記錄的是當前操作系統中一個進程的情況。對于單 CPU的情況而言,每一特定時刻只有一個進程占用 CPU,但是系統中可能同時存在多個活動的(等待執行或繼續執行的)進程。

  一個稱為“程序計數器(program counter, pc)”的寄存器,指出當前占用 CPU的進程要執行的下一條指令的位置。

  當分給某個進程的 CPU時間已經用完,操作系統將該進程相關的寄存器的值,保存到該進程在進程表中對應的表項里面;把將要接替這個進程占用 CPU的那個進程的上下文,從進程表中讀出,并更新相應的寄存器(這個過程稱為“上下文交換(process context switch)”,實際的上下文交換需要涉及到更多的數據,那和fork無關,不再多說,主要要記住程序寄存器pc指出程序當前已經執行到哪里,是進程上下文的重要內容,換出 CPU的進程要保存這個寄存器的值,換入CPU的進程,也要根據進程表中保存的本進程執行上下文信息,更新這個寄存器)。

  好了,有這些概念打底,可以說fork了。當你的程序執行到下面的語句:

  pid=fork();

  操作系統創建一個新的進程(子進程),并且在進程表中相應為它建立一個新的表項。新進程和原有進程的可執行程序是同一個程序;上下文和數據,絕大部分就是原進程(父進程)的拷貝,但它們是兩個相互獨立的進程!此時程序寄存器pc,在父、子進程的上下文中都聲稱,這個進程目前執行到fork調用即將返回(此時子進程不占有CPU,子進程的pc不是真正保存在寄存器中,而是作為進程上下文保存在進程表中的對應表項內)。問題是怎么返回,在父子進程中就分道揚鑣。

  父進程繼續執行,操作系統對fork的實現,使這個調用在父進程中返回剛剛創建的子進程的pid(一個正整數),所以下面的if語句中pid<0, pid==0的兩個分支都不會執行。所以輸出i am the parent process…

  子進程在之后的某個時候得到調度,它的上下文被換入,占據 CPU,操作系統對fork的實現,使得子進程中fork調用返回0。所以在這個進程(注意這不是父進程了哦,雖然是同一個程序,但是這是同一個程序的另外一次執行,在操作系統中這次執行是由另外一個進程表示的,從執行的角度說和父進程相互獨立)中pid=0。這個進程繼續執行的過程中,if語句中 pid<0不滿足,但是pid==0是true。所以輸出i am the child process…

  我想你比較困惑的就是,為什么看上去程序中互斥的兩個分支都被執行了。在一個程序的一次執行中,這當然是不可能的;但是你看到的兩行輸出是來自兩個進程,這兩個進程來自同一個程序的兩次執行。

  我的天,不知道說明白了沒……

  zhaojinbo 回復于:2004-04-28 12:35:50

  fork 之后,操作系統會復制一個與父進程完全相同的子進程,雖說是父子關系,但是在操作系統看來,他們更像兄弟關系,這2個進程共享代碼空間,但是數據空間是互相獨立的,子進程數據空間中的內容是父進程的完整拷貝,指令指針也完全相同,但只有一點不同,如果fork成功,子進程中 fork的返回值是0,父進程中fork的返回值是子進程的進程號,如果fork不成功,父進程會返回錯誤。

  可以這樣想象,2個進程一直同時運行,而且步調一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因。

  至于那一個最先運行,可能與操作系統有關,而且這個問題在實際應用中并不重要,如果需要父子進程協同,可以通過原語的辦法解決。

  sniper 回復于:2004-04-28 22:11:15

  哦,偶明白了,在程序段里用了fork();之后程序出了分岔,派生出了兩個進程。具體哪個先運行就看該系統的調度算法了。

  在這里,我們可以這么認為,在運行到"pid=fork();"時系統派生出一個跟主程序一模一樣的子進程。該進程的"pid=fork();"一句中pid得到的就是子進程本身的 pid;子進程結束后,父進程的"pid=fork();"中pid得到的就是父進程本身的pid。因此改程序有兩行輸出。

  注:此處不準確,在子進程中pid的值為0,通過getpid可以獲取子進程的進程id;在父進程中pid為父進程編號。

  勘誤:父進程中的pid值為子進程進程號,只有父進程執行的getpid()才是他自己的進程號。寒,徹底的in了

  jjl3 回復于:2004-07-14 11:43:20

  我做如下修改

  #include ;

  #include ;

  main ()

  {

  pid_t pid;

  printf("fork!"); // printf("fork!n");

  pid=fork();

  if (pid < 0)

  printf("error in fork!");

  else if (pid == 0)

  printf("i am the child process, my process id is %dn",getpid());

  else

  printf("i am the parent process, my process id is %dn",getpid());

  }

  結果是

  [root@localhost c]# ./a.out

  fork!i am the child process, my process id is 4286

  fork!i am the parent process, my process id is 4285

  但我改成printf("fork!n");后,結果是

  [root@localhost c]# ./a.out

  fork!

  i am the child process, my process id is 4286

  i am the parent process, my process id is 4285

  為什么只有一個fork!打印出來了?上一個為什么有2個?

  bashfulboy 回復于:2004-07-14 22:10:52

  我也來一下:

  wujiajia 的理解有些錯誤,

  printf("AAAAAAAA");//print 一次; 這里會print 2次

  如果你將 printf("AAAAAA") 換成 printf("AAAAAAn") 那么就是只打印一次了。

  主要的區別是因為有了一個 n 回車符號

  這就跟Printf的緩沖機制有關了,printf某些內容時,操作系統僅僅是把該內容放到了stdout的緩沖隊列里了,并沒有實際的寫到屏幕上

  但是,只要看到有 n 則會立即刷新stdout,因此就馬上能夠打印了。

  運行了printf("AAAAAA") 后, AAAAAA 僅僅被放到了緩沖里,再運行到fork時,緩沖里面的 AAAAAA 被子進程繼承了

  因此在子進程度stdout緩沖里面就也有了 AAAAAA.

  所以,你最終看到的會是 AAAAAA 被printf了2次!!!!

  而運行 printf("AAAAAAn")后, AAAAAA 被立即打印到了屏幕上,之后fork到的子進程里的stdout緩沖里不會有 AAAAAA 內容

  因此你看到的結果會是 AAAAAA 被printf了1次!!!!

  (精要)

  albcamus 回復于:2005-03-08 15:56:11

  >;>;派生子進程的pid變量并沒有被改變是什么意思 對于子進程來講pid不就是0嗎

  1,派生子進程的進程,即父進程,其pid不變;

  2,對子進程來說,fork返回給它0,但它的pid絕對不會是0;之所以fork返回0給它,是因為它隨時可以調用getpid()來獲取自己的pid;

  3,樓上的樓上的你的觀點是對的,fork之后夫子進程除非采用了同步手段,否則不能確定誰先運行,也不能確定誰先結束。認為子進程結束后父進程才從fork返回的,這是不對的,fork不是這樣的,vfork才這樣。VFORK調用結束后,父進程處于非可中斷狀態,直到子進程運行結束返回。


本文出自:億恩科技【www.enidc.com】
-->

服務器租用/服務器托管中國五強!虛擬主機域名注冊頂級提供商!15年品質保障!--億恩科技[ENKJ.COM]

  • 您可能在找
  • 億恩北京公司:
  • 經營性ICP/ISP證:京B2-20150015
  • 億恩鄭州公司:
  • 經營性ICP/ISP/IDC證:豫B1-20183354
  • 億恩南昌公司:
  • 經營性ICP/ISP證:贛B2-20080012
  • 服務器/云主機 24小時售后服務電話:0371-60135900
  • 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
  • 網絡版權侵權舉報電話:0371-60135995
  • 警情提示:注意防范電信網絡詐騙
  • 專注服務器托管17年
    掃掃關注-微信公眾號
    0371-60135900
    Copyright© 1999-2026 ENKJ All Rights Reserved 地址:鄭州市高新區翠竹街1號總部企業基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師  B1-20183354   京公網安備41019702002023號 
      0
     
     
     
     

    0371-60135900
    7*24小時客服服務熱線

     
     
    精品日韩在线,日韩精品福利一区二区三区,日韩午夜黄色,国产日韩欧美高清免费
    首页国产欧美日韩丝袜| 国产欧美日韩精品一区二区免费 | 精品久久网站| 国产极品嫩模在线观看91精品| 9色精品在线| 夜夜嗨一区二区三区| aa亚洲婷婷| 亚洲免费观看高清完整版在线观| 日本中文字幕视频一区| 91p九色成人| 国产精品mv在线观看| 精品亚洲a∨| 日韩电影二区| 在线日韩一区| 视频精品一区二区| 日韩精品一区二区三区中文| 欧美日韩亚洲一区二区三区在线| 国产精品久久久久久妇女| 精品一区二区三区四区五区| 精品亚洲成人| 久久久久久久久久久妇女| 影院欧美亚洲| 天堂精品久久久久| 国产三级一区| 韩国女主播一区二区三区| 热三久草你在线| 中文亚洲欧美| 欧美亚洲国产日韩| 国产乱码午夜在线视频| 伊人精品一区| 日本不卡视频在线观看| 亚洲五月婷婷| 欧洲激情综合| 亚洲欧美久久精品| 欧美一区二区三区久久| 老牛国内精品亚洲成av人片| 香蕉成人av| 黄色亚洲精品| 日韩一区自拍| 综合一区av| 里番精品3d一二三区| 青青久久av| 亚洲综合专区| 精品中文字幕一区二区三区 | 婷婷精品进入| 日韩精品a在线观看91| 国产精品久久久久久久久久白浆| 日韩精品2区| 蜜桃久久精品一区二区| 久久三级毛片| 香蕉久久久久久久av网站| 国产精品一页| 欧美成人综合| 国产欧美啪啪| 欧美~级网站不卡| 国产精品久久777777毛茸茸| 欧美成人国产| 国产探花一区| 精品一区二区三区中文字幕视频| 精品国内亚洲2022精品成人| 乱一区二区av| 欧美国产另类| 欧美精品九九| 欧美国产极品| 在线一区视频| 色婷婷色综合| 亚洲aa在线| 欧美日韩一二三四| 欧美日韩中文| 精品在线播放| 国内揄拍国内精品久久| 日韩中文欧美在线| 亚洲1234区| 国产精品xxx在线观看| 亚洲免费在线| 色一区二区三区| 亚洲日产国产精品| 欧美久久天堂| 国产精品一线天粉嫩av| 蜜臀av一区二区三区| 日韩欧美视频专区| 国产精品亚洲一区二区在线观看| 亚洲精华国产欧美| 四虎8848精品成人免费网站| 日本不卡高清| 亚洲一区国产| 欧美一区二区三区久久精品| 日韩精品三级| 久久激情av| 免费在线小视频| 日韩高清欧美激情| 日韩三区免费| 亚洲成av人片一区二区密柚| 四虎影视精品| 黄色欧美在线| 91亚洲无吗| 亚洲一区二区三区中文字幕在线观看| 成人片免费看| 精品久久久久久久| 欧美少妇精品| 日本精品黄色| 国产精品videossex久久发布| 亚洲开心激情| 香蕉久久夜色精品国产| 激情综合网站| 久久五月天小说| 久久亚州av| 国产麻豆一区二区三区| 中文字幕日本一区| 国产视频一区三区| 欧美二区视频| 久久久久久美女精品| 国产乱码午夜在线视频| 久久精品一本| 国产欧美精品久久| 日韩在线a电影| 国产日韩欧美| 久久一区二区三区喷水| 中文一区一区三区免费在线观 | 亚洲天堂久久| 国产一二在线播放| 久久精品国内一区二区三区| 国产精品**亚洲精品| 国产精品密蕾丝视频下载| 欧美日韩一区二区三区不卡视频 | 蜜桃av一区二区三区电影| 日韩午夜在线| 欧美丝袜一区| 精品一区亚洲| 国产视频欧美| 模特精品在线| 日韩中文字幕区一区有砖一区| 久久成人精品| 老鸭窝毛片一区二区三区| 99re国产精品| 视频一区二区三区入口| 最新国产精品视频| 欧美亚洲三级| 精品一区二区三区在线观看视频| 日韩.com| 国产激情久久| 日韩精品视频网| 久久精品国产一区二区| 日韩国产一区| 美日韩精品视频| 久久九九精品| 丰满少妇一区| 日韩不卡免费高清视频| 久久精品主播| 日韩专区在线视频| 91精品国产自产在线丝袜啪| 国产欧美在线| 日韩1区2区| 日韩午夜高潮| 欧美亚洲综合视频| 久久精品国产成人一区二区三区| 国产66精品| 91超碰国产精品| 日本不良网站在线观看| 激情久久中文字幕| 伊人久久成人| 日韩动漫一区| 国产一区2区| 一区在线免费观看| 欧美自拍一区| 老牛影视精品| 日本 国产 欧美色综合| 国产精品多人| japanese国产精品| 91麻豆精品激情在线观看最新 | 欧美影院视频| 久久精品国产福利| 神马日本精品| 国产不卡人人| 中文无码日韩欧| 国内精品亚洲| 在线综合亚洲| 久久影院资源站| 狠狠色狠狠色综合日日tαg| 日本强好片久久久久久aaa| 国产夫妻在线| 亚洲伊人精品酒店| 国产成人免费视频网站视频社区| 久久免费黄色| 国产欧美日韩综合一区在线播放| 天堂av在线| 日本一区二区三区中文字幕| 国产一区二区精品久| 视频在线观看91| 久久久久久网| 欧美日韩国产综合网| 国产欧美亚洲一区| 欧美午夜不卡影院在线观看完整版免费| 日韩激情精品| 免费观看不卡av| 你懂的亚洲视频| 蜜臀精品一区二区三区在线观看| 91免费精品| 亚洲二区免费| 免费在线成人|