/dev/fd/3 seems to be pointing to the current process.
Ie., ls
propriamente dito (note que o pid não existirá depois). Todos os que pertencem ao processo atual, já que os descritores de arquivos não são globais; não existe apenas um único 0, 1 e 2 para todo o sistema - existe um 0, 1 e 2 separados para cada processo.
Como observa Frederik Dweerdt, /dev/fd
é um link simbólico. Se você repetir seu ls
de terminais diferentes, você notará links para diferentes ptys. Estes corresponderão à saída do comando tty
.
No exemplo ls
, eu imagino que o descritor 3 é o que está sendo usado para ler o sistema de arquivos. Alguns comandos C (por exemplo, open()
), que sustentam a geração de descritores de arquivos, garantem o retorno de "o descritor de arquivo não usado numerado mais baixo" (POSIX - note que open level () de baixo nível não faz parte do Standard C). Então eles são reciclados depois de serem fechados (se você abrir e fechar arquivos diferentes repetidamente, você receberá 3 como um fd várias vezes).
Se você quer uma pista sobre como eles vêm a existir, aqui está um trecho de código C usando opendir()
, que você provavelmente encontrará na fonte para ls:
// open directory for reading
DIR *dh = opendir(".");
// print the fd of the directory handle to standard out:
printf("fd: %d\n", dirfd(dh));
closedir(dh);
Executar como está, o fd será 3, já que esse é o descritor não usado mais baixo (0, 1 e 2 já existem).