Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python线程中执行os.system()时会发生什么?_Python_Linux_Multithreading_System Calls - Fatal编程技术网

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

在python线程中执行os.system()时会发生什么?,python,linux,multithreading,system-calls,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线程。我试图理解从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()

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

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

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

  • 该线程调用
    fork()。子进程中只存在调用
    fork()
    的线程;其他线程不会被复制。子进程与父进程有单独的地址空间,但内存映射在所有相同的地址

    (此子进程只存在很短的时间——除非您在调试器中采取特定步骤在此处暂停进程,否则在这种状态下不会看到它,但在这种情况下,它基本上是可以的。)

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

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


子进程不与其父进程共享地址空间。这正是线程与进程的区别所在!您好Dashwuff,因为我是python线程新手,需要您的帮助来理解我的答案有什么问题。当我执行上面提供的python代码并使用Linux的pmap命令时,它显示父进程(python代码)和./test.exe的子进程映射到相同的地址空间。那么,您能告诉我pmap命令输出是否有错误吗?两个进程的内存映射在同一个地址并不意味着它们“共享地址空间”。尝试比较另一个不相关的过程;您可能会发现默认情况下,所有内容都使用这些地址。非常感谢您的详细解释。“子进程与父进程有一个单独的地址空间,但内存映射到所有相同的地址”这句话真的让我兴奋。我将对此进行更多挖掘。