Estou tentando obter uma imagem completa com descritores de arquivo. Digamos que eu possua process1, que inicialmente possui esses descritores de arquivo:
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
Então eu fecho o descritor de arquivo 1:
close(1);
O descritor de arquivo 1 converte (pontos) na estrutura FILE stdout na Tabela de Arquivos Abertos do kernel .
Com o código acima, o descritor de arquivo 1 é excluído da tabela do processo, que se torna:
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
Mas o que acontece no kernel? A stdout
estrutura FILE é desalocada? Como isso é possível se stdout é um arquivo especial (o monitor) e provavelmente está sendo usado por outros processos? E as estruturas FILE que são apenas arquivos normais (por exemplo, .txt)? E se esse arquivo estiver sendo usado por outro processo?
fonte
open
êxito.Nesse caso, não acontecerá muita coisa. stdin, stdout e stderr tendem a ser clones do mesmo descritor de arquivo. O contador de referência para o descritor de arquivo será decrementado por um. O mesmo descritor de arquivo geralmente é mantido pelo shell no qual o programa foi executado, portanto, o descritor de arquivo precisa ser mantido.
O kernel mantém contagens de referência para todos os arquivos (inodes) abertos. Enquanto a contagem de referência for maior que zero, o arquivo será mantido. Eu esperaria que um contador separado fosse mantido para identificadores de arquivos abertos. Quando isso atinge zero, o kernel pode liberar a memória usada pelo identificador de arquivo.
Quando todas as referências ao arquivo (entradas de diretório e identificadores de arquivo) forem removidas, o código do sistema de arquivos marcará o inode para reutilização. Quaisquer blocos que o arquivo tenha são disponibilizados para alocação. Muitos sistemas de arquivos limparão os ponteiros de bloco no inode quando ele for liberado. Isso dificulta a recuperação de um arquivo excluído. As atualizações no disco podem ser armazenadas em buffer e concluídas posteriormente.
fonte
cat > some.file
, o gato recebe um EOF no stdin, mas o shell não. (2) Por que contar a referência? Por que não alguma forma de coleta de lixo? O GC não é muito melhor no espaço do usuário?cat > some.file
que realmente está fazendo, bifurcando, abrindo 'some.file' e atribuindo-o ao descritor de arquivo 1, e o fazexec("cat")
. Quando um processo é exec () 'd, ele herda os descritores de arquivo aberto.