1

См. В Примере 1, родительский процесс вызывается первым, где, как и в Примере 2, дочерний процесс вызывается первым. Я не мог понять это поведение fork().Просьба уточнить.

Example1:

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

Пример 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 ответ1

1

По сути, ls возвращает намного больше времени, чем pwd (pwd просто перечисляет переменную в памяти, где ls должен общаться с файловой системой), в этом и заключается разница.

Это потому, что вы создаете новый поток, и обе операции выполняются одновременно, некоторые операции занимают больше времени, чем другие. Когда вы только что писали текст, у вас, возможно, всегда был надежный родительский процесс, который всегда заканчивал первым, но теперь, когда вы выполняете реальную работу, независимо от того, какой поток завершил свою работу первым, он закончится первым.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .