Питон:когда использовать pty.fork() по сравнению с os.fork()
Вопрос
Я не уверен, стоит ли использовать pty.fork()
или os.fork()
при запуске внешних фоновых процессов из моего приложения.(Например, шахматные движки)
Я хочу, чтобы порожденные процессы умирали, если родительский элемент был убит, как в случае с порождаемыми приложениями в терминале.
Каковы взлеты и падения между двумя развилками?
Решение
Дочерний процесс, созданный с помощью os.fork()
наследует stdin/stdout/stderr от родительского процесса, а дочерний процесс, созданный с помощью pty.fork()
подключен к новому псевдотерминалу.Вам понадобится позже, когда вы пишете программу, подобную xterm: pty.fork()
в родительском процессе возвращает дескриптор для управления терминалом дочернего процесса, поэтому вы можете визуально представлять данные из него и переводить действия пользователя в последовательности ввода терминала.
Обновлять:
Со страницы руководства pty(7):
Процесс, который рассчитывает быть подключенным к терминалу, может открыть рабский конец псевдо-терминала, а затем быть обусловленным программой, которая открыла мастер-конец.Все, что записано на главном конце, предоставляется процессу на рабовладельческом конце, как будто он был вводится на терминале.Например, написание символа прерывания (обычно Control-C) на главное устройство приведет к созданию сигнала прерывания (Sigint) для группы процессов переднего плана, которая подключена к рабом.И наоборот, все, что записано в рабский конец псевдо-терминала, может быть прочитано процессом, который связан с главным концом.
Другие советы
Раньше я всегда использовал subprocess
модуль для этого.Он предоставляет хороший API для взаимодействия с подпроцессами.
Вы можете использовать call(*popenargs, **kwargs)
для блокировки их выполнения, и я считаю, что использование Popen
класс может обрабатывать асинхронное выполнение.
Проверьте документы для получения дополнительной информации.
Что касается использования os.fork
против pty.fork
, оба сильно зависят от платформы, и ни один из них не будет работать (или, по крайней мере, не тестировался) с Windows.А pty
Судя по документации, модуль кажется более ограниченным из двух.Основное отличие заключается в аспекте псевдотерминала.Поэтому, если вы не хотите проектировать свой код таким образом, чтобы иметь возможность использовать subprocess
модуль, я бы, наверное, выбрал os.fork
вместо pty.fork
.
Псевдотермиалы необходимы для некоторых приложений, которые действительно ожидают наличия терминала.Интерактивная оболочка - один из таких примеров, но есть много других.Опция pty.fork существует не как другая ОС.fork, а как конкретный API для использования псевдотерминала.