3

C を使用してプロセスのツリーを構築する必要がありますfork()。標準入力から一連の数字 (例: 1 5 0 3) を取得し、それらの数字から各ノードの子の数がわかります。例を挙げると、ルート プロセスが 1 つの子を作成し、この 1 つの子が独自の 5 つの子を作成し、それらの 5 つの子から最初の子は子を作成せず、2 番目の子は 3 つの子を作成し、次に 'やり直した。pstreeこれが完了すると、ツリーを描画するルート プロセスが呼び出されます。

例の写真を次に示します。

私の質問は、特定のノードから新しい子を作成するにはどうすればよいですか? 1 つは 0 個の新しいプロセスを作成する必要があり、次は 3 個のプロセスを作成する必要があります。特定の子だけが新しい子を作成し、すべての子を作成しないように区別する方法がわかりません。また、通常、 get が呼び出されpstreeた時点でツリーは既になくなっているため、 の使用方法もわかりません。pstree子を最初に実行できることはわかってwait()いますが、最後の子には待機する子がいないため、終了が速すぎます。

サンプルを作成するコードを書きました。さまざまな入力に対してこれを一般化する方法のアイデアが必要です。また、誰かがこのコードから pstree を呼び出す方法を教えてもらえますか?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>


int main() {

pid_t pid;
pid_t temppid;
pid_t temppid2;
int  root_pid;
int status;

root_pid = getpid();

pid = fork(); // creates a child from root
if (pid == 0) { // if child
    pid = fork(); // fork again (child#1)
    if (pid != 0) { // if not child of child#1
        temppid = getpid(); // get pid
        if (getpid() == temppid) { // create child#2
            pid = fork();
            if (pid == 0) {
                temppid2 = getpid();
                if (getpid() == temppid2) { // create child#1
                    fork();
                }
                if (getpid() == temppid2) { // create child#2
                    fork();
                }
                if (getpid() == temppid2) { // create child#3
                    fork();
                }
            }
        }
        if (getpid() == temppid) { // create child#3
            fork();
        }
        if (getpid() == temppid) { // create child#4
            fork();
        }
        if (getpid() == temppid) { // create child#5
            fork();
        }
    }
}
else {
    // create another child from root
    pid = fork();
        if (pid == 0) {
            // run pstree in this child with pid from root
        }
}

while (1) {
    sleep(1);
}
}
4

3 に答える 3

1

アプリが作成した階層をテストするだけの場合:

配置する代わりに

return 0; 

最後のステートメントとして

while (1)
  sleep(1);

これにより、 を押すまでプロセスが永久に実行されますCtrl-C

アプリを起動したら、別のターミナルを使用して a を発行しpstree、アプリが作成したプロセス階層を調べます。

クリーンアップするには (Linux の場合) killall <app name>、.

于 2012-05-13T15:29:55.217 に答える
1

の場合pstree、解決策は簡単です。すべてのプロセスは、本来あるべきことを行った後、スリープ状態になります (たとえば、1 分間)。
次に、pstree何が起こっているかを確認するために使用できます。

適切な回数フォークするために、問題はフォークではなく、入力の解析にあるようです。
入力を読み取るコードを書くことから始めて、フォークする代わりに、作成したいプロセスのツリーを出力するだけです。これをクリアすると、フォークを正しく実行できないはずです。

于 2012-05-13T14:22:36.617 に答える
0

私の 1 つの提案は、戻り値を使用してfork、コードが子プロセスまたは親プロセスで実行されているかどうかを確認することです。

于 2012-05-13T16:04:25.647 に答える