2013-03-30 4 views
2

Я хочу развить три дочерних процесса в одном родителе. И следующий мой C++ код:fork mulitple child in one parent

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    pid_t pid; 
    for (int i = 0; i < 3; i++) 
    { 
     pid = fork(); 

     if (pid < 0) 
     { 
      cout << "Fork Error"; 
      return -1; 
     } 
     else if (pid == 0) 
      cout << "Child " << getpid() << endl; 
     else 
     { 
      wait(NULL); 
      cout << "Parent " << getpid() << endl; 
      return 0; 
     } 
    } 
} 

Теперь мой выход:

Child 27463 
Child 27464 
Child 27465 
Parent 27464 
Parent 27463 
Parent 27462 

Как я должен изменить свою программу, чтобы получить выходной сигнал как следующий?

Child 27463 
Child 27464 
Child 27465 
Parent 27462 

То, что я имею в виду, что эти трое детей должны принадлежать одному и тому же один из родителей, кто-нибудь может дать мне предложение?

Спасибо всем. :)

ответ

1

Вы должны выйти из выполнения дочерних процессов. В противном случае они продолжают форкировать также

pid_t pid; 
for(i = 0; i < 3; i++) { 
    pid = fork(); 
    if(pid < 0) { 
     printf("Error"); 
     exit(1); 
    } else if (pid == 0) { 
     cout << "Child " << getpid() << endl; 
     exit(0); 
    } else { 
     wait(NULL); 
     cout << "Parent " << getpid() << endl; 
    } 
} 
+0

Да! Это верно. Большое спасибо :) – jaychung

0

Есть два вопроса:

  • детей ZERO и один продолжить цикл for, порождая дополнительные процессы;
  • «родительская» ветвь заканчивается вместо продолжения цикла.

Ниже будет производить вывод, который вы хотите:

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <iostream> 

using namespace std; 

int main() 
{ 
    pid_t pid; 
    for (int i = 0; i < 3; i++) 
    { 
     pid = fork(); 

     if (pid < 0) 
     { 
      cout << "Fork Error"; 
      return -1; 
     } 
     else if (pid == 0) { 
      cout << "Child " << getpid() << endl; 
      return 0; 
     } else { 
      wait(NULL); 
      if (i == 2) { 
       cout << "Parent " << getpid() << endl; 
      } 
     } 
    } 
} 

Когда я запускаю его, я получаю

Child 4490 
Child 4491 
Child 4492 
Parent 4489 
+0

Спасибо вам за обучение. Теперь я это знаю. :) – jaychung

0

Перемещайте return 0 из последнего условия в среднее:

if (pid < 0) 
    { 
     cout << "Fork Error"; 
     return -1; 
    } 
    else if (pid == 0) { 
     cout << "Child " << getpid() << endl; 
     return 0; 
    } 
    else 
    { 
     wait(NULL); 
     cout << "Parent " << getpid() << endl; 

    } 

Таким образом, родитель будет продолжать работать p, а дети будут прерываться, а не циклироваться.

+0

Я получил это !!! Спасибо^__^ – jaychung