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

4

Depois que a extremidade escrava é usada ( open() , read() , write() , close() ), o read() do mestre é concluído e retorna com um erro EIO. Mas eu estava esperando poder open() / close() várias vezes a extremidade escrava sem interromper o master fd.

É possível manter as duas extremidades válidas após o close() do escravo? Como posso manter meu programa "mestre" em execução quando a extremidade escrava está fechada? Devo reexecutar para toda a sequência grantpt(); unlockpt(); ptsname(); ?

    
por Julio Guerra 20.06.2016 / 10:14

1 resposta

2

Curto: não

Long: uma conexão escrava pseudo-terminal é uma extremidade de uma conexão , como um pipe. Ambas são formas de passar os dados entre os processos do usuário através do kernel.

Quando uma extremidade está fechada, você perde a conexão. A descrição de ptsname no POSIX diz:

Upon failure, ptsname() shall return a null pointer. This could occur if fildes is an invalid file descriptor or if the slave device name does not exist in the file system.

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

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

Leitura adicional:

  • 7.2 Pseudo Terminais (Terminal de texto HOWTO)
  • close - fecha um descritor de arquivo (POSIX)
  • grantpt - concede acesso ao dispositivo pseudo-terminal escravo (POSIX)
  • pipe - crie um canal entre processos (POSIX)
  • ptsname - obtém o nome do dispositivo pseudo-terminal escravo (POSIX)
  • unlockpt - desbloqueie um par mestre / escravo pseudo-terminal (POSIX)
por 20.06.2016 / 10:27

Tags