Python: когда использовать pty.fork() по сравнению с os.fork()

Я не уверен, использовать ли pty.fork() или os.fork() при создании внешних фоновых процессов из моего приложения. (например, шахматные движки)

Я хочу, чтобы порожденные процессы умирали, если родитель был убит, как с порождаемыми приложениями в терминале.

Каковы взлеты и падения между двумя вилками?


person Thomas Ahle    schedule 17.12.2009    source источник


Ответы (3)


Дочерний процесс, созданный с помощью os.fork(), наследует stdin/stdout/stderr от родительского процесса, а дочерний процесс, созданный с помощью pty.fork(), подключается к новому псевдотерминалу. Вам понадобится позже, когда вы пишете программу, такую ​​​​как xterm: pty.fork() в родительском процессе возвращает дескриптор для управления терминалом дочернего процесса, поэтому вы можете визуально представлять данные из него и преобразовывать действия пользователя в последовательности ввода терминала.

Обновление:

Со страницы руководства pty(7):

Процесс, который ожидает подключения к терминалу, может открыть ведомый конец псевдотерминала, а затем управляться программой, которая открыла главный конец. Все, что написано на ведущем конце, предоставляется процессу на ведомом конце, как если бы оно было введено на терминале. Например, запись символа прерывания (обычно control-C) в ведущее устройство вызовет генерацию сигнала прерывания (SIGINT) для группы процессов переднего плана, которая подключена к ведомому. И наоборот, все, что записывается на ведомый конец псевдотерминала, может быть прочитано процессом, подключенным к ведущему концу.

person Denis Otkidach    schedule 17.12.2009
comment
Итак, цель pty состоит в том, чтобы держать дочерний ввод-вывод в отдельном поле, а не смешивать его с родительским stdin/out? Я полагаю, вы могли бы сделать то же самое с os.fork и некоторыми pibes. Этот терминал делает что-нибудь еще, кроме ввода-вывода? - person Thomas Ahle; 22.12.2009
comment
Конечно, вы можете реализовать pty.fork() с помощью pty.openpty() и os.fork() (на самом деле вы можете увидеть это в исходном коде pty.py). Но псевдотерминал отличается от каналов, см. en.wikipedia.org/wiki/Pseudo_terminal. - person Denis Otkidach; 22.12.2009
comment
В pty.py я вижу, что даже не os.forkpty код в pty.fork использует устройство /dev/pty, поэтому в нем должно быть нечто большее, чем просто парадигма ввода/вывода. Читаю комментарии вверху файла, а они говорят: Баги: Нет обработки сигнала. Не устанавливает подчиненные терминалы и размер окна. Википедия ничего не говорит о том, что pty делает такие вещи. - person Thomas Ahle; 23.12.2009

Раньше я всегда использовал для этого модуль subprocess. Он предоставляет хороший API для связи с подпроцессами.

Вы можете использовать call(*popenargs, **kwargs) для блокировки их выполнения, и я считаю, что использование класса Popen может справиться с асинхронным выполнением.

Дополнительные сведения см. в документах.

Что касается использования os.fork и pty.fork, оба сильно зависят от платформы, и ни один из них не будет работать (или, по крайней мере, не тестировался) с окнами. Модуль pty кажется более ограниченным из двух, если читать документы. Основное отличие заключается в псевдотерминальном аспекте. Поэтому, если вы не хотите создавать свой код таким образом, чтобы можно было использовать модуль subprocess, я бы, вероятно, выбрал os.fork вместо pty.fork.

person Bryan McLemore    schedule 17.12.2009
comment
На самом деле это как раз тот «псевдотерминальный аспект», о котором я хотел бы узнать больше. Я прочитал много документации и руководств по ядру, но я так и не узнал, когда именно я должен использовать witch.. - person Thomas Ahle; 17.12.2009
comment
Из того, что я прочитал, говорится о возможности ввода/вывода в терминал процесса с помощью кода. Так что для меня это звучит как отдельная парадигма от использования stdout/stdin для связи с приложением. Подробнее о концепции псевдотерминала здесь: en.wikipedia.org/wiki/Pseudo_terminal - person Bryan McLemore; 17.12.2009
comment
Когда я читал википедию, псевдотерминальные швы казались просто альтернативой каналам. Когда вы говорите «выполнять ввод/вывод через код», вы имеете в виду такие вещи, как удаление и вставка, или просто стандартное чтение/запись, как канал? - person Thomas Ahle; 22.12.2009

Псевдотерминалы необходимы для некоторых приложений, которые действительно ожидают наличия терминала. Интерактивная оболочка — один из таких примеров, но есть и много других. Параметр pty.fork существует не как еще один os.fork, а как особый API для использования псевдотерминала.

person pavlix    schedule 04.08.2012