Como o mesmo fd em diferentes processos aponta para o mesmo arquivo?


25

Digamos que eu tenho o processo 1 e o processo 2 . Ambos têm um descritor de arquivo correspondente ao número inteiro 4.

Em cada processo, no entanto, o descritor de arquivo 4 aponta para um arquivo totalmente diferente na Tabela de Arquivos Abertos do kernel:

insira a descrição da imagem aqui

Como isso é possível? Um descritor de arquivo não deve ser o índice de um registro na Tabela de Arquivos Abertos?


11
Boa pergunta! Meu palpite é que os descritores de arquivo são traduzidos, de modo que o fd 4nos dois processos seja relativo ao seu próprio número de fd abertos. Os 0-2DFs (stdin, stdout, sdterr) são sempre abertos para um novo processo e os números não são reservados apenas para esse processo.


@ jw013 Eu pensei que isso parecia familiar. \ @Pithikos Como isso não é uma duplicata?
Michael Mrozek

11
Este é um diagrama ruim - ele deve mostrar que o descritor de arquivo 4 significa a quarta entrada [bem, quinta, é contada a partir de zero] da tabela de descritores de arquivo à esquerda, não uma entrada que contenha um "4". O "4" real reside na variável do espaço do usuário que contém o número. O diagrama na outra pergunta é muito melhor.
usar o seguinte código

2
@ Random832 Bem, se eu soubesse qual diagrama estava correto, provavelmente nunca teria feito essa pergunta.
Pithikos

Respostas:


35

O descritor de arquivo, ou seja, 4no seu exemplo, é o índice da tabela de descritores de arquivos específicos do processo , não a tabela de arquivos abertos. A própria entrada do descritor de arquivo contém um índice para uma entrada na tabela global de arquivos abertos do kernel, bem como sinalizadores do descritor de arquivo.


2
Para o registro, existe apenas um "sinalizador de descritor de arquivo" na maioria dos sistemas, o sinalizador de execução imediata. Todos os outros estados "por fd" (incluindo o modo de deslocamento e acesso) fazem parte da entrada da tabela de arquivos abertos.
usar o seguinte código

24

Cada processo possui sua própria tabela de descritores de arquivos. O descritor de arquivo 4 no processo 1234 aponta para a tabela do processo 1234. O descritor de arquivo 4 no processo 5678 aponta para a tabela do processo 5678. Um caso com o qual você deve estar familiarizado são os descritores de arquivo 0, 1 e 2, que para cada processo são a entrada padrão, a saída padrão e o erro padrão, apontando para onde eles foram redirecionados.

Um processo pode abrir o mesmo arquivo mais de uma vez. Isso pode acontecer por coincidência, por exemplo, quando a saída padrão de um processo e o erro padrão são redirecionados para o mesmo terminal ou para o mesmo arquivo. As entradas subjacentes da tabela de arquivos (por exemplo, Linuxstruct file ) carregam mais do que informações sobre o arquivo; eles também contêm modos de abertura (por exemplo, leitura ou gravação) e outro estado (como sinalizadores, por exemplo, close-on-exec). Por exemplo, um processo pode ter um terminal aberto para leitura apenas no descritor de arquivo 0 e o mesmo terminal aberto para gravação apenas no descritor de arquivo 2. As entradas de tabelas de arquivos também contêm a posição do processo no arquivo; um processo pode querer lseekduas posições diferentes no mesmo arquivo e, portanto, seria usado duppara obter duas alças para esse arquivo.


2
Isso não está totalmente correto. De acordo com a página de manual / especificações, dupfaz exatamente o que diz na lata: os dois descritores resultantes apontam para a mesma entrada da tabela de arquivos e, portanto, compartilham o mesmo deslocamento. Para obter duas entradas diferentes da tabela de arquivos, tenho certeza de que você precisa opendo arquivo duas vezes.
jw013

@Gilles "O descritor de arquivo 4 no processo 1234 pontos dentro da tabela do processo 1234". Qual mesa você quer dizer? Pelo que sei, a única tabela no processo é a Tabela de Descritor de Arquivos, onde cada registro aponta para a Tabela de Arquivos Abertos única do kernel .
Pithikos

Consulte unix.stackexchange.com/questions/195057/… para obter uma descrição mais precisa.
Gilles 'SO- stop being evil' em


7

Um nível extra de indireção não resolveria seu problema? ("Todos os problemas na programação de computadores podem ser resolvidos por um nível extra de indireção" - alguns sábios barbudos). Ou seja, o pequeno número inteiro em cada processo acaba como um índice em uma matriz por processo de índices de espaço no kernel na "Tabela de Arquivos Abertos".


2
A fonte sábio greybeard é provavelmente David Wheeler. Parece que ele também disse: " Mas isso normalmente irá criar um outro problema. :)"
jw013
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.