Entendendo o terminal de controle

5

Eu iniciei um programa java que simplesmente entra em um loop infinito a partir de um terminal unix (digamos que a janela do terminal tw1 ) Eu abri uma segunda janela de terminal (digamos tw2 ) e executei o comando ps -ef | grep java que me deu a seguinte saída

501 32566 32444   0  2:26PM ttys000    7:43.89 /usr/bin/java com.test.Hello
501 32784 31676   0  2:34PM ttys003    0:00.00 grep java

1) Será que ttys000 identifica tw1 e ttys003 identifica tw2 ?

2) A primeira linha representa um processo java em execução. Está associado a ttys000 . Então, basicamente, tw1 é um terminal de controle do meu processo java. Está correto?

3) Se eu executar o comando ps -ef , vejo vários processos que possuem ?? na coluna tty . Isso significa que eles não têm um terminal aberto associado ao processo?

    
por user1745356 05.07.2016 / 13:59

1 resposta

7

1.)

Sim, embora haja mais do que isso. ttys000 também é um dispositivo de caractere localizado em /dev , um usuário que tem permissões para gravar no grupo tty (a maioria dos usuários possui) pode enviar caracteres para esse dispositivo e eles aparecerão no terminal correspondente. ttys* não são teletipos reais, eles são emulados tty s, emulados pelo seu emulador de terminal (apropriadamente nomeado).

Eu não tenho um Mac, então usarei a convenção de nomenclatura do Linux para o seguinte exemplo:

Abra o terminal A como usuário A e encontre o emulado tty:

[userA@terminalA]$ tty
/dev/pts/0

Abra o terminal B como usuário B e faça o mesmo:

[userB@terminalB]$ tty
/dev/pts/3

Agora, redirecione alguns caracteres do terminal A para o terminal B:

[userA@terminalA]$ echo Hi there > /dev/pts/3

E veja-os aparecer no terminal B:

[userB@terminalB]$ Hi there

Em um Mac, os dispositivos devem ser /dev/ttys* , acredito.

2.

Mais ou menos. O ttys000 em si é apenas o dispositivo de caractere, a entidade real que está controlando seu processo de java é o emulador de terminal. Por controlar , quero dizer que é o pai fora do seu processo de java. O pai pode interagir com seus filhos de uma maneira mais fácil do que outros processos podem.

Além disso, se certas precauções não forem tomadas (veja man nohup para um exemplo de tal precaução), a morte do processo pai causará a morte de todos os seus processos filhos.

3)

A resposta de Karlson já explica que o ? significa um processo não associado a um terminal.

Como o próprio terminal é apenas o dispositivo de caractere, acredito que não seja difícil concluir que não é necessário que um processo seja associado a um dispositivo terminal.

Notas de encerramento

Os terminais reais /dev/tty dificilmente são usados nos modernos sistemas operacionais * nix (embora sejam usados de forma prática durante o processo de inicialização). Mas isso não significa que você não possa usar os terminais reais. Em uma máquina Linux (desculpe, eu não tenho ideia de como um Mac executa isso) a combinação Ctrl + Alt + F1 (e F2 , F3 , ... até F7 ) fornece um terminal real . Um desses terminais reais é usado para executar a exibição gráfica.

Vários processos (incluindo aplicações gráficas) em um moderno sistema operacional * nix estão associados a um dispositivo terminal porque o script que os inicia precisa passar argumentos extras. O script dispara um shell passa os argumentos extras e inicia o processo. Esses scripts são frequentemente causas de confusão.

    
por 05.07.2016 / 15:36