Вопрос по работе функции 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 шт):

Автор решения: Chudvan

Кажется, я понял в чём проблема. Простешая ошибка, забыл поставить 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
Я потомок
→ Ссылка
Автор решения: Fat-Zer

С 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;
}
→ Ссылка