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 :
#子程序
"this is child process."
#在子程序中source自減1
source
=
source
-
1
sleep(3)
else
: #父程序
"this is parent process."
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...