2016-11-26 7 views
0

PIDを保持するためにプロセス間で共有メモリを使いたいと思っています。PIDを保持するためのグローバル配列。 Fork()、Unix procesess、Cプログラミング

グローバル配列pid_t型を作成し、配列の要素の値を変更したforkという新しいプロセスを使用しました。

なぜ、親プロセスの配列は、配列が同じものを指している場合に変更されないのですか?

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

pid_t p[1]; 

int main() 
{ 
pid_t f; 

f = fork(); 
if(f == 0) 
{ 
    p[0] = getpid(); 
    printf("Child ... p[0] PID = %d\n", (int)p[0]); 
    printf("points at %ld\n", (long int)p); 
} 
else if (f > 0) 
{ 
    sleep(1); 
    printf("Parent... p[0] PID = %d\n", (int)p[0]); 
    printf("points at %ld\n", (long int)p); 
} 
else 
{ 
    printf("Fork() error \n"); 
    exit(1); 
} 

} 
+0

'fork()'の一般的な考慮事項1)子プロセスは 'exit()'の呼び出しで終了しなければなりません。2)終了前に親プロセスは 'wait()'または 'waitpid子供が最初に出て行く。さもなければ、子供はコンピュータを再起動せずに排除することが非常に困難な「ゾンビ」プロセスになる。 3)共有メモリを使いたい場合は、共有メモリに必要な関数であるshmat() '' shmget() '' shmctl() '' shmdt() '' ftok() – user3629249

答えて

1

fork()で作成されたプロセスはメモリを共有しません。作成された新しいプロセスでは、親プロセス内にあるもののコピーが取得され、既存のデータへの参照は取得されません。実際には、子は親とはまったく異なるアドレス空間で動作します。したがって、あなたのp []配列は子の中の別の配列であるため、それを変更しても親の配列は変更されません。

fork()で作成したプロセス間でメモリを共有する場合は、pipe()を使用してデータを一方向に、mmap()を使用して共有メモリの領域をマップするか、あなたのOS一般的に言えば、実際にメモリを共有する必要がある場合は、プロセスではなくスレッドを使用する方がよいでしょう。

aside:sleep()の使用は、イベント(この場合はp []の変更)が発生していることを必ずしも保証するものではありません。親でwait()ファミリーの関数の1つを使用して、子が終了するまで親をブロックさせることができます。

関連する問題