2017-03-02 10 views
0

私のコードを確認してください。それは、1つの親の2つの子を生成するC++プログラムです。ユーザーはnumの値を入力して一連のプロセスを作成する必要があります。問題は、子供のpidはどのように私はそれらを異なることができます各親のための同じですか?fork()を使って2つの子を生成するためのC++ ++

#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; 
} 

出力はあなたのコードで

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

にです期待される成果が何であるかはわかりません。 –

+0

@RSahu彼は一度だけ印刷したいと思っています。彼は、親が作成する2つの子プロセスのpidを見たいと思っています。 –

答えて

0

複数の問題があります。
elseでは、これが子プロセスです。このプロセスに子プロセスがないときは、waitingです...そのため、スキップしてpidを2回印刷します。

これはforkとは関係ありませんが、forループを使用しています。 for(i = 0; i < 2; i++)

EDIT
あなたはそれが一度だけ印刷したい場合は、単にループのために削除して、それが一度だけ印刷されます。
あなただけの親2つのフォーク2子プロセスが必要な場合、その後の流れはこのようでなければなりません:トニーTannousによってコメントに基づいて

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

は、ここで私はあなたが必要だと思うものです:

#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

あなたの答えはちょっとした問題です。まず最初に、最初の子は別の問題である別の子をコード内に作成しますが、それを修正してもそれは印刷されます子プロセスpidが2回実行されます。親が最初にpidを出力するという保証はありません。子プロセスが最初に実行される可能性があります。私の答えを見てください。 –

+0

@TonyTannous、私は彼らが望むところは何でもするために 'childFun'のコードを変更することができることはOPには分かりやすいことを願っています。子PIDを1回または10回印刷するかどうかは簡単に制御できます。 PIDの印刷順序は、最初のforkの前に親プロセスの出力を制御するのは簡単ですが、その後はプログラマが行うことはほとんどありません。 –

+0

ありがとうございます。 – user7548941

関連する問題