[英]What happens when os.system() is executed in python thread?
我是python線程的新手。 我試圖了解從python線程調用os.system()時會發生什么。 我知道線程確實共享文件描述符,堆,代碼和全局變量。 我還閱讀了os.system(cmd)創建一個新的子外殼,並在其中執行提供的cmd。
我的問題是,當python線程調用os.system(cmd)且cmd執行“ ./test.exe input_file.dat”時,。/ test.exe的進程是否共享任何內容(即輸入文件,地址空間,堆,等)與python線程? 換句話說,os.system(cmd)是否創建一個與調用者進程或線程無關的新進程?
下面,我提供了我編寫的python代碼。
#!/usr/bin/python
import threading
import os
semaphore = threading.Semaphore(3)
def run_command(cmd):
with semaphore:
os.system(cmd)
for i in range(3):
threading.Thread(target=run_command, args=("./test.exe input_file.dat", )).start()
在python線程中執行os.system()會發生什么?
創建一個線程。 像所有線程一樣,該線程與創建它的線程共享其地址空間。
該線程調用fork()
創建一個幾乎完全像其自身的新子進程。 子進程中僅存在一個名為fork()
的線程。 其他線程不會被復制。 子進程具有與父進程不同的地址空間,但內存映射到所有相同的地址。
(此子進程僅出現很短的時間-除非您在調試器中采取特定步驟在此處暫停該進程,否則您將不會在這種狀態下看到它。 通常不建議將線程與fork()
結合使用 ,但是在這種情況下,基本上還可以。)
新的子進程將調用execve()
以將其完全替換為運行test.exe
的新進程。 子進程的地址空間被破壞,並為新進程的映像創建了一個新的地址空間。
同時,調用fork()
的線程現在調用waitpid()
(或可能是wait()
)來暫停其執行,直到新進程完成為止。 一旦發生這種情況, os.system()
返回。
我找到了答案。 當我們從Python線程T1執行os.system(cmd)時,新的子shell被創建為T1的子進程。 因此,test.exe共享T1的地址空間(基本上是T1的父Python代碼的地址空間)。 在Linux上使用pmap可以驗證我的答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.