Вопрос по работе функции fork(). 3 прохода по коду вместо 2-ух
Изучаю процессы в Unix. Столкнулся с непониманием работы функции fork(). Насколько мне известно, функция должна дважды проходить по коду после вызова функции (1 раз - для родительского процесса, другой раз - для дочернего). Однако, для моего примера код проходит трижды...
#include <unistd.h>
#include "stdio.h"
void main(){
pid_t ret;
switch(ret=fork())
{
case -1: printf("Ошибка\n"); /*при вызове fork() возникла ошибка*/
case 0 : printf("Я потомок\n"); /*это код потомка*/
default : printf("Я родитель, мой ребёнок - %d\n", ret);/*это код родительского процесса*/
}
}
Вывод:
Я родитель, мой ребёнок - 30007
Я потомок
Я родитель, мой ребёнок - 0
Подскажите в чём может быть проблема? Что за процесс, у которого потомок имеет PID == 0?
Ответы (2 шт):
Кажется, я понял в чём проблема. Простешая ошибка, забыл поставить break в конце case ветки и прервать switch оператор ;D
Новый код:
#include <unistd.h>
#include "stdio.h"
void main(){
pid_t ret;
switch(ret=fork())
{
case -1: printf("Ошибка\n"); break; /*при вызове fork() возникла ошибка*/
case 0 : printf("Я потомок\n"); break; /*это код потомка*/
default : printf("Я родитель, мой ребёнок - %d\n", ret);/*это код родительского процесса*/
}
}
Вывод:
Я родитель, мой ребёнок - 30335
Я потомок
С fork'ом это ни как не связано; switch в Си работает по принципу fall-through т.е. совершается переход на нужное условие, а дальше выполняются все последующие действия. Т.о. в потомке выводится скачала «Я потомок», а затем «Я родитель». Дабы этого избежать надо добавить break'и:
switch(ret=fork())
{
case -1: printf("Ошибка\n"); /*при вызове fork() возникла ошибка*/
break;
case 0 : printf("Я потомок\n"); /*это код потомка*/
break;
default : printf("Я родитель, мой ребёнок - %d\n", ret);/*это код родительского процесса*/
break;
}