2017-03-02 2 views
0

Würden Sie bitte überprüfen Sie meinen Code es ist ein C++ - Programm, um 2 Kinder eines Elternteils zu generieren. Der Benutzer sollte den Wert num eingeben, um eine Prozesskette zu erstellen. Das Problem ist die Kinder Pid ist das gleiche für jeden Elternteil, wie kann ich sie anders machen?C++ mit fork(), um 2 Kinder zu generieren

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


using namespace std; 

int main() 
{ 
    cout<<"Please enter a number of process "<<endl; 
    int num; 
    cin>>num; 

    int j; 
    for(j=0; j<num; j++) 
    { 

     pid_t pid; 

     pid = fork(); 

     if(pid < 0) 
     { 
      cout<<"Error"<<endl; 
      exit(1); 
     } else if (pid > 0) { 
      cout << "Parent " << getpid() << endl; 
      exit(0); 
     } 
     else { 
      int i; 
      for(i = 0; i < 2; i++) { 
       wait(NULL); 
       cout << " Child " << getpid() << endl; 

      } 
     } 
    } 

    return 0; 
} 

Der Ausgang ist

Parent 27130 
Child 27322 
Child 27322 
Parent 27322 
Child 31901 
Child 31901 
Parent 31901 
Child 20453 
Child 20453 
+0

Es ist mir ist nicht klar, was die erwartete Leistung ist. –

+0

@RSahu er möchte es nur einmal drucken. Er möchte die PID der zwei Kindprozesse sehen, die der Elternteil erstellt. –

Antwort

0

Mehrere Probleme mit Ihrem Code.
In der else ist das der Kindprozess. Sie sind waiting, wenn dieser Prozess keine untergeordneten Prozesse hat ... so wird es einfach übersprungen und seine PID zweimal gedruckt.

Das hat nichts mit fork sondern mit Ihrer for-Schleife zu tun. for(i = 0; i < 2; i++)

EDIT
Wenn Sie es wollen, nur einmal drucken, entfernen Sie einfach die for-Schleife, und es wird nur einmal gedruckt werden.
Wenn Sie nur die Eltern zwei Gabel zwei Kindprozesse wollen, dann sollten die Strömung als dies:

pid_t pid2; 
cout << "Parent " << getpid() << endl; 
pid_t pid = fork(); 
if (pid == -1) { // handle error } 
else if (pid == 0) { // child process 
    cout << " Child " << getpid() << endl; 
} 
else { // parent process 
     pid2 = fork(); 
     if (pid2 == -1) { //handle error } 
     else if (pid2 == 0) { //child process 
      cout << " Child " << getpid() << endl; 
} 
0

Basierend auf den Kommentar von Tony Tannous, hier ist was ich glaube, Sie brauchen:

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

using namespace std; 

void childFun() 
{ 
    int i; 
    for(i = 0; i < 2; i++) { 

     cout << " Child " << getpid() << endl; 
    } 
} 

int main(){ 

    cout<<"Please enter a number of process "<<endl; 
    int num; 
    cin>>num; 

    int j; 
    for(j=0; j<num; j++) 
    { 
     pid_t pid = fork(); 

     if(pid < 0) { 
     cout<<"Error"<<endl; 
     exit(1); 
     } else if (pid > 0) { 
     cout << "Parent " << getpid() << endl; 
     // Continue on to create next child. 
     // Don't exit. 
     // exit(0); 
     } else { 
     // Do whatever the child needs to do. 
     childFun(); 

     // Exit the child process after that 
     exit(0); 
     } 
    } 

    return 0; 
} 
+0

Ihre Antwort ist ein bisschen problematisch, vor allem will er die PID der beiden Prozesse, die er spawnen will, drucken, dann das erste Kind in seinem Code ein anderes Kind erstellen, das ein anderes Problem ist, obwohl Sie das behoben, es druckt immer noch der Kindprozess pid zweimal. Und es gibt keine Garantie, dass der Elternteil seine PID zuerst ausgibt ... der Kindprozess könnte zuerst ausgeführt werden. Schau meine Antwort an. –

+0

@TonyTannous, ich hoffe, es ist dem OP klar, dass sie den Code in 'childFun' ändern können, um zu tun, was immer sie wollen. Ob die Kind-PID einmal oder zehn Mal gedruckt wird, kann leicht gesteuert werden. In der Reihenfolge, in der die PIDs gedruckt werden, ist es einfach, die Ausgabe des Elternprozesses vor der ersten Verzweigung zu steuern, aber danach gibt es sehr wenig, was ein Programmierer tun kann. –

+0

Vielen Dank für Ihre Hilfe. – user7548941