Se você simplesmente abrir um emulador de terminal e enviar alguns dados para ele, deverá estar ciente de que o shell padrão do usuário (provavelmente bash
) também estará sendo executado lá. Isso tem algumas consequências que provavelmente são indesejadas no seu caso de uso. A primeira coluna da saída ficará desalinhada devido ao prompt (a menos que você cuide de limpar a tela). Quaisquer que sejam os tipos de usuários que atrapalhem a tela, e mais importante, serão executados como um comando shell, o que é especialmente enganoso, já que o usuário provavelmente não vê mais o prompt lá. Além disso, se você também quiser ler a partir do terminal, você não seria capaz de fazer isso de forma confiável (para cada pressionamento de tecla será aleatório se ele chegar ao shell ou ao aplicativo.
Se eu entendi o contexto da sua pergunta corretamente, isso é indesejável para você. Os terminais abertos devem ser usados apenas para exibir a saída do seu aplicativo, e eles não devem executar um shell no meio-tempo. Como tal, você terá que especificar um comando personalizado para iniciar, em vez do shell padrão. Este comando customizado poderia facilmente ser um script simples (ou utilitário C ++) que envia o número da linha do terminal (a saída do comando tty
) de volta ao seu aplicativo, talvez altere algumas configurações de terminal e sinal (por exemplo, desligue o eco localstty
), desabilite os sinais ( stty
ou trap
)) e, finalmente, insira um sleep
gigante.
Pode haver muitas maneiras de enviar de volta o número tty para seu aplicativo principal. Esteja ciente de que o acionamento desses terminais e o script dentro dele são assíncronos do ponto de vista do seu aplicativo. Por exemplo. Se você colocar a saída de tty
em um arquivo temporário com um nome de arquivo fixo, será necessário garantir que o aplicativo não leia prematuramente a versão anterior desse arquivo. Você pode, por exemplo crie um nome de arquivo aleatório exclusivo a cada vez e espere no aplicativo principal para que ele apareça.
Deixe-me recomendar-lhe uma abordagem completamente diferente a considerar.
gnome-terminal's (e a maioria (se não todos) outros emuladores de terminais baseados em Gtk +) a emulação de terminal real é feita pelo widget VTE. Se você escrever um aplicativo usando o kit de ferramentas Gtk +, adicionar um widget VTE é tão simples quanto adicionar, digamos, uma caixa de seleção.
Em vez de usar gnome-terminal
ou xterm
ou qualquer outra coisa, o próprio aplicativo pode apresentar uma janela gráfica contendo vários widgets VTE ou várias janelas gráficas com um único VTE dentro de cada um, o que você preferir. Ou se você não quiser ter a dependência Gtk + em seu aplicativo real, você pode facilmente criar um minúsculo aplicativo auxiliar separado para essa tarefa (você pode até considerar o Python em vez de C / C ++).
Neste caso, não há shell lançado por padrão (você teria que explicitamente fazer isso com o método vte_terminal_spawn_sync()
, o qual você ficará feliz em não fazer). Você pode simplesmente pegar a linha do terminal com vte_pty_get_fd()
, convertê-la em uma string com ptsname()
e repassá-la para o seu aplicativo principal. Ou, se você fizer isso em um único aplicativo, talvez até vte_terminal_feed()
os dados sejam exibidos.