python中使用fork建立新的程序

2021-07-11 12:30:46 字數 2832 閱讀 2187

python中如果要建立新程序的話,可以使用os模組中的fork方法。為了了解其中工作原理,筆者結合linux的檢視程序ps命令,對這個方法做了一些測試。

python執行時程序

python一開始執行的時候,系統會生成乙個新的程序。先看下面**:

1

2

3

4

5

6

#!/usr/bin/env python

#coding=utf8

from

time 

import

sleep

sleep(30)

因為**執行完後,程序就會被銷毀,所以這裡睡眠30秒,方便看到效果。在linux下執行這個**:

python hello.py &
加上&符號,可以讓程式在後台執行,不會占用終端。輸入ps -l命令檢視程序,在電腦上輸出如下:

python執行時程序

其中第二條記錄就是剛才執行的python了。

使用fork來建立乙個新程序

使用fork建立乙個新程序成功後,新程序會是原程序的子程序,原程序稱為父程序。如果發生錯誤,則會丟擲oserror異常。

1

2

3

4

5

6

7

8

9

10

11

12

#!/usr/bin/env python

#coding=utf8

from

time 

import

sleep

import

os

try

:

pid 

=

os.fork()

except

oserror, e:

pass

sleep(30)

執行**,檢視程序,在電腦上輸出如下:

python中fork程序

可以看出第二條python程序就是第一條的子程序。

fork程序後的程式流程

使用fork建立子程序後,子程序會複製父程序的資料資訊,而後程式就分兩個程序繼續執行後面的程式,這也是fork(分叉)名字的含義了。在子程序內,這個方法會返回0;在父程序內,這個方法會返回子程序的編號pid。可以使用pid來區分兩個程序:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#!/usr/bin/env python

#coding=utf8

import

os

#建立子程序之前宣告的變數

source 

=

10

try

:

pid 

=

os.fork()

if

pid 

==

0 : 

#子程序

print

"this is child process."

#在子程序中source自減1

source 

=

source 

-

1

sleep(3)

else

:  #父程序

print

"this is parent process."

print

source

except

oserror, e:

pass

上面**中,在子程序建立前,宣告了乙個變數source,然後在子程序中自減1,最後列印出source的值,顯然父程序列印出來的值應該為10,子程序列印出來的值應該為9。為了明顯區分父程序和子程序,讓子程序睡3秒,就看的比較明顯了。

既然子程序是父程序建立的,那麼父程序退出之後,子程序會怎麼樣呢?此時,子程序會被pid為1的程序接管,就是init程序了。這樣子程序就不會受終端退出影響了,使用這個特性就可以建立在後台執行的程式,俗稱守護程序(daemon)。

使用python建立跨平台的fork 炸彈

程序炸彈執行截圖 這是乙個用python實現的最簡單的fork炸彈 import os while true os.以下程式僅供學習之用,為避免對系統的造成損傷,已經進行了延時處理 from multiprocessing import process import os import time g...

使用fork 函式建立程序

如果程式呼叫fork 成功,fork 函式會返回兩次的值,兩次的值都不相同,返回0是給子程序的,父程序返回非負整數。呼叫不成功返回 1 具體怎樣會呼叫不成功,我現在也不知道,以後學到了再來補充 include include include intmain else if repid 0 else ...

多執行緒中使用fork 導致分頁

最近和同事一起處理了乙個 fuse 的大bug 首先看堆疊 core was generated by sf cluster bin pmxcfs program terminated with signal sigabrt,aborted.0 0x00007f2debdcc475 in raise...