2014-02-17 4 views
0

Согласно учебнику, который я читаю, приведенный ниже код создает N дочерних процессов, которые будут выходить с уникальными статусами.C: fork() дочерние процессы

/* Parent creates N children */ 
for (i = 0; i < N; i++) 
    if ((pid[i] = Fork()) == 0) /* Child */ 
     exit(100+i); 

Ранее в учебнике говорится, что следующий код будет иметь 8 строк вывода:

int main(){ 
    Fork(); 
    Fork(); 
    Fork(); 
    printf("hello\n"); 
    exit(0); 
} 

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

+2

во втором случае все дети продолжают разворачивать и печатать. В первом случае ребенок выходит, как только он создается, так что только родитель продолжает –

+0

@JerryJeremiah Спасибо! Это отвечает на мой вопрос! –

+0

Возможно, вам стоит упомянуть, какую книгу вы используете. Я знаю, что Стивенс «Сетевое программирование UNIX» использует имена системных вызовов начального капитала, чтобы указать версии системных вызовов с проверкой ошибок. –

ответ

1

Каждый успешный вызов fork(), создает новый процесс.

В первом примере, дети обрабатывает (возвращаемое значение fork() быть 0) называть exit();, что означает, что они не будут вызывать следующий fork().

Во втором примере процесс каждого ребенка продолжает разворачиваться.

1

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

Смежные вопросы