Python os.execlp () в Cygwin возвращает другой дочерний pid - PullRequest
0 голосов
/ 12 октября 2018

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

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


Рабочая среда:

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

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

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

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Во-первых, давайте начнем с того, что заявив, что, будучи системным примитивом 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.

0 голосов
/ 12 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...