2016-09-19 5 views
0

Вчера у меня было интервью, и мне задали этот вопрос фрагмента кода, используя fork().Сколько всего процессов существует?

void main() 
{............ 
for (int k=1;k<=10;k++) 
{ 
pid[k]=fork(); 
if(!pid[k]) 
execvp(.....); 
} 
} 

Согласно моему пониманию, я сказал 1024 весь процесс будет там, включая родитель, как 2^п -1 = 1023 + 1 родитель где п = общие вилки

Но, интервьюер ответил, что мой ответ был неправильным.

Что не так с моим пониманием?

+0

Является ли программа, выполняемая execvp этой же программой или чем-то несвязанным? Это также может помочь узнать, почему вы считаете, что 1024 - правильный ответ (т. Е. Объяснить ваши рассуждения). – fvu

+0

Я думаю, что ребенок заменяется другой программой.? – Garrick

+0

Ну, в этом случае дочерние процессы не будут участвовать в дальнейшем разветвлении, что приведет к 10 детям и одному из родителей, нет? Кроме того, 2^10-1 определенно не 1024 ... – fvu

ответ

1

Учитывая этот код

pid[k]=fork(); 
if(!pid[k]) 
    execvp(.....); 

и чтение the man page of fork в котором говорится, что

В случае успеха, PID дочернего процесса возвращается в родителе, и 0 возвращается в дочернем ,

Мы знаем, что дочерний процесс выполнит вызов exec (и продолжит выполнение другой программы), тогда как родитель будет зацикливаться и создать другого ребенка.

Это означает, что ребенок будет создан для каждой итерации цикла, в этом случае 10 раз. Таким образом, ответ 10 детей + 1 родитель = 11.


Теперь, если программа, которая запускается с помощью Exec это та же программа, удовольствие остановится только тогда, когда память компьютера исчерпывается: на каждой итерации 10 программ будут создавать 10 детей, каждая из которых будет создавать 10 детей и т. Д. Особенность fork() заключается в том, что родитель и ребенок получают изображение с теми же переменными (что приведет к предсказуемому числу детей, то есть к какой-то цифре, связанной с силой 2), очевидно, это неверно, когда программа получает exec'd, что означает, что доступная память будет единственным ограничением.

+0

Если execvp() загружает одну и ту же программу, то? – Garrick

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