在python线程中执行os.system()会发生什么?

时间:2019-06-24 03:16:53

标签: python linux multithreading system-calls

我是python线程的新手。我试图了解从python线程调用os.system()时会发生什么。我知道线程确实共享文件描述符,堆,代码和全局变量。我还读到os.system(cmd)创建了一个新的子shell,并在那里执行了提供的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()

2 个答案:

答案 0 :(得分:1)

  

在python线程中执行os.system()会发生什么?

  • 创建了一个线程。像所有线程一样,该线程与创建它的线程共享其地址空间。

  • 该线程调用fork()来创建一个新子进程,几乎与它自己完全一样。子进程中仅存在名为fork()的线程;其他线程不会被复制。子进程具有与父进程不同的地址空间,但是内存映射到所有相同的地址。

    (该子进程仅出现很短的时间-除非您在调试器中采取了特定步骤以在此处暂停该进程,否则您将无法看到该子进程。Using threads in conjunction with fork() is generally inadvisable,但是在这种情况下基本上没关系。)

  • 新的子进程调用execve(),将其完全替换为运行test.exe的新进程。子进程的地址空间被破坏,并为新进程的映像创建了一个新地址。

  • 同时,名为fork()的线程现在调用waitpid()(或可能为wait())暂停执行,直到新进程完成。一旦发生这种情况,os.system()就会返回。

答案 1 :(得分:-1)

我找到了答案。当我们从Python线程T1执行os.system(cmd)时,新的子shell被创建为T1的子进程。因此,test.exe共享T1的地址空间(基本上是T1的父Python代码的地址空间)。在Linux上使用pmap可以验证我的答案。

Here I provide the pmap output for the parent process

Here I provide the pmap output for the subprocess (test.exe)