激情五月天婷婷,亚洲愉拍一区二区三区,日韩视频一区,a√天堂中文官网8

<ul id="buwfs"><strike id="buwfs"><strong id="buwfs"></strong></strike></ul>
    <output id="buwfs"></output>
  • <dfn id="buwfs"><source id="buwfs"></source></dfn>
      <dfn id="buwfs"><td id="buwfs"></td></dfn>
      <div id="buwfs"><small id="buwfs"></small></div>
      <dfn id="buwfs"><source id="buwfs"></source></dfn>
      1. <dfn id="buwfs"><td id="buwfs"></td></dfn>
        始創(chuàng)于2000年 股票代碼:831685
        咨詢熱線:0371-60135900 注冊有禮 登錄
        • 掛牌上市企業(yè)
        • 60秒人工響應
        • 99.99%連通率
        • 7*24h人工
        • 故障100倍補償
        全部產(chǎn)品
        您的位置: 網(wǎng)站首頁 > 幫助中心>文章內容

        linux fork函數(shù)的精辟解說

        發(fā)布時間:  2012/8/25 17:29:44

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

          #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的執(zhí)行過程,就必須先講清楚操作系統(tǒng)中的“進程(process)”概念。一個進程,主要包含三個元素:

          o. 一個可以執(zhí)行的程序;

          o. 和該進程相關聯(lián)的全部數(shù)據(jù)(包括變量,內存空間,緩沖區(qū)等等);

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

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

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

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

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

          pid=fork();

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

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

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

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

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

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

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

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

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

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

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

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

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

          勘誤:父進程中的pid值為子進程進程號,只有父進程執(zhí)行的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") 那么就是只打印一次了。

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

          這就跟Printf的緩沖機制有關了,printf某些內容時,操作系統(tǒng)僅僅是把該內容放到了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調用結束后,父進程處于非可中斷狀態(tài),直到子進程運行結束返回。


        本文出自:億恩科技【mszdt.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的執(zhí)行過程,就必須先講清楚操作系統(tǒng)中的“進程(process)”概念。一個進程,主要包含三個元素:

          o. 一個可以執(zhí)行的程序;

          o. 和該進程相關聯(lián)的全部數(shù)據(jù)(包括變量,內存空間,緩沖區(qū)等等);

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

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

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

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

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

          pid=fork();

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

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

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

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

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

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

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

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

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

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

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

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

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

          勘誤:父進程中的pid值為子進程進程號,只有父進程執(zhí)行的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") 那么就是只打印一次了。

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

          這就跟Printf的緩沖機制有關了,printf某些內容時,操作系統(tǒng)僅僅是把該內容放到了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調用結束后,父進程處于非可中斷狀態(tài),直到子進程運行結束返回。


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

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

      2. 您可能在找
      3. 億恩北京公司:
      4. 經(jīng)營性ICP/ISP證:京B2-20150015
      5. 億恩鄭州公司:
      6. 經(jīng)營性ICP/ISP/IDC證:豫B1.B2-20060070
      7. 億恩南昌公司:
      8. 經(jīng)營性ICP/ISP證:贛B2-20080012
      9. 服務器/云主機 24小時售后服務電話:0371-60135900
      10. 虛擬主機/智能建站 24小時售后服務電話:0371-60135900
      11. 專注服務器托管17年
        掃掃關注-微信公眾號
        0371-60135900
        Copyright© 1999-2019 ENKJ All Rights Reserved 億恩科技 版權所有  地址:鄭州市高新區(qū)翠竹街1號總部企業(yè)基地億恩大廈  法律顧問:河南亞太人律師事務所郝建鋒、杜慧月律師   京公網(wǎng)安備41019702002023號
          0
         
         
         
         

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