usando um pty como um soquete?

2

Estou escrevendo uma coleção de scripts para conversar com um programa externo. Meu problema é que os scripts só ficam "vivos" por um curto período de tempo (acionados por um pressionamento de tecla em um programa maior), mas o programa externo precisa continuar funcionando entre as chamadas e foi originalmente projetado para uso interativo (depurador de pensamento). p>

  • Se eu quisesse escrever um único script para executar o programa, eu abriria um PTY para ele e enviaria / receberia dados sobre isso. Isso funciona (meus scripts estão em LUA e lpty pode lidar com o PTY), mas não pode manter o programa em execução quando o script termina.

  • Se o programa externo me oferecer um soquete para conectar (como o gdb), eu poderia salvar o nome em algum lugar e fazer com que cada script se conecte a esse soquete. Mas isso só deveria ser usado de forma interativa.

Eu poderia escrever um daemon que inicia o programa externo, abre um PTY para ele e então escuta em um soquete. Os scripts poderiam, então, conectar-se ao soquete do daemon e enviar dados, que o daemon encaminharia ao programa através do PTY e enviaria os resultados de volta.

O formato dos dados que estou trocando com o programa externo é baseado em linhas, mas eu não sei com antecedência quantas linhas eu vou recuperar de um único comando. Não é um problema com um PTY, mas um pouco mais de trabalho com luasocket .

Eu estou querendo saber se não há uma maneira melhor de fazer isso. Posso de alguma forma abrir um PTY para um programa e obter seu "endereço", a partir do qual eu posso conectar e desconectar várias vezes dos meus scripts? (Apenas um script pode ser executado de cada vez, portanto, a simultaneidade não é um problema.) Isso evitaria o uso de soquetes.

Ou há alguma combinação de opções em socat que já faz exatamente isso?

    
por Bristol 15.05.2015 / 11:18

1 resposta

2

Você não pode "abrir um PTY para um programa". Um PTY é um pseudo-terminal; requer um terminal final. Se você quiser se comunicar com um programa diretamente através de um terminal, o programa precisaria criar um terminal (ou seja, para se comportar como um emulador de terminal).

Em vez disso, você pode executar o programa em um terminal, como a tela . A tela facilita a injeção de entrada e leitura de saída de programas.

No entanto, para o que você está fazendo, um terminal apresentaria complicações inúteis. Um soquete é exatamente a ferramenta certa para o que você quer fazer - comunicação bidirecional direta entre dois programas. (Para comunicação unidirecional, um pipe seria a ferramenta certa.) A única vantagem de usar um terminal é se você não controla uma das extremidades e insiste em armazenar em buffer a saída por bloco e não por linha se a saída não for em um terminal.

    
por 16.05.2015 / 03:19

Tags