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:
Como isso é possível? Um descritor de arquivo não deve ser o índice de um registro na Tabela de Arquivos Abertos?
kernel
open-files
file-descriptors
Pithikos
fonte
fonte
4
nos dois processos seja relativo ao seu próprio número de fd abertos. Os0-2
DFs (stdin, stdout, sdterr) são sempre abertos para um novo processo e os números não são reservados apenas para esse processo.Respostas:
O descritor de arquivo, ou seja,
4
no 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.fonte
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, Linux
struct 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 quererlseek
duas posições diferentes no mesmo arquivo e, portanto, seria usadodup
para obter duas alças para esse arquivo.fonte
dup
faz 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ê precisaopen
do arquivo duas vezes.Cada processo possui 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ê quiser aprender profundamente.
fonte
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".
fonte