1

子を使用してシェルのディレクトリを変更するコマンドシェルを作成していますが、配列の内容を変更するために子を取得できません。

最終的には、「/」の代わりに現在のディレクトリを出力するだけです。子はnewDirectory配列に影響を与えません。私は何が間違っているのですか?子に配列の内容を変更させる方法はありますか?ありがとう。

char newDirectory[255];

getcwd(newDirectory, 255); //set newDirectory to current directory

pid_t pid;      

pid = fork();

if(pid == 0){   //child execution       

    strcpy(newDirectory, "/");

    exit(0);
}

else if (pid < 0){                  
    printf( "Error!\n");    
    exit(1);
}
else{                       
     pid = waitpid(pid, NULL, 0);   
}
printf("%s\n", newDirectory);
chdir(newDirectory);
4

2 に答える 2

2

(コメントから移動します)

fork()新しいプロセスを実行すると、親の独立したコピー1になるため、子の変数に加えた変更は親プロセスからは見えません。2 つの独立した仮想アドレス空間があります。

子プロセスが親プロセスと通信するようにしたい場合は、何らかの IPC メソッド (パイプ、共有メモリ、ソケットなど) を使用する必要があります。


  1. 実際、最新のシステムでは、アドレス空間のコピーは実際にはコピーオンライトで実装されていますが、それはポイントを変更しません。
于 2013-02-23T21:43:50.557 に答える
0

最も簡単な解決策は、子プロセスを使用して現在の作業ディレクトリを変更しないことです (Matteo が述べているように、現在の作業ディレクトリは親プロセスではなく子プロセスでのみ変更されるため)。

既存のシェル (bashや などsh) を確認すると、一部のコマンドが「組み込み」と見なされ、cdそのようなコマンドの 1 つであることがわかります。

于 2013-02-24T06:16:19.230 に答える