É possível reutilizar a extremidade escrava de um PTY após fechá-lo?

É possível reutilizar a extremidade escrava de um PTY após fechá-lo?

Depois que o final do escravo é usado ( open(), read(), write(), close()), o mestre read()termina e retorna com um erro de EIO. Mas eu esperava poder open()/ close()várias vezes o escravo terminar sem interromper o mestre fd.

É possível manter as duas extremidades válidas após o escravo close()? Como posso manter meu programa “mestre” em execução quando o final escravo está fechado? Devo executar novamente a grantpt(); unlockpt(); ptsname();sequência inteira?

Responder1

Curto: não

Longo: uma conexão escrava pseudoterminal é uma extremidade de umconexão, como um cachimbo. Ambas são maneiras pelas quais os dados são transmitidos entre os processos do usuário por meio do kernel.

Depois que uma extremidade é fechada, você perde a conexão. A ptsnamedescrição em POSIX diz:

Em caso de falha, ptsname()retornará um ponteiro nulo. Isto pode ocorrer se fildes for umdescritor de arquivo inválidoou se o nome do dispositivo escravo não existir no sistema de arquivos.

Depois de fechar um descritor de arquivo, ele se torna inválido.

Se você quiser reutilizar uma conexão, você pode fazer alguma solução alternativa, como passar o descritor de arquivo escravo aberto para um processo recém-criado, por exemplo, de um aplicativo de servidor que você escreve para gerenciar os descritores de arquivo escravo.

Leitura adicional:

O texto acima foi escrito em 2016. Um comentário de 2022 mencionaTIOCGPTPEER, que é um ioctlcódigo que permite a um aplicativo obter umnovodescritor de arquivo:

(desde Linux 4.13) Dado um descritor de arquivo em fd que se refere a um mestre pseudoterminal, abra (com os sinalizadores de estilo open(2) fornecidos) e retorne um novo descritor de arquivo que se refere ao dispositivo escravo pseudoterminal peer. Esta operação pode ser executada independentemente de o nome do caminho do dispositivo escravo ser acessível através do namespace de montagem do processo de chamada.

(o descritor de arquivo fechado ainda é inválido).

Responder2

Por comentário na outra resposta: Sim, na verdade.

Ao criar o par pty, faça com que seu processo final mestre abra o final escravo e mantenha-o aberto. Dessa forma, não importa quantos clientes abram e fechem o escravo, sua contagem de referências nunca chega a zero e nunca se torna inválida.

informação relacionada