PID нескольких детей разветвляется от одного и того же родителя

0

поэтому у меня есть эта основная функция:

int main() {
cout << "Before fork: " << getpid() << endl;

pid_t pid;
pid = fork();
for (int i = 0; i < 3; ++i) {
    if (pid < 0) {
        cout << "ERROR: Unable to fork.\n";
        return 1;
    }
    else if (pid == 0) {
        switch(i) {
            case 0:
                for (int b = 0; b < 10; ++b) {
                    cout << "b " << getpid() << endl;
                    cout.flush();
                }

                break;
            case 1:
                for (int c = 0; c < 10; ++c) {
                    cout << "c " << getpid() <<endl;
                    cout.flush();
                }                    
                break;
            case 2:
                for (int d = 0; d < 10; ++d) {
                    cout << "d " << getpid() << endl;
                    cout.flush();
                }                    
                break;
            default:
                cout << "ERROR" << endl;
                return 1;
        }
    }
    else {
        for (int a = 0; a < 10; ++a) {
            cout << "a " << getpid() << endl;
            cout.flush();
        }
    }
}

return 0;

}

Точка этой программы одновременно запускает четыре процесса, каждый из которых печатает символ в определенное количество раз. Всякий раз, когда я запускаю программу, я понимаю, что у детей, которых я создал, есть один и тот же PID. Предполагается, что это так? Если нет/так, почему?

Теги:
fork

1 ответ

1

Вы создали только один ребенок, который затем запускает цикл, в котором он три раза проверяет, что он на самом деле является дочерним. Чтобы создать троих детей, вам нужно три вызова в fork. То есть, что-то вроде этого:

if ((pid1 = fork()) == 0) {
  // work for first child
  exit(0);
}
if ((pid2 = fork()) == 0) {
  // work for second child
  exit(0);
}
if ((pid3 = fork()) == 0) {
  // work for third child
  exit(0);
}
// work for parent, then:
wait(pid1);
wait(pid2);
wait(pid3);
  • 0
    Куда я вставил бы оператор fork (), чтобы были созданы 3 дочерних элемента? Я переместил вилку () в цикл for, но я думаю, что он стал бесконечным и все сломалось.
  • 0
    РЕДАКТИРОВАТЬ: я решил мою проблему, изменив мои операторы break в возвращаемые 0, чтобы предотвратить бесконечные вызовы fork (). Было напечатано 4 разных PID, ничего не сломалось, поэтому я полагаю, что это правильное решение.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню