Quando criamos fork()
um processo, o processo filho herda os descritores de arquivo. A questão é, por quê?
A meu ver, compartilhar o descritor de arquivo é uma dor de cabeça quando todos os processos estão tentando rastrear onde está o ponteiro r/w.
Por que essa decisão de design foi tomada?
Considere um trecho de shell
O shell abre
outputfile
uma vez, ao iniciar o redirecionamento, e depois passa o identificador do arquivo para osomecmd
eothercmd
, processa-fork
o. Dado o agrupamento, o usuário pode não estar errado ao esperar que a saída de ambos os comandos termine emoutputfile
, da mesma forma que terminariam na tela. (Isso seria o mesmo se o{ }
grupo fosse um script de shell.)Se a posição do arquivo fosse independente para todos os processos, a saída de
othercommand
sobrepujaria a saída desomecmd
. Se umfork
redefinisse a posição no identificador de arquivo, o shell não teria como passarothercommand
um identificador que apontasse para o final deoutputfile
(como era depois desomecmd
). Teríamos que usar um canal para coletar a saída de ambos os comandos (eles são independentes de posição de qualquer maneira) e ter outro programa concatenando a saída dos dois:POSIX explica o raciocínio assim :
Quando
fork()
é usado como um “threading do pobre”, faz sentido copiar os descritores do arquivo. Esse caso de uso deve continuar a ser suportado, portanto, esse recurso permanecerá...