Questão Por favor, explique o comportamento do fork nestes exemplos [closed]


Veja No Exemplo1, o processo pai está sendo chamado primeiro, onde, como no Exemplo 2, o processo filho foi chamado primeiro. Eu não conseguia entender esse comportamento do fork (). Por favor, esclareça.

Exemplo 1:

main()
{ 
  int pid;
  if((pid=fork())>=0)
  {
     if(pid)
     {
       printf("parent\n");
     }
     else
     {
       printf("Child\n");
     }
  }
  else
    printf("Failed \n");

  if(pid)
    printf("Parent:After fork call\n");
  else
    printf("Child:After fork call\n");

}

O/p:-

 [home]$ ./a.out
 parent
 Parent:After fork call
 [home]$ Child
 Child:After fork call

Exemplo 2

 main()
 {
   int pid;
   if((pid=fork())>=0)
   {
     if(pid)
     {
       printf("Parent\n");
       system("ls");
     }
     else
     {
       system("pwd");
     }
   }
   else
     printf("Failed \n");

   if(pid)
     system("ps");
   else
     printf("Child:After fork call\n");
 }

O/p:-
 Parent
 /home/neeraj/Vector/OS
 Child:After fork call
 a.out  sendsig    sendsig.c  test2.c  test3.c  test.c
 PID TTY          TIME CMD
 1943 pts/0    00:00:00 bash
 31719 pts/0    00:00:00 a.out
 31720 pts/0    00:00:00 a.out <defunct>
 31723 pts/0    00:00:00 ps

1


origem


Não há parent na saída do segundo exemplo? - Daniel Beck♦
Vejo se (pid) A sexta linha no código - E F
Há printf("parent\n"); system("ls"); no código de Exemplo 2mas eu só vejo a.out sendsig sendsig.c test2.c test3.c test.c na saída. Não parent. - Daniel Beck♦
eu editei isso, deve estar ok agora - E F
Se você não forçar qualquer pedido, o pedido pode ser feito de qualquer maneira. - David Schwartz


Respostas:


Basicamente ls leva muito mais tempo do que pwd para retornar (pwd é apenas listar uma variável na memória onde ls deve falar com o sistema de arquivos), é aí que está a diferença.

Isso porque você está criando um novo segmento e ambas as operações estão acontecendo ao mesmo tempo, algumas operações demoram mais que outras. Quando você está apenas escrevendo texto, você pode ter feito com que o pai termine sempre de forma confiável, mas agora que você está fazendo um trabalho real, seja qual for o segmento, seu trabalho primeiro será concluído primeiro.


1