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

1

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.

Exemplo1:

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
    
por E F 22.01.2013 / 07:13

1 resposta

1

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

Isso porque você está criando um novo encadeamento 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 sempre termine de forma confiável primeiro, mas agora que você está fazendo um trabalho real, seja qual for o segmento, seu trabalho terminará primeiro.

    
por 22.01.2013 / 07:30

Tags