вызов fork (), дублирующие процессы - PullRequest
0 голосов
/ 18 июня 2011

fork() используется для создания дочернего процесса ... и вы видите, что этот вызов также появляется в дочернем процессе. Я не понимаю, что это значит, когда говорят, что «вызовы fork фактически возвращаются дважды»

И что это значит ...

if (fork() == 0)
/* the child process's thread executes here*/

else 
/*the parent process's thread executes here*/

Является ли вышеуказанный код частью родительского или дочернего. Можете ли вы объяснить простым языком, что происходит?

Кроме того, зачем использовать fork()? Он говорит, что все процессы в Unix, запущенные этим системным вызовом? Как вы fork(), чтобы другие программы могли работать? Вы указываете название программы?

Ответы [ 2 ]

1 голос
/ 18 июня 2011

Это немного похоже на это:

Process 1               Process 2

int main() {
  ...
  int x = goo();
  ...
  int y = fork();
  // fork() returns...    // ... but also here!

  // here y = 123         // here y = 0
  if (y) {                if (y) {
    // this happens         // false
  } else {                } else {
    // false                // this happens
  }                       }

  int z = baz();          int z = baz();
  ...                     ...
  return 0;               return 0;
}                       }

Когда процесс 2 реализуется, программа существует дважды, и второй процесс начинается с возврата из функции fork ().Поскольку программа одинакова в обоих процессах, единственный способ определить, в каком процессе вы находитесь - это возвращаемое значение fork ().

1 голос
/ 18 июня 2011

Что означает, когда они говорят, что он возвращается дважды, так это то, что вызов возвращается один раз в родительском процессе (который вызвал его) и один раз в дочернем процессе (который этого не сделал, хотя вы, вероятно, можете утверждать, что дочерний процесс унаследовалакт вызова fork от родителя точно так же, как он унаследовал многое другое).

Фрагмент кода использует тот факт, что получает другое возвращаемое значение от fork в зависимости от того, являетесь ли вы родителемпроцесс или дочерний процесс.

дочерний процесс получает ноль, а родительский процесс получает ненулевой идентификатор процесса дочернего процесса.

Вы также можете получить -1, если forkпо какой-то причине не удается, и в этом случае ребенок не будет работать.Это то, что вы, вероятно, должны также проверить.

И, в то время как fork используется для создания новых процессов, это семейство вызовов exec, которые загружают новые программы в эти процессы: fork сам по себе не может этого сделать.

Хороший обзор процесса можно найти здесь .

...