2

1 つの親で 3 つの子プロセスをフォークしたい。そして、以下は私のC++コードです:

#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

私が言いたいのは、これらの 3 人の子供は同じ 1 つの親に属している必要があるということです。

皆さん、ありがとうございました。:)

4

3 に答える 3

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;
    }
}
于 2013-03-30T09:02:27.083 に答える
0

2 つの問題があります。

  • 子 0 と 1 は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
于 2013-03-30T09:02:09.010 に答える
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;

    }

このようにして、親はループし続け、子はループする代わりに終了します。

于 2013-03-30T09:02:20.873 に答える