Um fork
é realmente um fork. Você obtém dois processos quase idênticos. A principal diferença é o valor retornado da chamada de sistema fork()
que é o pid do filho no que é identificado como pai e 0 no filho (que é como o software pode determinar qual processo é considerado o pai (o pai tem a responsabilidade de cuidar de seus filhos) e que é o filho ).
Em particular, a memória é duplicada, portanto, a matriz fd
conterá a mesma coisa (se fd[0]
for 3 em um processo, ela será 3 também no outro) e os descritores de arquivo forem duplicados. fd 3 no filho apontará para a mesma descrição do arquivo aberto como fd 3 no pai.
Então fd3 de pai e filho apontará para uma extremidade do canal, e fd4 ( fd[1]
) de pai e filho apontará para a outra extremidade.
Você deseja usar esse pipe para um processo para enviar dados para o outro. Tipicamente, um dos processos gravará em fd 4 e o outro lerá a partir de fd 3 até ver fim do arquivo .
fim do arquivo é atingido quando todos os fds abertos para o outro lado do tubo foram fechados. Então, se o leitor não fechar seu fd para o outro lado, ele nunca verá o fim do arquivo .
Da mesma forma, se o leitor morrer, o escritor nunca saberá que deve parar de escrever se não tiver fechado seu próprio fd para o outro lado do tubo.