Como o mesmo fd em diferentes processos pode apontar para o mesmo arquivo?

23

Digamos que eu tenha processo 1 e processo 2 . Ambos possuem um descritor de arquivo correspondente ao inteiro 4.

Em cada processo, no entanto, o descritor de arquivo 4 aponta para um arquivo totalmente diferente na Open File Table do kernel:

Como isso é possível? Um descritor de arquivo não é suposto ser o índice de um registro na Tabela de arquivos abertos?

    
por Pithikos 05.01.2012 / 16:55

4 respostas

31

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

    
por 05.01.2012 / 17:00
23

Cada processo tem sua própria tabela de descritores de arquivos. Descritor de arquivo 4 no processo 1234 pontos dentro da tabela do processo 1234. Descritor de arquivo 4 no processo 5678 pontos dentro da 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 foram redirecionados.

Um processo pode abrir o mesmo arquivo mais de uma vez. Isso pode acontecer coincidentemente, por exemplo, quando a saída padrão e o erro padrão de um processo são redirecionados para o mesmo terminal ou para o mesmo arquivo. As entradas da tabela de arquivos subjacentes (por exemplo, struct file do Linux) carregam mais que informação 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 esse mesmo terminal aberto para gravação somente no descritor de arquivo 2. As entradas das tabelas de arquivos também contêm a posição do processo no arquivo; um processo pode querer lseek para duas posições diferentes no mesmo arquivo e, portanto, usaria dup para obter duas alças para esse arquivo.

    
por 08.11.2011 / 01:14
7

Cada processo tem sua própria tabela de descritores de arquivos. Isso é tudo.

Está tudo muito bem descrito em Programação de Rede UNIX por Richard Stevens se você gostaria de aprender profundamente.

    
por 05.01.2012 / 19:11
6

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

    
por 05.01.2012 / 17:00