Это называется логическим оператором , Это будет определять логический результат AND для двух операндов. Свойство этого оператора:
Сначала левый операнд оценивается, если он ИСТИНА (не равен нулю), затем оценивается операнд правой стороны. Если это так, то все выражение истинно, иначе false. С другой стороны, если операнд левой стороны FALSE, то правый операнд не оценивается вообще. Это можно сделать, потому что, поскольку один из операндов является ложным, каким бы ни был другой операнд, выражение становится ложным. Это известно как short circuiting
В вашем коде, если левая рука, если ret
верно, то только правая часть оценивается, что в конечном итоге вызывает fork()
системный вызов. Возвращаемое значение вызова имеет значение AND с текущим значением ret
и переназначено до ret
.
В основном он работает как
if (ret == TRUE)
{
retval = fork();
ret = ret && retval;
}
Прочитайте это:
В случае успеха, PID дочернего процесса возвращается в родительском, и 0 возвращается в дочернем. При ошибке -1 возвращается родительскому, дочерний процесс не создается, а errno устанавливается соответствующим образом.
Рассмотрите дерево вилок ниже. Каждый «узел» дерева показывает последовательность выполняемых операторов в каждом отдельном выражении. Одна работа в одной строке.
(p1)
+--+ret = fork();
| printf 1 shows pid
| && allows fork(), ret = 1 = pid1 && pid2
| printf 2 shows 1 +
| `if' not entered |
| show hello |
| | (p3)
| +--+ ret = 0 = ret && fork() (this is 0 here)
+-----+ printf 2 shows 0
| `if' is entered
| fork()
| show hello
| +
| |
+ |
(p2) |
level 1 +-------+
print 0 in 1st printf |
&& DOES NOT allow fork() (p5)
print 0 in 2st printf show hello
`if' entered
fork() +-----------+
show hello |
|
+
(p4)
show hello
Здесь каждый процесс.
р1 выполняет fork()
один раз, и имеет PID (ненулевой) в RET. печатает pid короткое замыкание позволяет выполнять fork(). Поскольку это родительский элемент, он возвращает еще один pid, который обрабатывается предыдущим дочерним pid, который оценивается как 1. Поэтому ret
теперь содержит 1, который печатается во втором printf. поскольку ret
is 1, if
не выполняется. Привет напечатан.
p2 Ребенок p1, поэтому ret имеет 0. печатает 0 в первом printf. Короткое замыкание не позволяет звонить fork()
. if
тело введено, и fork()
называется, что делает (p4). Теперь (p2) переходит к печати Hello.
p3 Дитя p1, так fork()
возвращение 0, который с операции AND RET, и делает его 0 после назначения. Это порождается после первого printf, поэтому отображается только второй printf 0. if
, выполняется fork()
, что делает (p5). Теперь p4 продолжает печатать Hello.
p4 начинается от if
тела, вылезает и печатает Hello
p5 начинается с if
тела, вылезает и печатает Hello
Выше я попытался выразить дерево процесс икру , а последовательность работ в каждом процессе выражается в каждой строке процесса «узел» на дереве. Края обозначают икру, а край начинается с соответствующей вилки.
Это булевский оператор ... http://en.wikipedia.org/wiki/Boolean_algebra#Basic_operations Кроме того, это очень ... интересно, почему в конце есть 'return 1'. Это нонсенс. – Gandaro
Что вам нужно, это учебник, посвященный основам C. – dandan78
неаккуратный код действительно запутанный –