Onde o fork () realmente inicia?

4

Estou tentando aprender programação UNIX e me deparei com uma pergunta sobre fork() . Eu entendo que fork() cria um processo idêntico do processo atualmente em execução, mas onde ele inicia? Por exemplo, se eu tiver código

int main (int argc, char **argv)
{

    int retval;
    printf ("This is most definitely the parent process\n");
    fflush (stdout);
    retval = fork ();
    printf ("Which process printed this?\n");

    return (EXIT_SUCCESS);
}

A saída é:

This is most definitely the parent process
Which process printed this?
Which process printed this?

Eu pensei que fork () cria um mesmo processo, então eu inicialmente pensei que naquele programa, a chamada fork () seria chamada recursivamente para sempre. Eu acho que esse novo processo criado a partir do fork () inicia após a chamada fork ()?

Se eu adicionar o código a seguir, para diferenciar entre um processo pai e filho,

if (child_pid = fork ()) printf ("This is the parent, child pid is %d\n", child_pid);
else printf ("This is the child, pid is %d\n",getpid ());

após a chamada fork (), onde o processo filho inicia sua execução?

    
por Jorge Castro 28.11.2010 / 03:30

3 respostas

5

O bifurcação fork real ocorre dentro da% primitiva fork() .

Você pode imaginar que dentro do código de fork , uma chamada de sistema realmente duplica o processo e inicia sua execução no mesmo ponto com uma pequena diferença:

  • a função fork do processo pai retornará o ID do processo filho
  • a função fork do processo filho retornará 0.

Assim você sabe onde você está durante a programação, por exemplo

  if (fork())
  {
     printf("Parent speaking\n");
     // parent's tasks
  }
  else
  {
     printf("Child here\n");
     // child's tasks
  }
    
por Ring Ø 28.11.2010 / 06:24
4

fork () copia o processo que é bifurcado no estado no momento .

Pode ser difícil dizer em qual linha de código o processo filho começa, você realmente precisa ver uma versão compilada desmontada para entender. Mas muitas vezes é bom supor que começa depois que garfo foi chamado, certamente no seu caso.

Ele está copiando todas as suas variáveis, a pilha, a coisa toda (na verdade, é espaço na memória) é copiado byte por byte. A única coisa que muda é o ID do processo **.

Se você fizer isso:

int i = random_integer();
fork();

O processo filho terá o mesmo valor para i como pai.

*: No processo filho, o valor de retorno de fork () será 0 em vez do ID do processo.

**: Além disso, o processo filho não terá os bloqueios dos pais e a utilização de recursos.

    
por Stefano Palazzo 28.11.2010 / 03:40
2

O processo filho começa a execução logo após a chamada fork() . Mais especificamente, logo após fork () retornou o ID do processo da criança ou 0.

    
por David Oneill 28.11.2010 / 16:08