Python os.execlp() в Cygwin возвращает другой дочерний pid

В Cygwin вызов Python3 os.execlp() создает новый процесс для запуска внешних кодов Python, дочерний pid отличается от возвращаемого предыдущим os.fork().

Я не знаю, почему у Cygwin такой странный результат.


Запуск среды:

  • Cygwin под win10
  • Питон 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 числа pid, возвращаемые двумя функциями print, различаются.

# running result $python fork-exec.py
Child is  6104
Hello from child,  9428

Эта программа отлично работает под платформой Linux.


person Rain Win    schedule 12.10.2018    source источник


Ответы (2)


Во-первых, давайте начнем с утверждения, что, будучи родным системным примитивом Unix/Linux, fork не имеет эквивалента в Windows, и именно по этой причине os.fork не существует в родном питоне Windows.

Но Python, созданный для Cygwin, может сделать его доступным, потому что Cygwin эмулирует fork (как запустить скрипт python с os.fork на windows?)

Теперь фактическая причина, по которой PID различаются, заключается в том, что os.execlp ведет себя по-разному в Windows или Linux. В Windows execlp также является эмуляцией и НЕ заменяет текущий процесс. Он просто порождает новый процесс, используя CreateProcess внизу. Cygwin может правильно эмулировать fork, но не exec.

Таким образом, fork+exec заменяется на CreateProcess в Windows (os.exec в Windows) и os.exec делает создание нового процесса, следовательно, разные PID.

person Jean-François Fabre    schedule 12.10.2018
comment
Спасибо за подробный ответ и ссылки. Это очень полезно. - person Rain Win; 12.10.2018

PID отличается, потому что cygwin размещает один из них, который уже является процессом. и Windows обрабатывает PID иначе, чем большинство дистрибутивов Linux.

person Timo Herngreen    schedule 12.10.2018