У меня есть эта программа, которую я считаю несколько вводящей в заблуждение и трудной для понимания:

int i=2;
int j=10;
int p;

while(--i && (p=fork())
{
    if(p<0)
        exit(EXIT_SUCCESS);
}
j=j+2;
if(p==0)
{
   i=i*3;
   j=j*3;
}
else
{
    i=i*3;
    j=j*2;
}
printf("pid=%d i=%d j=%d\n",getpid(),i,j);

Эта программа приводит к следующему:

Родитель: PIDHERE, i = 0, j = 24.

Ребенок: ПИДЕРА, i = 3, j = 36.

Но почему именно это происходит? Если у родителя i = 0, это означает, что while было выполнено дважды, но не означает ли это, что два дочерних элемента созданы вместо одного, поскольку в while есть оператор fork ()?

Кроме того, когда цикл while прекращается? (логическое выражение сбивает с толку fork ()!).

0
Amine 26 Ноя 2016 в 22:10

2 ответа

Лучший ответ

--i предшествует i. В первый раз, когда while оценивает свое состояние, он увидит, что i имеет значение 1. Во второй раз он увидит, что i имеет значение 0. Итак, цикл порождает только одного ребенка.

while останавливается, когда видит, что i равно 0 (в родительском), или если fork возвращает 0 (в дочернем).

2
pat 26 Ноя 2016 в 19:27

Благодаря предварительному приращению цикл while по существу эквивалентен:

i=1;
p=fork();
if(p<0)
    return 0;
else if(p)
    i=0;

fork() вызывается только один раз.

1
PSkocik 26 Ноя 2016 в 19:29