2013-09-10 2 views
1

Я смущен одним аспектом функции C fork.Системный вызов C fork неявным образом выполнен

Если я это сделать:

int pid; 

if (pid = !fork()) { 
    //some code 
} else { 
    printf("%d\n","Waiting for child"); 
    wait(&pid); 
} 
return 0; 

Вилка будет выполняться неявно или иначе, но я не могу понять, что. Как я вижу, такие вещи, как это общие идиомы в C:

int fn; 

while (fn = someFunction()) { 
    //doSomething 
} 

Последний пример не связан с вилкой, но у него есть, что неявная часть (условие), который я не понимаю.

Спасибо.

ответ

2

В C результатом присваивания является выражение со значением, равным значению, удерживаемому переменной после завершения назначения. Любое нулевое значение будет приниматься как «ложное» в условном тесте, и в противном случае условие будет оцениваться как «true».

В обоих примерах результат присваивания используется в качестве теста условного оператора. Некоторые компиляторы C выдают предупреждение при просмотре этой конструкции, потому что это обычная ошибка, чтобы случайно набрать = (assginment), когда было предусмотрено == (равенство). Предупреждение обычно подавляются сообщая компилятор, что вы действительно намерены использовать назначение в качестве тестового значения с дополнительным набором скобок:

while ((fn = someFunction())) { 
    //doSomething 
} 

Обратите внимание, что fork() работает, потому что wait(0) будет ждать любого дочернего процесса в той же группы процессов, что и родитель. Однако переменная pid действительно не содержит идентификатор процесса. Он удерживает результат логического - не применяется к результату вызова fork().

1

Нет такой вещи, как «неявный». Когда вы вызываете функцию с круглой скобкой, вызывается функция. pid будет иметь возвращаемое значение fork, а у fn - возвращаемое значение someFunction. Это условие применимо к вашим значениям.

+0

На самом деле, поскольку в этом примере указано 'if (pid =! Fork())', 'pid' не будет иметь возвращаемого значения' fork() '. Он будет равен «0» в родительском и «1» в дочернем. –

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