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 ptsname
descriçã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:
- 7.2 Pseudo Terminais(Terminal de texto COMO FAZER)
close
- feche um descritor de arquivo(POSIX)grantpt
- conceder acesso ao dispositivo pseudo-terminal escravo(POSIX)pipe
- criar um canal entre processos(POSIX)ptsname
- obter o nome do dispositivo pseudo-terminal escravo(POSIX)unlockpt
- desbloquear um par mestre/escravo pseudo-terminal(POSIX)
O texto acima foi escrito em 2016. Um comentário de 2022 mencionaTIOCGPTPEER, que é um ioctl
có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.