2012-03-14 19 views
2

fork()を使用して複数の子を作成したいが、問題に直面している。 LIKE:Linuxでfork()を使用した複数の子の作成

///////////////////////// these are some class objects creation and calling 
// There are some functions calling from another class. about 5 functions I invoked. 
// and some variables like. 

    pid_t PID; 
    int status = 0; 
    char *x = new char[10]; 

///////////////////////// This for loop give me multiple children 
// now one parent have multiple children in this case 10 


    for(int i=0; i<10; i++) 
    { 
     mNo++; 
     rNo++; 
     PID = fork(); 

     if(PID == FORK_ERROR)   // fork ERROR! 
     { 
      fprintf(stderr, "ERROR! In fork() [FORCE EXITING]... %d\n", errno); 
      exit(EXIT_FAILURE); 
     } 
     else if(PID == CHILD)   // Do Child Stuff Here... 
     { 
      exit(status); 
     } 
     else   // Do parent Stuff Here... 
     { 

     } 
    } 
    PID = wait(&status); 

//////////////////////////////////////////// 

これは私が実装私のコードだったが、いくつかの問題があります。

私は、メモリに子を作成すると、重複したメモリが作成されることをお伺いしたいと思います。私が宣言したオブジェクトも。彼らはfork()を呼び出すことによって再呼び出しされているのですか?それは、すべての子どものために、クラスに再呼び出しされたメモリ内のオブジェクトがあることを意味しますか?

もし私がフォークして、以前の関数呼び出しと変数がすべての子に対して同じでなければならないが、非冪等の関数ではない。あなたがそれを得ることを願っています。私はこれが非常に単純な問題だと知っていますが、私が取り組んでいるプロジェクトは非常に重要であり、パイプやスレッドではなくfork()で実装する必要があります。

さらに、私はfork()の場合、オブジェクトと変数はどうなるのかという質問を繰り返しています。フォークを呼び出す前に、彼らはただ再配分されるのですか、それとも、すべての子供のために再び再登場されますか?しかし、私が見ていることは、彼らが私が欲しくないすべての子供のために再呼び戻されているということです。だから私は何をしなければならないのですか?

+1

CまたはC++でコーディングしていますか?どちらか一方を選択してください。 –

+0

あなたが何を望んでいるのか、何が問題なのかを理解することは本当に難しいです。私が推測していることは、 'fork()'コピーオンライトの振る舞いによって全てのオブジェクトが複製されることを望まないということです。もしそうなら、 'fork()'はあなたを助けません。オブジェクトを共有する場合は、プロセスの代わりにスレッドを使用する必要があります。 – Javier

+0

「再喚起」とはどういう意味ですか? – Sid

答えて

2

fork()の行動は、あなたの希望に合わせて変更されません。

プロセスがフォークするとき、同じプログラムの2つのほとんど同じコピーがあります。相違点は、POSIXのマニュアルページ(上のリンク)にリストされています。記憶は同じです。たとえば、C++のオブジェクトは再構築されません。プロセスのそれぞれにおいて、すべてのシングルトンは、依然としてシングルトンである。

私に例を教えてください。

ここには、1991年に書いた完全なメインプログラムがあります。私はmain()のプロトタイプを使用するように更新されていると私はPipeのtypedefとidの定義を含めました:

static char id[] = "\n\n\nSQLMONITOR version 3.5 \n"; 
typedef int Pipe[2]; 

int main(int argc, char **argv) 
{ 
    int  pid; 
    Pipe to_sqlexec; 
    Pipe from_sqlexec; 

    setarg0(argv[0]); 
    write(STDERR, id, sizeof(id)-1); 
    if (pipe(to_sqlexec) < 0 || pipe(from_sqlexec) < 0) 
     error("unable to create pipes"); 
    else if ((pid = fork()) < 0) 
     error("unable to fork"); 
    else if (pid == 0) 
     be_childish(argv, to_sqlexec, from_sqlexec); 
    else 
     be_parental(to_sqlexec, from_sqlexec); 
    return(0); 
} 

be_childish()関数は(の適切な部分を複製し、閉じいくつかの配管を行うようになりましたパイプは、別のプログラムを実行する前に実行されました。be_parental()プロセスは、標準入力からメッセージを読み込んでファイルに記録し、メッセージをto_sqlexecパイプの書き込み側に子の標準入力に書き込むようになりました。 from_sqlexecパイプの読み取り側の子から応答を読み込み、そのメッセージもログに記録し、それを標準出力に書き込むと、middlに格納されます2つのプロセスから構成されています。プロセス間の通信プロトコルは同期していたため、人命を大幅に簡素化しました。一方、1つのプロセスからのデータが完成した時点では、それほど大変なことはありませんでした。このコードは、普及率がselect()poll()のものよりも前であった。今日では、メッセージの多くの分析を行う必要はありません。

ただし、重要な点は、fork()の後の両方のプロセスで2つのパイプが同じであることです。実際には、異なる変数はpidで、戻り値はfork()から取得されます。他はすべてfork()の前と同じです。

+0

私に例を教えてください... –

+0

正確な例は?子プロセスでは、親プロセスと同様に、作成されたすべての変数はまだ存在しています...よく、スレッド化されたアプリケーションでは複雑になります。ここでは問題ではありません。したがって、子プロセスは戻り値として値0を受け取る 'fork()'から戻ります。親はその子のPIDを受け取る 'fork()'から復帰します。次に起こることはコードに依存します。あなたのケースでは、あなたの子供は 'exit()'で自分自身を消しているようですが、親はもう少し繁殖します。 –

+0

OK ..私の場合、起こっているオッターのことが1つあります。私はちょうどforループの前に気付いていて、シェルでは何度も印刷します。複数回印刷しないでください。親を印刷するだけで、1回だけ印刷する必要があります。ではない?。それは私を良く感じない。どうしてこれなの。 –

1

fork()が何をしているか分からないようです。それはあなたがそれが正しい機能であると確信していることは奇妙に思われます。それについて

読む:一見

http://linux.die.net/man/2/fork

http://en.wikipedia.org/wiki/Fork_(operating_system)

、子プロセスが親プロセスのメモリのコピーを取得することが表示されます。

+0

本当にありがとうございます。私はオブジェクトとデータに何が起こるかという質問だけを知りたい。私はフォークの前に宣言した。それはいくつかのスレッドが動作します。フォークを使用します。 OK。私が欲しいものは私が説明することができます: –

+0

obj 1; obj 2、obj 3、obj1(); obj2(); obj3(); –

+0

今i fork()。フォークの実装のすべてのことを行います。オブジェクトに起こることは、すべての子どものためにリコールされるかどうかです。私は彼らが再びクラスに電話をしてはならないと思う。 –

1

私が考えると、すべてのオブジェクトと変数は、親プロセスとまったく同じになると思います。私は理解していない "しかし、私は彼らがすべての子供のために再呼び戻されているのを見ている"ここに再呼び出されるものは何ですか?

+0

reinvokedは、関数を使用してリソースまたはオブジェクトをどのように使用するかを意味します。 –

2

子プロセスをフォークすると、子プロセスはヒープを含む親プロセスのコピーになります。したがって、新しいオブジェクトを使用して割り当てられたオブジェクトまたはメモリの個別のコピーが作成されます。あなたがreinvokedによって何を意味するのか分かりませんが、親でnew()を使ってオブジェクトを割り当てた場合、別々の2つのプロセスで2つの別々のヒープに2つの別々のオブジェクトを持つことになります。 1つは親プロセスの元のもので、もう1つは子プロセスのコピーされたヒープのコピーです。

これはよりよく理解するのに役立ちます:Linux fork within class on heap

+0

ありがとうございます。あなたは答えます。インターネット上のすべてのものを読んで検索する。私はフォークの前にこれまで何を作り出したのか、プログラムの状態を今まで知って来ました。フォークの後、彼らはコピーされます。それはすべきだ。コピーされたデータを個別に処理したいことがこれまでにありました。パラレル。ありがとうございます –

関連する問題