Relacionados, mas não duplicados:
- /dev/fd inconsistência
- Como /dev/fd se relaciona com /proc/self/fd/?
- Por que a substituição do processo resulta em um arquivo chamado /dev/fd/63 que é um pipe?
No Ubuntu 18.04 e 20.04, onde o Ubuntu alias ll='ls -alF'
definiu em ~/.bashrc
, vejo as seguintes saídas para os dispositivos de "unidade de disquete"/dev/fd
:
Para ls
:
$ ls /dev/fd 0 1 2 3
Para ll
:
$ ll /dev/fd lrwxrwxrwx 1 root root 13 Nov 5 11:46 /dev/fd -> /proc/self/fd/
Eu posso ver /dev/fd
é um link simbólico para /proc/self/fd/
, então eu ll
isso e vejo:
$ ll /proc/self/fd/ total 0 dr-x------ 2 username username 0 Nov 8 19:01 ./ dr-xr-xr-x 9 username username 0 Nov 8 19:01 ../ lrwx------ 1 username username 64 Nov 8 19:01 0 -> /dev/pts/6 lrwx------ 1 username username 64 Nov 8 19:01 1 -> /dev/pts/6 lrwx------ 1 username username 64 Nov 8 19:01 2 -> /dev/pts/6 lrwx------ 1 username username 64 Nov 8 19:01 3 -> 'socket:[8239772]' lr-x------ 1 username username 64 Nov 8 19:01 4 -> /proc/29512/fd/
- O que todas essas coisas significam?
- Como os disquetes funcionam aqui?
- O que é
/dev/pts/6
, e por que0
,1
, e2
todos apontam para ele? - O que é
'socket:[8239772]'
? - O que é
/proc/29512/fd/
? - Para que serve o uso histórico e a descrição
/dev/fd
?
Relacionado:
- minha pergunta anterior que me inspirou a fazer esta pergunta: '-sh: erro de sintaxe: inesperado "("' ao tentar substituir o processo em um dispositivo Linux incorporado com `bash`
/proc
é um sistema de arquivos através do qual o kernel reporta várias informações aos processos. É principalmente para informações sobre processos, daí o nome “proc[esses]”. Para cada processo em execução, há um subdiretório/proc/<PID>
onde<PID>
está o ID do processo./proc/self
é um link simbólico “mágico” que sempre aponta para o processo que está acessando/proc
./proc/self/fd
relata os arquivos abertos por um processo. Cada entrada é um link simbólico “mágico” cujo nome é o descritor do arquivo e cujo destino é o arquivo aberto. É mágico no sentido de que o link realmente aponta para o próprio arquivo, mesmo que o nome do arquivo obtido pela chamadareadlink
não seja um nome de arquivo válido, o que acontece, por exemplo, com arquivos que não têm nome (como pipes anônimos e soquetes) e com arquivos excluídos.Não há disquetes envolvidos. A abreviatura “fd” significa descritor de arquivo .
0
Descritores de arquivo1
e2
são os três fluxos padrão ) que todos os programas esperam encontrar: entrada padrão (stdin), saída padrão (stdout) e erro padrão (stderr). Esses fluxos são definidos por seu número: stdin é o descritor de arquivo 0 por definição, e sua função convencional é receber entrada ou dados de entrada do usuário, e da mesma forma para stdout (1, saída do usuário ou dados de saída) e stderr (2, mensagens de erro) ./dev/pts/6
é um terminal. É o arquivo que os processos usam para ler a entrada e gravar a saída nesse terminal específico. Quando você executa um programa “normalmente” em um terminal, stdin, stdout e stderr são todos conectados ao terminal.É uma tomada . O descritor de arquivo 3 não tem função padrão, então é específico para algum software que você está usando, talvez seu emulador de terminal. Você pode ver o que está na outra extremidade do soquete se estiver curioso.
Quando você executa
ls /proc/self/fd/
, ols
programa abre/proc/self/fd
para ler seu conteúdo. Como os descritores de arquivo 0 a 3 já estão abertos quandols
inicia, eopen
usa o primeiro descritor de arquivo disponível,/proc/self/fd
acaba sendo aberto no descritor de arquivo 4. Aparece com o PID porque o kernel não acompanha os acessos/proc/self
internamente: ele os lembra como o/proc
diretório de um processo específico, que ele imprime usando o PID correto. (Com namespaces PID , esse PID e, portanto, o caminho, podem ser diferentes dependendo de qual processo está procurando.)É útil quando os programas precisam de um nome de arquivo e você deseja se referir a um arquivo que já está aberto. É uma generalização de
/dev/stdin
,/dev/stdout
e/dev/stderr
que são equivalentes a/dev/fd/0
,/dev/fd/1
e/dev/fd/2
respectivamente (e existiam antes do aparecimento do mais geral/dev/fd
). Está disponível em muitas variantes do unix .