exec sem garfo
Há pelo menos duas razões pelas quais você gostaria de fazer uma coisa dessas:
- Carregamento de corrente. A imagem do processo atual é substituída por algo diferente.
- Reiniciar o programa em execução no momento (pode, por exemplo, acontecer quando você SIGHUP ou um processo desse servidor, recarrega tudo e faz um início completamente novo). De alguma forma, alguém poderia argumentar que isso é carregamento em cadeia, apenas coincidencialmente com o mesmo programa.
garfo sem exec
É o que todo daemon faz toda vez que é iniciado (duas vezes, de fato). Isso faz várias coisas, entre elas o shell não trava (já que o processo original que o shell aguarda termina) e o daemon não é mais controlado pelo terminal, portanto, fechar a janela do shell não mata o daemon.
Outro uso comum é a bifurcação de crianças trabalhadoras, que ficou famosa pelo servidor da Web apache há cerca de 25 anos (hoje em dia isso não é mais considerado o estado da arte devido a ser muito propenso ao problema do rebanho trovejante, mas com certeza fornece o servidor mais simples e robusto possível).
Ainda outro uso comum é criar um instantâneo consistente. fork
além de criar um processo, ele também copia (em teoria, na realidade, apenas marca as páginas copiadas na gravação) no espaço de endereço. Isso (atomicamente) cria uma captura instantânea dos dados completos do programa que o pai não pode mais modificar.
Alguns programas aproveitam isso. Por exemplo, redis salva dados no disco (em um estado consistente) e ao mesmo tempo modifica o conjunto de dados simultaneamente. Isso funciona apenas porque fork
criou um instantâneo consistente que não vê as modificações feitas pelo processo pai.