$ ls -l /dev/stdin /dev/fd/0
lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2
lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0
$ ls -l /dev/pts/2 /proc/self/fd/0
crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2
lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
- Eu queria saber se todos os arquivos em
/dev
e seus subdiretórios são todos descritores de arquivos de dispositivos?
- Por que existem tantos links um do outro? Por exemplo,
/dev/fd/0
,
/dev/stdin
, /proc/self/fd/0
estão todos os links para /dev/pts/2
.
- Se
l
na lrwx------
ligação média, o que faz c
em crw--w----
média?
Respostas:
Quase todos os arquivos em
/dev
são arquivos de dispositivo . Enquanto a leitura e gravação em um arquivo normal armazena dados em um disco ou outro sistema de arquivos, o acesso a um arquivo de dispositivo se comunica com um driver no kernel, que geralmente se comunica com um pedaço de hardware (um dispositivo de hardware, daí o nome).Existem dois tipos de arquivos de dispositivo: dispositivos de bloco (indicados por
b
como o primeiro caractere na saída dels -l
) e dispositivos de caracteres (indicados porc
). A distinção entre dispositivos de blocos e caracteres não é completamente universal. Dispositivos de bloco são coisas como discos, que se comportam como arquivos grandes de tamanho fixo: se você escreve um byte em um determinado deslocamento e depois lê o dispositivo nesse deslocamento, recebe esse byte de volta. Os dispositivos de caracteres são praticamente qualquer outra coisa, onde escrever um byte tem algum efeito imediato (por exemplo, é emitido em uma linha serial) e a leitura de um byte também tem algum efeito imediato (por exemplo, é lido a partir da porta serial).O significado de um arquivo de dispositivo é determinado pelo número, não pelo nome (o nome é importante para os aplicativos, mas não para o kernel). O número é na verdade dois números: o número principal indica qual driver é responsável por este dispositivo, e o número menor permite que um driver conduza vários dispositivos¹. Esses números aparecem na
ls -l
lista, onde você normalmente encontra o tamanho do arquivo. Por exemplo,brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ este dispositivo é maior 8, menor 0.Alguns arquivos de dispositivo em
/dev
não correspondem a dispositivos de hardware. Um que existe em todo sistema unix é/dev/null
; gravar nele não tem efeito e a leitura dele nunca retorna nenhum dado. Geralmente é conveniente em scripts de shell, quando você deseja ignorar a saída de um comando (>/dev/null
) ou executar um comando sem entrada (</dev/null
). Outros exemplos comuns são/dev/zero
(que retorna bytes nulos ad infinitum )/dev/urandom
(que retorna bytes aleatórios ad infinitum ).Alguns arquivos de dispositivo têm um significado que depende do processo que o acessa. Por exemplo,
/dev/stdin
designa a entrada padrão do processo atual; abrir from tem aproximadamente o mesmo efeito que abrir o arquivo original que foi aberto como entrada padrão do processo. De maneira semelhante,/dev/tty
designa o terminal ao qual o processo está conectado. Atualmente, no Linux, os/dev/stdin
amigos e os amigos não são implementados como dispositivos de caracteres, mas como links simbólicos para um mecanismo mais geral que permite que todos os descritores de arquivos sejam referenciados (em oposição a apenas 0, 1 e 2 no método tradicional); por exemplo,/dev/stdin
é um link simbólico para/proc/self/fd/0
. Veja Como o / dev / fd se relaciona com / proc / self / fd /? .Você encontrará vários links simbólicos em
/dev
. Isso pode ocorrer por razões históricas: um arquivo de dispositivo foi movido de um nome para outro, mas alguns aplicativos ainda usam o nome antigo. Por exemplo,/dev/scd0
é um link simbólico/dev/sr0
no Linux; ambos designam o primeiro dispositivo de CD. Outra razão para links simbólicos é a organização: no Linux, você encontrará seus discos rígidos e partições em vários lugares:/dev/sda
e/dev/sda1
e amigos (cada disco designada por uma letra arbitrária, e partições de acordo com o layout da partição),/dev/disk/by-id/*
(discos designado por um número de série único),/dev/disk/by-label/*
(partições com um sistema de arquivos, designado por uma etiqueta escolhida pelo homem); e mais. Links simbólicos também são usados quando um nome genérico de dispositivo pode ser um de vários; por exemplo/dev/dvd
pode ser um link simbólico para/dev/sr0
, ou pode ser um link para/dev/sr1
se você tiver dois leitores de CD e o segundo for o leitor de DVD padrão.Por fim, existem alguns outros arquivos nos quais você pode encontrar
/dev
, por motivos tradicionais. Você não encontrará o mesmo em todos os sistemas. Na maioria das unidades,/dev/log
é um soquete usado pelos programas para emitir mensagens de log./dev/MAKEDEV
é um script que cria entradas no/dev
. Nos sistemas Linux modernos, as entradas/dev/
são criadas automaticamente pelo udev , obsoletasMAKEDEV
.Actually Na verdade, isso não é mais verdade no Linux, mas esse detalhe é importante apenas para os gravadores de driver de dispositivo.
fonte
ls -l
listagem em que você normalmente encontra o tamanho do arquivo, antes da data, por exemplo,brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→ este dispositivo é maior 8, menor 0. Os números dos dispositivos não aparecem frequentemente na prática, apenas mencionei para dizer o que torna um dispositivo um dispositivo (mais importante, não é o nome do arquivo). Um número de descritor de arquivo tem apenas um significado em um processo específico./dev/stdin
(=>/proc/self/fd/0
) no Linux não tem o mesmo efeito que duplicar a entrada padrão. Para ver a diferença,su - non_root_user
e depoisexec 5</dev/stdin
irá falhar com "Permission Denied", masexec 5<&0
será bem sucedida. E não é só isso, o novo fd será aberta com diferentes bandeiras, tudo sobre o objeto de arquivo ( "descrip arquivo aberto ção " em POSIX jargão) será diferente (ponteiro de arquivo offset, / modo não bloqueio, etc)./dev/
é para isso./dev/stdin
. Isso não aponta estaticamente para/dev/pts/2
ou para qualquer outro - basta mudar para outro terminal e você verá./dev/stdin
é a entrada padrão da sua sessão atual do terminal. Esse também é um exemplo do por que ele precisa ser um link simbólico.man mknod
einfo coreutils 'mknod invocation'
. Em geral,c
significa um tipo de dispositivo chararacter.fonte
/dev/stdin
refere-se à entrada padrão do processo que o abrirá. Tudo dentro/proc/$pid
são dados dependentes do processo e/proc/self
é um tipo de link simbólico mágico que aponta para os próprios dados do processo.Para sua primeira pergunta, eles não são descritores de arquivos, são arquivos de dispositivo. (também conhecido como "nós de desenvolvimento")
Esses arquivos são vinculados ao driver que está manipulando o dispositivo usando números maiores e menores. (Por exemplo, "136, 2" na
ls
saída refere-se ao driver de dispositivo vinculado ao número principal 136 e especifica o dispositivo nº 2 tratado por esse driver.)A primeira letra de saída de
ls -l
é o tipo do dispositivo no caso de arquivos do dispositivo. Se for 'c', é um dispositivo de caractere, ou se for 'b', é um dispositivo de bloco.Para sua segunda pergunta, consulte a resposta acima de rozcietrzewiacz.
fonte