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 close
funçã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).
fonte
open()
efork()
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.Respostas:
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.
É 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 aswrite()
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ãoPIPE_BUF
, que faz parte da condição, é 64 kiB). Isso significa que chamadas em outros idiomas / ferramentas, como o uso deecho
oucat
, 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 "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.
fonte
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.
fonte