簡體   English   中英

在python線程中執行os.system()會發生什么?

[英]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可以驗證我的答案。

在這里,我提供了父進程的pmap輸出

在這里,我提供了子進程(test.exe)的pmap輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM