Python: quando usar pty.fork () versus os.fork ()
Pergunta
Não tenho certeza se devo usar pty.fork()
ou os.fork()
Ao desova, processos de fundo externo do meu aplicativo. (Como motores de xadrez)
Quero que os processos gerados morram se o pai for morto, como nos aplicativos de desova em um terminal.
Quais são os altos e baixos entre os dois garfos?
Solução
O processo infantil criado com os.fork()
herda o stdin/stdout/stderr do processo pai, enquanto a criança criou com pty.fork()
está conectado ao novo terminal pseudo. Você precisa mais tarde quando escreve um programa como o Xterm: pty.fork()
No processo pai, retorna um descritor para controlar o terminal do processo filho, para que você possa representar visualmente os dados e traduzir ações do usuário em sequências de entrada de terminais.
Atualizar:
De Pty (7) Man Page:
Um processo que espera estar conectado a um terminal pode abrir a extremidade do escravo de um pseudo-terminal e depois ser conduzido por um programa que abriu a extremidade principal. Qualquer coisa que seja escrita na extremidade mestre é fornecida ao processo na extremidade do escravo, como se fosse a entrada digitada em um terminal. Por exemplo, escrever o caractere de interrupção (geralmente Control-C) no dispositivo mestre faria com que um sinal de interrupção (SIGINT) fosse gerado para o grupo de processos em primeiro plano que está conectado ao escravo. Por outro lado, qualquer coisa que seja escrita para a extremidade escrava do pseudo-terminal pode ser lida pelo processo conectado ao fim principal.
Outras dicas
No passado, sempre usei o subprocess
módulo para isso. Ele fornece uma boa API para se comunicar com subprocessos.
Você pode usar call(*popenargs, **kwargs)
para bloquear a execução deles, e acredito que usar o Popen
A classe pode lidar com a execução assíncrona.
Confira o documentos para mais informações.
Tanto quanto usar os.fork
vs. pty.fork
, ambos são altamente dependentes da plataforma e nenhum deles funcionará (ou pelo menos é testado) com o Windows. o pty
O módulo parece ser o mais restrito dos dois lendo os documentos. A principal diferença é o aspecto do terminal pseudo. Portanto, se você não estiver disposto a arquitetar seu código de maneira a poder usar o subprocess
módulo, eu provavelmente iria com os.fork
ao invés de pty.fork
.
Os pseudotérmicos são necessários para alguns aplicativos que realmente esperam um terminal. Uma concha interativa é um desses exemplos, mas existem muitos outros. A opção Pty.fork não existe como outro OS.Fork, mas como uma API específica para usar um pseudoterminal.