2016-02-15 3 views
0

У меня есть ниже запрос относительно процесса вилки(): что у меня есть код:вилка() с из еще

if(fork()||fork()) 
printf("1"); 
else if(!fork()) 
printf("2"); 
else 
printf("3"); 

из них, которые будут печататься 1,2 или 3. я знаю fork() возвращает ненулевое значение для родительского процесса и 0 для дочернего процесса. Поэтому, когда он попадает в первый оператор, первый вызов fork() возвращает say 1 для родительского процесса и 0 для дочернего процесса. потому что theres || оператор, второй fork() будет запускаться только тогда, когда первый операнд возвращает 0. так что вторая fork будет вызвана на дочернем, а не на родительском. Правильно ли я понимаю? если да, то 1 будет напечатано ребенком. Тогда он перейдет в другое, если и еще блокирует? Любая помощь будет оценена!

+0

Пожалуйста, открепите свой код. –

ответ

0

Первый процесс печати 1.

ребенка от исходного процесса напечатает 1 из возвращает истину во второй половине ||.

Ребенок развилки после || выйдет из строя else - если из-за ! и напечатайте 3, пока его дочерний элемент будет печатать 2, потому что! 0 истинно.

+0

Спасибо @xaxxon. Если я правильно понимаю, будет ли 1 печататься только родительским процессом первого fork(), а не дочернего процесса? если да, родительский выход и поток продолжаются с дочерним элементом из первого fork(), оценивающего вторую fork() после ||? – user4067046

+0

Детский процесс первой вилки получил ложный возврат на первой вилке, поэтому он оценивает бит после символа ||, что вызывает его для fork снова. Исходный ребенок затем получает не-0 (истинное) возвращаемое значение, в результате чего исходный оператор if возвращает true. – xaxxon

+0

Еще раз спасибо @xaxxon. Японял твою точку зрения. Итак, после того, как этот ребенок второй fork() продолжит с else, если (! Fork()) block.И потому что дочерний элемент этой новой третьей fork() возвращает 0, делая else if (! Operator) block true, будет печатать 2 и оригинальный ребенок из второй вилки будет печатать 3. – user4067046

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