Esta página descreve o comportamento garantido das funções readdir
e readdir_r
contém a seguinte frase:
Após uma chamada para fork(), tanto o pai quanto o filho (mas não ambos) podem continuar processando o fluxo de diretório usando readdir(), rewinddir() ou seekdir(). Se os processos pai e filho usarem essas funções, o resultado será indefinido.
Estou escrevendo um wrapper seguro para fork em torno da DIR*
família de funções relacionadas como um exercício e estou me perguntando se é seguro para closedir
o fluxo de diretório no pai e no filho simultaneamente ou se o processo que não continua lendo o fluxo de diretório não deve interagir com o fluxo de diretório.
Como comentário geral, recomendo consultar a descrição atual de
readdir
(não muda nada aqui).closedir
faz duas coisas na prática: libera a memória alocada pela biblioteca C para acompanhar o fluxo do diretório e, se a família de funçõesopendir
/readdir
/closedir
for implementada usando descritores de arquivo, ele fecha o descritor de arquivo. Ambas as operações se aplicam ao processo que as chama, não a um pai ou filho em potencial de umfork
: liberar o fluxo de diretório afeta apenas a memória do processo de chamada (se necessário, criar uma cópia das páginas relevantes para fazer alterações nelas independentemente de qualquer outro processo com um mapa de memória compartilhado de um copy-on-writefork
) e fechar o descritor de arquivo afeta apenas o processo atual (se outro processo tiver um descritor de arquivo compartilhando a descrição do arquivo subjacente, a descrição do arquivo não será liberada).Assim, embora
readdir
não seja seguro chamar de processos diferentes em um fluxo de diretório compartilhado (por causa da descrição do arquivo compartilhado subjacente),closedir
é seguro.