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

StackOverflow https://stackoverflow.com/questions/1922254

Вопрос

Я не уверен, стоит ли использовать 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 для использования псевдотерминала.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top