Qual seria uma descrição mais simplificada dos descritores de arquivos em comparação com os da Wikipedia? Por que eles são necessários? Digamos, considere os processos do shell como um exemplo e como ele se aplica a ele?
Uma tabela de processos contém mais de um descritor de arquivo. Se sim, por que?
unix
operating-system
file-descriptor
Nishant
fonte
fonte
Respostas:
Em palavras simples, quando você abre um arquivo, o sistema operacional cria uma entrada para representar esse arquivo e armazena as informações sobre esse arquivo aberto. Portanto, se houver 100 arquivos abertos no seu sistema operacional, haverá 100 entradas no sistema operacional (em algum lugar do kernel). Essas entradas são representadas por números inteiros como (... 100, 101, 102 ....). Este número de entrada é o descritor de arquivo. Portanto, é apenas um número inteiro que representa exclusivamente um arquivo aberto no sistema operacional. Se seu processo abrir 10 arquivos, sua tabela Process terá 10 entradas para descritores de arquivos.
Da mesma forma, quando você abre um soquete de rede, ele também é representado por um número inteiro e é chamado de Descritor de Soquete. Espero que entenda.
fonte
/proc
o tempo todo.open()
fornecerá o descritor de arquivo 3, mesmo que outro processo em execução possua um descritor de arquivo 3. Consulte a definição POSIX deopen()
: "A função open () retornará um descritor de arquivo para o arquivo nomeado mais baixo atualmente, o descritor de arquivo não está aberto para esse processo . " (enfase adicionada).Um descritor de arquivo é um identificador opaco usado na interface entre o espaço do usuário e do kernel para identificar recursos de arquivo / soquete. Portanto, quando você usa
open()
ousocket()
(o sistema chama para fazer interface com o kernel), você recebe um descritor de arquivo, que é um número inteiro (na verdade, é um índice dos processos na estrutura - mas isso não é importante). Portanto, se você quer fazer a interface diretamente com o kernel, usando chamadas de sistema pararead()
,write()
,close()
etc. a alça que você usa é um descritor de arquivo.Há uma camada de abstração sobreposta nas chamadas do sistema, que é a
stdio
interface. Isso fornece mais funcionalidades / recursos do que as chamadas básicas do sistema. Para essa interface, o identificador opaco que você recebe é aFILE*
, que é retornado pelafopen()
chamada. Há muitas muitas funções que usam astdio
interface defprintf()
,fscanf()
,fclose()
, que estão lá para tornar sua vida mais fácil. Em C,stdin
,stdout
estderr
sãoFILE*
, que em UNIX mapear, respectivamente, para descritores de arquivos0
,1
e2
.fonte
Ouça da boca do cavalo: APUE (Richard Stevens).
Para o kernel, todos os arquivos abertos são referidos pelos descritores de arquivos. Um descritor de arquivo é um número não negativo.
Quando abrimos um arquivo existente ou criamos um novo arquivo, o kernel retorna um descritor de arquivo para o processo. O kernel mantém uma tabela de todos os descritores de arquivos abertos, que estão em uso. A distribuição dos descritores de arquivo é geralmente seqüencial e eles são atribuídos ao arquivo como o próximo descritor de arquivo livre do conjunto de descritores de arquivo gratuitos. Quando fechamos o arquivo, o descritor de arquivo é liberado e fica disponível para distribuição adicional.
Veja esta imagem para mais detalhes:
Quando queremos ler ou gravar um arquivo, identificamos o arquivo com o descritor de arquivo retornado por chamada de função open () ou create () e o usamos como argumento para ler () ou write () .
Por convenção, as conchas do sistema UNIX associam o descritor de arquivo 0 à entrada padrão de um processo, o descritor de arquivo 1 à saída padrão e o descritor de arquivo 2 ao erro padrão .
O descritor de arquivo varia de 0 a OPEN_MAX. O valor máximo do descritor de arquivo pode ser obtido com
ulimit -n
. Para obter mais informações, consulte o terceiro capítulo do livro APUE.fonte
osqueryi <<< echo '.all process_open_files'
em um shell bash.Outras respostas adicionaram ótimas coisas. Vou adicionar apenas meus 2 centavos.
De acordo com a Wikipedia, sabemos com certeza: um descritor de arquivo é um número inteiro não negativo. A coisa mais importante que acho que falta, seria dizer:
Os descritores de arquivo estão vinculados a um ID do processo.
Sabemos que os descritores de arquivos mais famosos são 0, 1 e 2. 0 corresponde a
STDIN
, 1 aSTDOUT
e 2 aSTDERR
.Confira este código
Criamos um processo com o ID 14726 (PID). Usando o
lsof -p 14726
nós podemos obter coisas assim:A 4ª coluna FD e a próxima coluna TYPE correspondem ao tipo de descritor de arquivo e descritor de arquivo.
Alguns dos valores para o FD podem ser:
Mas o descritor de arquivo real está em:
O caractere após o número, ou seja, "1u", representa o modo em que o arquivo é aberto. r para leitura, w para gravação, u para leitura e gravação.
TYPE especifica o tipo do arquivo. Alguns dos valores dos TYPEs são:
Mas todos os descritores de arquivo são CHR - arquivo especial de caractere (ou arquivo de dispositivo de caractere)
Agora, podemos identificar os descritores de arquivo para
STDIN
,STDOUT
eSTDERR
fácil comlsof -p PID
, ou podemos ver o mesmo sels /proc/PID/fd
.Observe também que a tabela de descritores de arquivos que o kernel controla não é a mesma que a tabela de arquivos ou a tabela de inodes. Estes são separados, como algumas outras respostas explicadas.
Você pode se perguntar onde estão esses descritores de arquivos fisicamente e o que é armazenado,
/dev/pts/6
por exemploBem,
/dev/pts/6
vive puramente na memória. Esses arquivos não são comuns, mas os chamados arquivos de dispositivo de caracteres . Você pode verificar isso com:ls -l /dev/pts/6
e eles começarão comc
, no meu casocrw--w----
.Apenas para lembrar, a maioria dos Linux como o SO define sete tipos de arquivos:
fonte
Mais pontos em relação a
File Descriptor
:File Descriptors
(FD) são números inteiros não negativos(0, 1, 2, ...)
associados a arquivos abertos.0, 1, 2
são padrão FD é que correspondeSTDIN_FILENO
,STDOUT_FILENO
eSTDERR_FILENO
(definido nounistd.h
) aberta por padrão, em nome do shell quando o programa começar.Os DFs são alocados na ordem seqüencial, significando o menor valor inteiro possível não alocado.
Os FDs de um processo específico podem ser vistos em
/proc/$pid/fd
(em sistemas baseados em Unix).fonte
Como complemento a outras respostas, o unix considera tudo como um sistema de arquivos. Seu teclado é um arquivo que é somente leitura da perspectiva do kernel. A tela é um arquivo somente para gravação. Da mesma forma, pastas, dispositivos de entrada e saída etc. também são considerados arquivos. Sempre que um arquivo é aberto, digamos, quando os drivers de dispositivo [para arquivos de dispositivo] solicitam um open (), ou quando um processo abre um arquivo de usuário, o kernel aloca um descritor de arquivo, um número inteiro que especifica o acesso a esse arquivo, apenas para leitura. , escreva apenas etc. [para referência: https://en.wikipedia.org/wiki/Everything_is_a_file ]
fonte
Descritores de arquivo (FD):
Redirecionamento de erro:
Sempre que você executa um programa / comando no terminal, 3 arquivos estão sempre abertos
Esses arquivos estão sempre presentes sempre que um programa é executado. Conforme explicado antes de um descritor de arquivo, está associado a cada um desses arquivos.
Arquivo Descritor de arquivo
Entrada padrão STDIN 0
Saída padrão STDOUT 1
Erro padrão STDERR 2
Exemplo 1
O descritor de arquivo para o erro padrão é 2.
Se não houver nenhum diretório chamado mydir, a saída do comando será salva no arquivo errorfile.txt.
Usando "2>", redirecionamos a saída do erro para um arquivo chamado "errorfile. txt "
Portanto, a saída do programa não está cheia de erros.
Espero que você tenha sua resposta.
fonte
Qualquer sistema operacional possui processos (p) em execução, por exemplo , p1, p2, p3 e assim por diante. Cada processo geralmente faz um uso contínuo de arquivos.
Cada processo consiste em uma árvore de processos (ou uma tabela de processos, em outro fraseado).
Geralmente, os sistemas operacionais representam cada arquivo em cada processo por um número (ou seja, em cada árvore / tabela de processos).
O primeiro arquivo usado no processo é o arquivo0 , o segundo é o arquivo1 , o terceiro é o arquivo2 e assim por diante.
Qualquer número desse tipo é um descritor de arquivo.
Os descritores de arquivo geralmente são números inteiros (0, 1, 2 e não 0,5, 1,5, 2,5).
Como geralmente descrevemos processos como "tabelas de processos", e como as tabelas possuem linhas (entradas), podemos dizer que a célula do descritor de arquivo em cada entrada é usada para representar a entrada inteira.
De maneira semelhante, quando você abre um soquete de rede, ele possui um descritor de soquete.
Em alguns sistemas operacionais, você pode ficar sem descritores de arquivos, mas esse caso é extremamente raro, e o usuário comum de computador não deve se preocupar com isso.
Os descritores de arquivo podem ser globais (o processo A começa em digamos 0 e termina em 1; o processo B começa em 2 e termina em 3) e assim por diante, mas até onde eu sei, geralmente nos sistemas operacionais modernos, o arquivo os descritores não são globais e são realmente específicos do processo (o processo A começa em digamos 0 e termina em 5, enquanto o processo B começa em 0 e termina em 10).
fonte
Descritores de arquivo
fonte
Além de acima de todas as respostas simplificadas.
Se você estiver trabalhando com arquivos no script bash, é melhor usar o descritor de arquivos.
Por exemplo: -
Você deseja ler e gravar de / para o arquivo "test.txt".
Use o descritor de arquivo como mostrado abaixo
fonte
Descritores de arquivo são os descritores de um arquivo. Eles fornecem links para um arquivo. Com a ajuda deles, podemos ler, escrever e abrir um arquivo.
fonte