0

fork() が親プロセスからメモリを複製する方法について、私はとても混乱しています。例を書いてそれを見つけようとしました:

int global_var = 0;


int main(int argc, char* argv[]){

    int local_var = 1;

    pid_t child;

    child = fork();


    if (child < 0){
        cout << "Fork error: " << strerror(errno) << endl;
        return 1;
    }



    if (child != 0 ){ // parent


        cout << "Parent: global address: " << &global_var << endl;
        cout << "Parent: local address: " << &local_var << endl;

        ++global_var;
        ++local_var;

        cout << "Parent: global: " << global_var << endl;
        cout << "Parent: local: " << local_var << endl;



    }else{

        cout << "Child: global address: " << &global_var << endl;
        cout << "Child: local address: " << &local_var << endl;

        sleep(1);

        cout << "Child: global: " << global_var << endl;
        cout << "Child: local: " << local_var << endl;
    }

    return 0;

}

そして、私は結果を見ました:

親: グローバル アドレス: 0x6021a0 親: ローカル アドレス: 0x7fff942dd99c 親: グローバル: 1 親: ローカル: 2 子: グローバル アドレス: 0x6021a0 子: ローカル アドレス: 0x7fff942dd99c 子: グローバル: 0 子: ローカル: 1

子の変数が親の変数と同じアドレスにあるにもかかわらず、子が変数の変更を認識しなかったのはなぜですか。誰かがこれを説明するのを手伝ってくれませんか。

前もって感謝します。

4

3 に答える 3

1

子と親はメモリを共有しません。住所は同じ値ですが、2 つの異なる都市の「123 Main Street」のように、別々のスタックにあります。これらはメモリ内の 2 つの異なる場所を参照します。親が行った変更は子のスタックで発生しなかったため、子にはその変更が表示されません。

于 2013-10-16T03:31:13.533 に答える
0

プロセスを fork すると、そのプロセスは親のコピーである独自のプログラムになります。

サンプルコードでは、親プロセスで global_var と local_var のみをインクリメントします。

これを見てみてください。

int global_var = 0;

int main(int argc, char* argv[]){
int local_var = 1;

pid_t child;

child = fork();


if (child < 0){
    cout << "Fork error: " << strerror(errno) << endl;
    return 1;
}



if (getpid() != 0 ){ // parent
    cout << "Parent: global address: " << &global_var << endl;
    cout << "Parent: local address: " << &local_var << endl;

    ++global_var;
    ++local_var;

    cout << "Parent: global: " << global_var << endl;
    cout << "Parent: local: " << local_var << endl;



}else if(getpid() == 0){ // child

    cout << "Child: global address: " << &global_var << endl;
    cout << "Child: local address: " << &local_var << endl;

    ++global_var;
    ++local_var;

    cout << "Child: global: " << global_var << endl;
    cout << "Child: local: " << local_var << endl;
}

return 0;

}

これが役に立てば幸いです。フォークは時々混乱します。

于 2013-10-16T03:48:00.083 に答える