Se você acionar um terminal e chamar um executável (assumindo que seja orientado por linhas por simplicidade), você obtém uma resposta ao comando do executável. Como isso é impresso para você (o usuário)? O terminal faz algo parecido pexpect
? (pesquisa aguardando saída) ou o quê? Como é notificado sobre a saída a ser impressa? E como um terminal inicia um programa? (É algo parecido com os.fork () do python?) Estou intrigado com o funcionamento de um terminal, estou brincando com algum emulador de terminal e ainda não entendo como toda essa mágica funciona. Estou procurando a fonte do konsole (kde) e do yakuake (possivelmente usa o konsole) e não consigo entender onde toda essa mágica acontece.
32
Respostas:
Originalmente, você tinha apenas terminais burros - no começo, na verdade, máquinas de escrever (semelhantes a uma máquina de escrever elétrica, mas com um rolo de papel) (daí / dev / tty - TeleTYpers), mas depois telas + combos de teclado - que acabavam de enviar um código-chave para o computador e o computador retornou um comando que escreveu a carta no terminal (ou seja, o terminal não tinha eco local, o computador teve que solicitar ao terminal que escrevesse o que o usuário digitou no terminal) - esse é um dos motivos por que tantos comandos Unix importantes são tão curtos. A maioria dos terminais era conectada por linhas seriais, mas (pelo menos) um era diretamente conectado ao computador (geralmente a mesma sala) - esse era o console. Apenas alguns usuários selecionados foram confiáveis para trabalhar no "console" (esse costuma ser o único "terminal" disponível no modo de usuário único).
Mais tarde, houve também alguns terminais gráficos (os chamados "xterminais", que não devem ser confundidos com o
xterm
programa), com tela e placa gráfica, teclado, mouse e um processador simples; o que poderia apenas executar um servidor X. Eles não fizeram nenhum cálculo, então os clientes X rodaram no computador ao qual estavam conectados. Alguns tinham discos rígidos, mas também podiam inicializar pela rede. Eles eram populares no início dos anos 90, antes dos PCs se tornarem tão baratos e poderosos.Um "emulador de terminal" - a "janela do terminal" que você abre com programas como
xterm
oukonsole
- tenta imitar a funcionalidade desses terminais burros. Também programas comoPuTTY
(Windows) emulam terminais.No PC, onde "o console" (teclado + tela) e "o computador" são mais uma unidade, você tem "terminais virtuais" (no Linux, as teclas Alt + F1 a Alt + F6), mas também imitar terminais de estilo antigo. Obviamente, com o Unix / Linux se tornando mais um sistema operacional de desktop usado frequentemente por um único usuário, agora você faz a maior parte do seu trabalho "no console", onde os usuários antes usavam terminais conectados por linhas seriais.
É claro que é o shell que inicia os programas. E ele usa o fork-systemcall (linguagem C) para fazer uma cópia de si mesmo com as configurações do ambiente; em seguida, o exec-systemcall é usado para transformar essa cópia no comando que você deseja executar. O shell é suspenso (a menos que o comando seja executado em segundo plano) até que o comando seja concluído. Como o comando herda as configurações de stdin, stdout e stderr do shell, o comando grava na tela do terminal e recebe entrada do teclado do terminal.
fonte
Quando você “abre um terminal”, está iniciando um programa emulador de terminal, como xterm, gnome-terminal, lxterm, konsole,…
Uma das primeiras coisas que o emulador de terminal faz é alocar um pseudo terminal (geralmente chamado de pseudo-tty ou pty para abreviar). O pty é um par de arquivos de dispositivo de caractere : o pty master, que é o lado que o emulador de terminal abre, e o pty slave, que é o lado que os programas em execução no terminal abrem. Nas unidades mais modernas, o mestre é
/dev/ptmx
(que todo emulador de terminal tem aberto) e o escravo é/dev/pts/NUMBER
. O driver do kernel para pseudo-terminais controla qual processo controla o mestre para cada dispositivo escravo. O emulador de terminal pode recuperar o caminho para o escravo correspondente por meio de um ioctl no dispositivo mestre.Depois que o emulador de terminal abre o dispositivo mestre, ele inicia um subprocesso (normalmente um shell, mas cabe ao usuário que chamou o emulador de terminal decidir). O emulador faz isso da maneira usual para invocar um programa:
Quando a criança (ou qualquer outro processo) grava no escravo pty, o emulador vê a entrada no mestre pty.
Por outro lado, quando o emulador grava no dispositivo mestre, ele é visto como entrada no escravo.
Esperar funciona exatamente da mesma maneira. A diferença entre o Expect e um emulador de terminal como o xterm é onde eles obtêm a entrada que alimentam o programa (entrada de script versus teclado) e o que fazem com a saída (arquivo de log ou analisador versus desenho de texto em uma janela).
fonte
script
comando do BusyBox , em que axgetpty
função é o núcleo do trabalho/dev/ptmx
.