我是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()
返回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句