Cygwin中的Python os.execlp()返回不同的子pid

时间:2018-10-12 10:51:07

标签: python python-3.x cygwin exec

在Cygwin中,调用Python3 os.execlp()创建了一个新进程来运行外部python代码,child的pid与以前的os.fork()返回的pid不同。

我不知道为什么Cygwin会有这个奇怪的结果。


运行环境:

  • 在win10下的Cygwin
  • Python 3.6.4

代码:

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平台上完美运行。

2 个答案:

答案 0 :(得分:1)

首先,让我们首先说明一下,它是本机Unix / Linux系统原语,fork在Windows中没有任何等效项,因此,os.fork在Windows本机python中不存在

但是,为Cygwin构建的Python之所以能够使之可用,是因为Cygwin模拟forkhow 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的方式有所不同。