1. 程式人生 > >程序的建立-fork

程序的建立-fork

1. 程序 VS 程式

編寫完畢的程式碼,在沒有執行的時候,稱之為程式

正在執行著的程式碼,就成為程序

程序,除了包含程式碼以外,還有需要執行的環境等,所以和程式是有區別的

2. fork( )

Python的os模組封裝了常見的系統呼叫,其中就包括fork,可以在Python程式中輕鬆建立子程序:

#coding=utf-8
import os

# 注意,fork函式,只在Unix/Linux/Mac上執行,windows不可以
pid = os.fork()

if pid == 0:
    print('哈哈1')
else:
    print('哈哈2')

執行結果:

說明:

1)程式執行到os.fork()時,作業系統會建立一個新的程序(子程序),然後複製父程序的所有資訊到子程序中

2)然後父程序和子程序都會從fork()函式中得到一個返回值,在子程序中這個值一定是0,而父程序中是子程序的 id號

在Unix/Linux作業系統中,提供了一個fork()系統函式,它非常特殊。普通的函式呼叫,呼叫一次,返回一次,但是fork()呼叫一次,返回兩次,因為作業系統自動把當前程序(稱為父程序)複製了一份(稱為子程序),然後,分別在父程序和子程序內返回。子程序永遠返回0,而父程序返回子程序的ID。
這樣做的理由是,一個父程序可以fork出很多子程序,所以,父程序要記下每個子程序的ID,而子程序只需要呼叫getppid()就可以拿到父程序的ID。

3. getpid()、getppid()

#coding=utf-8
import os

rpid = os.fork()
if rpid<0:
    print("fork呼叫失敗。")
elif rpid == 0:
    print("我是子程序(%s),我的父程序是(%s)"%(os.getpid(),os.getppid()))
    x+=1
else:
    print("我是父程序(%s),我的子程序是(%s)"%(os.getpid(),rpid))
print("父子程序都可以執行這裡的程式碼")

執行結果:

我是父程序(19360),我的子程序是(19361)
父子程序都可以執行這裡的程式碼
我是子程序(19361),我的父程序是(19360)
父子程序都可以執行這裡的程式碼