在Cygwin中,调用Python3 os.execlp()
创建了一个新进程来运行外部python代码,child的pid与以前的os.fork()
返回的pid不同。
我不知道为什么Cygwin会有这个奇怪的结果。
运行环境:
代码:
parent.py
pid = os.fork()
if pid == 0:
os.execlp('python', 'python', 'child.py')
else:
print('child is , ', pid)
child.py
print(os.getpid())
在Cygwin中运行父代码时,两个print
函数返回的pid编号是不同的。
# running result $python fork-exec.py
Child is 6104
Hello from child, 9428
该程序可以在Linux平台上完美运行。
答案 0 :(得分:1)
首先,让我们首先说明一下,它是本机Unix / Linux系统原语,fork
在Windows中没有任何等效项,因此,os.fork
在Windows本机python中不存在
但是,为Cygwin构建的Python之所以能够使之可用,是因为Cygwin模拟fork
(how to run python script with os.fork on windows?)
现在,PID不同的实际原因是os.execlp
在Windows或Linux上的行为不同。在Windows上,execlp
也是一个仿真,不能代替当前进程。它只是使用下面的CreateProcess
产生了一个新进程。 Cygwin能够正确模拟fork
,但不能模拟exec
。
因此,fork+exec
在Windows(os.exec on Windows)上被CreateProcess
取代了,os.exec
确实创建了一个新进程,因此使用了不同的PID
答案 1 :(得分:0)
PID是不同的,因为cygwin托管了其中的一个,这已经是一个过程。和Windows相比,大多数Linux发行版对Windows处理PID的方式有所不同。