Por que o tcsh tem vários fd apontando para / dev / tty?

1

Isto está no Ubuntu 16.04, com o bash 4.3.42 e o tcsh 6.19

Se um console virtual aberto não estiver sendo usado pelo X e executar o bash, vejo stdin, stdout, stderr e um descritor de arquivo dedicado para o tty (aparentemente).

$ cd /dev/fd
$ ls
0 1 2 255
$ ls -al .
... .
... ..
... 0 -> /dev/tty3
... 1 -> /dev/tty3
... 2 -> /dev/tty3
... 255 -> /dev/tty3

Se eu estiver usando o tcsh, vejo cinco descritores de arquivos não-padrão {in, out, err} apontando para o tty e std {in, out, err} estão todos mapeados para /dev/null .

% cd /dev/fd
% ls -al
... .
... ..
... 0 -> /dev/null
... 1 -> /dev/null
... 15 -> /dev/tty3
... 16 -> /dev/tty3
... 17 -> /dev/tty3
... 18 -> /dev/tty3
... 19 -> /dev/tty3
... 2 -> /dev/null

Por que tcsh precisa de tantos descritores de arquivos apontando para o tty e qual é o benefício de mapear 0,1 e de 2 para /dev/null ? Isso não significa apenas que um pouco mais de contabilidade é necessária quando tcsh forks processa para que eles gravem / liam no console?

    
por Gregory Nisbet 26.06.2016 / 04:06

2 respostas

2

tcsh é organizado de maneira diferente de bash (sem surpresa). Ambos são antigos e cheios de peculiaridades interessantes para o leitor atento.

Essa diferença se deve à forma como tcsh gerencia os descritores de arquivos. Ao contrário de bash , ele não fornece ao roteirista uma maneira de manipular descritores de arquivos numerados. Os desenvolvedores acharam conveniente organizar seus descritores de arquivos por movendo o padrão transmite em uma área "salva" (não utilizada por scripts reais) e, ao executar comandos, ela duplica os comandos (ou seja, um subprocesso) e fecha quando os comandos terminam.

No código-fonte, sh.h tem esse pedaço , o que explica o uso desses descritores de arquivos:

/*
 * The shell moves std in/out/diag and the old std input away from units
 * 0, 1, and 2 so that it is easy to set up these standards for invoked
 * commands.
 */
#define FSAFE   5               /* We keep the first 5 descriptors untouched */
#define FSHTTY  15              /* /dev/tty when manip pgrps */
#define FSHIN   16              /* Preferred desc for shell input */
#define FSHOUT  17              /* ... shell output */
#define FSHDIAG 18              /* ... shell diagnostics */
#define FOLDSTD 19              /* ... old std input */

Para ambos os shells, existem vários links para o mesmo dispositivo "real" em /dev/fd (para Linux, pelo menos), porque é assim que o driver pseudo-terminal é organizado.

Você vai, a propósito, obter um resultado diferente se você executar tcsh de outro shell. Mas se o seu shell padrão for tcsh , provavelmente você verá esses descritores de arquivo conforme descrito na pergunta.

    
por 31.07.2016 / 18:17
0

Isto é quase certamente algo na configuração tcsh (por exemplo, ~/.login , ~/.cshrc /etc/csh.* ) - procure por qualquer coisa que redirecione stdin, stdout, stderr.

Quando executo tcsh no meu sistema, recebo:

$ tcsh
> ls -lF /dev/fd/
total 0
lrwx------ 1 cas cas 64 Jun 26 13:28 0 -> /dev/pts/29
lrwx------ 1 cas cas 64 Jun 26 13:28 1 -> /dev/pts/29
lrwx------ 1 cas cas 64 Jun 26 13:28 2 -> /dev/pts/29
lr-x------ 1 cas cas 64 Jun 26 13:28 3 -> /proc/16570/fd/
    
por 26.06.2016 / 05:29