在 python 线程中执行 os.system() 会发生什么?
What happens when os.system() is executed in python thread?
我是 python 线程的新手。我试图了解从 python 线程调用 os.system() 时会发生什么。我知道线程确实共享文件描述符、堆、代码和全局变量。我还读到 os.system(cmd) 创建了一个新的子 shell 并在那里执行提供的 cmd。
我的问题是,当 python 线程调用 os.system(cmd) 并且 cmd 执行“./test.exe input_file.dat”时,./ test.exe 与 python 线程共享任何内容(即输入文件、地址 space、堆等)?换句话说, 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 的地址 space(这基本上是 T1 父级的地址 space,Python 代码)。在Linux上使用pmap,可以验证我的答案。
Here I provide the pmap output for the parent process
Here I provide the pmap output for the subprocess (test.exe)
What happens when os.system() is executed in python thread?
线程已创建。这个线程——像所有线程一样——与创建它的线程共享它的地址space。
该线程调用 fork()
来创建一个几乎与它自己完全一样的新子进程。只有调用 fork()
的线程存在于子进程中;不复制其他线程。子进程有一个独立于父进程的地址 space,但内存映射到所有相同的地址。
(此子进程只存在很短的时间——您不会在这种状态下看到它,除非您在调试器中采取特定步骤在此处暂停该进程。Using threads in conjunction with fork()
is generally inadvisable,但在这种情况基本上没问题。)
新的子进程调用execve()
完全替换为新进程运行test.exe
。子进程的地址space销毁,为新进程的镜像创建一个新的
与此同时,调用 fork()
的线程现在调用 waitpid()
(或可能 wait()
)以暂停其执行,直到新进程完成。一旦发生这种情况,os.system()
returns.
我是 python 线程的新手。我试图了解从 python 线程调用 os.system() 时会发生什么。我知道线程确实共享文件描述符、堆、代码和全局变量。我还读到 os.system(cmd) 创建了一个新的子 shell 并在那里执行提供的 cmd。
我的问题是,当 python 线程调用 os.system(cmd) 并且 cmd 执行“./test.exe input_file.dat”时,./ test.exe 与 python 线程共享任何内容(即输入文件、地址 space、堆等)?换句话说, 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 的地址 space(这基本上是 T1 父级的地址 space,Python 代码)。在Linux上使用pmap,可以验证我的答案。
Here I provide the pmap output for the parent process
Here I provide the pmap output for the subprocess (test.exe)
What happens when os.system() is executed in python thread?
线程已创建。这个线程——像所有线程一样——与创建它的线程共享它的地址space。
该线程调用
fork()
来创建一个几乎与它自己完全一样的新子进程。只有调用fork()
的线程存在于子进程中;不复制其他线程。子进程有一个独立于父进程的地址 space,但内存映射到所有相同的地址。(此子进程只存在很短的时间——您不会在这种状态下看到它,除非您在调试器中采取特定步骤在此处暂停该进程。Using threads in conjunction with
fork()
is generally inadvisable,但在这种情况基本上没问题。)新的子进程调用
execve()
完全替换为新进程运行test.exe
。子进程的地址space销毁,为新进程的镜像创建一个新的与此同时,调用
fork()
的线程现在调用waitpid()
(或可能wait()
)以暂停其执行,直到新进程完成。一旦发生这种情况,os.system()
returns.