Descritor de arquivo e fork


14

Quando um filho é bifurcado, ele herda os descritores de arquivo dos pais, se o filho fecha o descritor de arquivo, o que acontecerá? Se a criança começar a escrever, o que acontecerá com o arquivo no final dos pais? Quem gerencia essas inconsistências, kernel ou usuário?

quando um processo chama a closefunção para fechar um arquivo aberto específico por meio do descritor de arquivo. Na tabela de arquivos do processo, a contagem de referência é decrementada em um. Porém, como pai e filho estão mantendo o mesmo arquivo, a contagem de referência é 2 e, após o fechamento, reduz para 1. Como não é zero, o processo continua a usar o arquivo sem nenhum problema.

Consulte a programação do sistema Terrence Chan UNIX, (suporte ao kernel do Unix para arquivos).


Ok, não importa o último comentário;) Nas páginas de manual para open()e fork()há uma distinção entre um descritivo de arquivo - ou uma descrição de arquivo - o primeiro se refere ao posterior e, embora os descritores em um garfo sejam cópias, eles se referem à mesma descrição. No entanto, quando testado, é óbvio que isso não significa que fechar o manípulo da criança fecha o manípulo dos pais. Eu acho que pode fazer uma diferença sutil na intercalação de dados quando os dois manipuladores escrevem - mas isso é indeterminado de qualquer maneira, portanto, exatamente como isso acontece não é tão importante.
GOLDILOCKS

Respostas:


28

Quando um filho é bifurcado, ele herda os descritores de arquivo dos pais, se o filho fecha o descritor de arquivo, o que acontecerá?

Ele herda uma cópia do descritor de arquivo. Portanto, fechar o descritor na criança o fechará para a criança, mas não para os pais, e vice-versa.

Se a criança começar a escrever, o que acontecerá com o arquivo no final dos pais? Quem gerencia essas inconsistências, kernel ou usuário?

É exatamente (exatamente, literalmente) o mesmo que dois processos gravados no mesmo arquivo. O kernel agenda os processos de forma independente, portanto você provavelmente obterá dados intercalados no arquivo.

No entanto, o POSIX (ao qual os sistemas * nix estão em conformidade total ou totalmente), estipula que read()e as write()funções da API C (que mapeiam as chamadas do sistema) são "atômicas entre si [...] quando operam em arquivos regulares ou links simbólicos ". O GNU C manualmente também promete provisoriamente isso em relação aos tubos (observe que o padrão PIPE_BUF, que faz parte da condição, é 64 kiB). Isso significa que chamadas em outros idiomas / ferramentas, como o uso de echoou cat, devem ser incluídas nesse contrato; portanto, se dois processos independentes tentarem escrever "olá" e "mundo" simultaneamente no mesmo canal, o que sairá do outro end é "helloworld" ou "worldhello" e nunca algo como "

Quando uma chamada de processo fecha a função para fechar um arquivo aberto específico por meio do descritor de arquivo. A tabela de processos do arquivo diminui a contagem de referência em um. para 1), como não é zero, portanto, o processo ainda continua usando o arquivo sem nenhum problema.

Existem dois processos, o pai e o filho. Não existe uma "contagem de referência" comum a ambos. Eles são independentes. WRT o que acontece quando um deles fecha um descritor de arquivo, veja a resposta para a primeira pergunta.


1

Sempre fork()que cria um novo filho, os descritores de arquivo não são mantidos - eles são alterados.

Embora o arquivo seja duplicado, ele terá um descritor de arquivo diferente.

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.