fazendo um "ps -ef" você pode ver todo o processo, incluindo os processos do terminal:
tthtlc 2964 1 0 08:31 ? 00:00:02 gnome-terminal
apenas "ps" sozinho, você vê apenas o seu próprio terminal:
PID TTY TIME CMD
2974 pts/0 00:00:00 bash
6420 pts/0 00:00:00 ps
Veja "pts / 0"? Vá para / dev / pts:
ls -al
total 0
drwxr-xr-x 2 root root 0 Jun 14 08:31 .
drwxr-xr-x 18 root root 4420 Jun 14 08:31 ..
crw--w---- 1 tthtlc tty 136, 0 Jun 14 09:03 0
crw--w---- 1 tthtlc tty 136, 1 Jun 14 09:02 1
crw--w---- 1 tthtlc tty 136, 2 Jun 14 09:02 2
crw--w---- 1 tthtlc tty 136, 3 Jun 14 09:02 3
crw--w---- 1 root tty 136, 6 Jun 14 08:31 6
crw--w---- 1 root tty 136, 8 Jun 14 08:31 8
c--------- 1 root root 5, 2 Jun 14 08:31 ptmx
Aqui você pode ver que eu tenho 0, 1, 2 == > 3 terminal criado. O "gnome-terminal" é implementado como um processo que abre stdin, stdout e stderr no mesmo dispositivo de caractere listado acima. Primeiro, observe o pid 2974 para "bash" acima? Vá para / proc / 2974 / fd para ver todo o descritor de arquivos aberto:
/proc/2974/fd>ls -al
total 0
dr-x------ 2 tthtlc tthtlc 0 Jun 14 09:30 .
dr-xr-xr-x 8 tthtlc tthtlc 0 Jun 14 09:30 ..
lr-x------ 1 tthtlc tthtlc 64 Jun 14 09:30 0 -> /dev/pts/2
l-wx------ 1 tthtlc tthtlc 64 Jun 14 09:30 1 -> /dev/pts/2
l-wx------ 1 tthtlc tthtlc 64 Jun 14 09:30 2 -> /dev/pts/2
lrwx------ 1 tthtlc tthtlc 64 Jun 14 09:55 255 -> /dev/pts/2
Isso significa que todas as entradas / saídas / stderr para o bash vêm dos drivers de dispositivos / dev / pts.
Se você abrir vários terminais gnome e, dependendo de qual deles for o primeiro plano, o teclado real será redirecionado para o processo correspondente. ou seja, se você fizer um " strace -p <pid>
" onde <pid>
é o processo 2974 atualmente, a primeira vez que você digitar um caractere naquele terminal você verá imediatamente uma leitura () - aqui abaixo eu insiro múltiplos "f": / p>
read(0, "f", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "f", 1) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "f", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "f", 1) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "f", 1) = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "f", 1) = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
read(0, "f", 1) = 1
Então, é assim que um terminal funcionava em geral: ler caractere por caractere e exibir caracteres por caracteres simultaneamente (chamar "eco") na tela ao mesmo tempo. Um terminal múltiplo pode estar sendo executado ao mesmo tempo, mas somente um estará recebendo entrada direta do teclado, outros serão bloqueados na API read ().