2014-01-31 6 views
0

поэтому у меня есть эта основная функция:PID нескольких детей отделилась тот же родительский

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. Предполагается, что это так? Если нет/так, почему?

ответ

1

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

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 ребенка? Я переместил вилку(), которая у меня была в петле для меня, но я думаю, что она пошла бесконечно и разбила все. –

+0

EDIT: Я решил проблему, изменив свои инструкции break в ответ 0, чтобы предотвратить бесконечные вызовы fork(). Было напечатано 4 разных PID, ничего не разбилось, поэтому я полагаю, что это правильное решение. –

+0

Выполнение трех разных вещей с помощью цикла for, который делает (почти) ничего, кроме большого оператора switch, не является тем, что передало бы обзор кода, где я работаю, но, эй, это ваш код, я полагаю, у вас есть веская причина для этого, путь. –

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