python中fork()函數生成子進程分析

         python的os module中有fork()函數用於生成子進程,生成的子進程是父進程的鏡像,可是它們有各自的地址空間,子進程複製一份父進程內存給本身,兩個進程之 間的執行是相互獨立的,其執行順序能夠是不肯定的、隨機的、不可預測的,這點與多線程的執行順序類似。  python

import os

def child():
    print 'A new child:', os.getpid()
    print 'Parent id is:', os.getppid()
    os._exit(0)

def parent():
    while True:
        newpid=os.fork()
        print newpid
        if newpid==0:
            child()
        else:
            pids=(os.getpid(),newpid)
            print "parent:%d,child:%d"%pids
            print "parent parent:",os.getppid()       
        if raw_input()=='q': break parent()

       在咱們加載了os模塊以後,咱們parent函數中fork()函數生成了一個子進程,返回值newpid有兩個,一個爲0,用以表示子進程,一個是大於 0的整數,用以表示父進程,這個常數正是子進程的pid. 經過print語句咱們能夠清晰看到兩個返回值。若是fork()返回值是一個負值,則代表子進程生成不成功(這個簡單程序中沒有考慮這種狀況)。若是 newpid==0,則代表咱們進入到了子進程,也就是child()函數中,在子進程中咱們輸出了本身的id和父進程的id。若是進入了else語句, 則代表newpid>0,咱們進入到父進程中,在父進程中os.getpid()獲得本身的id,fork()返回值newpid表示了子進程的id,同時咱們輸出了父進程的父進程的id. 經過實驗咱們能夠看到if和else語句的執行順序是不肯定的,子、父進程的執行順序由操做系統的調度算法來決定。算法

相關文章
相關標籤/搜索