2016-06-11 12 views
1

2つのプロセスで2つの値を乗算して除算する短いプログラムを書いた。 問題はアプリケーションの最後に発生します。一緒に追加すると、乗算と除算の結果が必要になります。Cでforkを使うには

コード:

#include <stdio.h> 
#include <stdlib.h> 

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

    int iloczyn, a, b; 
    int *w_iloczyn, *w_a, *w_b; 

    float iloraz, suma, result; 
    float *w_iloraz, *w_suma, *w_result; 

    scanf("%d", &a); 
    scanf("%d", &b); 

    w_a = &a; 
    w_b = &b; 

    pid_t id = fork(); 

    if (id == 0) { 

     iloczyn = (*w_a) * (*w_b); 

     w_iloczyn = &iloczyn; 

     printf("%d * %d = %d\n", *w_a, *w_b, *w_iloczyn); 

    } else { 

     int status = 255; 

     id = wait(&status); 

     id = waitpid(id, &status, 0); 

     iloraz = (float) *w_a/(float) *w_b; 
     w_iloraz = &iloraz; 

     printf("%d/%d = %f\n", *w_a, *w_b, *w_iloraz); 
    } 

    printf("Iloczyn: %i\n", *w_iloczyn); 

    printf("Iloraz: %f\n\n", *w_iloraz); 

    return 1; 
} 

加算の結果は、メモリ保護違反です。 私は何が間違っていますか?

+3

プロセスはメモリを共有しません。 –

+1

親プロセスと子プロセスは別々のアドレス空間を持ちます。 – jarmod

+2

新しいプロセスの代わりにスレッドが必要なメモリを共有したい場合 –

答えて

3

あなたがfork()を使用すると、結果は2つの別個の処理です。彼らはメモリを共有しません(技術的には行いますが、変更は伝播しません)ので、使用するポインタは必ず子プロセスでは有効ではありません。

だから、いくつかの問題がある:ローカル変数へのポインタが完全に間違った場所を指すことがあり、それらの値が一致しない場合がありますし、何の値は、ローカル変数の値を変更することで、親プロセスに返されません。

1

フォーククレートの新しいプロセス。その時点から、両方のプロセス(元のプロセスと新しいプロセス)は、変数にアクセスすることによって異なるメモリブロックを変更します。つまり、変数w_ilorazへの最初のプロセスでは決して値が割り当てられず、2番目のプロセスでは変数w_iloczynには何も割り当てられません。

あなたはプロセス間でデータを共有したい場合は、IPC(プロセス間通信)を見てみましょう。 共有メモリを使用できます(関数shmget、shmat、shmdtなどを使用)。 sem_open、sem_wait、sem_post、sem_closeなどの関数を使用して共有メモリを操作する必要があります。

あなたはまた、(名前の)パイプ(男性パイプを参照)、または名前付きパイプを(はmkfifo参照)を使用することができます。

関連する問題