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 echo
ou 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.
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.