Sim, você está correto.
Em particular, isso significa que o filho herdará todas as variáveis do processo pai com o valor que elas tinham no momento do fork. No entanto, se em uma etapa posterior um dos pais ou o filho modificar uma dessas variáveis, a modificação será local para esse processo: se o filho modificar uma variável, o processo pai ainda verá o valor antigo e não o novo .
Com os garfos, se você quiser que o processo pai e filho se comunique, será necessário usar alguma comunicação explícita entre processos.
Esta é a diferença com os threads. Conceitualmente, os forks e threads são os mesmos: o mesmo código sendo executado por dois processos no caso de forks e dois threads no caso de threads. No entanto, no caso de encadeamentos, o espaço de endereçamento não será copiado : os dois encadeamentos compartilharão a mesma memória, portanto, se um encadeamento modificar uma variável, isso afetará todos os outros encadeamentos.
Os threads, portanto, permitem uma comunicação muito flexível entre os threads, mas isso também é muito propenso a erros, devido à alta probabilidade de condições de corrida, se não for usado com cuidado.
Ambos os sistemas atendem necessidades diferentes. Como uma nota lateral, a primitiva fork geralmente é implementada de uma maneira inteligente no lado do sistema, já que o espaço de endereço não será copiado fisicamente, mas o sistema usará um sistema copy-on-write: os dados serão duplicados somente se um dos os processos tentam modificá-lo. Embora os dados não sejam modificados, eles não serão duplicados e, portanto, não consumirão mais memória.
Mais informações sobre garfos e segmentos podem ser encontradas em StackOverflow .