2016-04-14 19 views
3

私は、子プロセスと親プロセスの間で共有メモリを使用してプログラムを実行しようとしています。プログラムはまた、フォークを使用します。Cアクティブ待ちの子プロセス間でメモリを共有するときのエラー

運動のobjetiveがある:アクティブ待ちと -Father(共有メモリで)子供に送って3回ベクトル

を、VECを受け、それを印刷し、同期変数を変更-childここで
Struct: 
    typedef struct{ 
    int change[NUM_TOTAL]; 
    int synchronize; 
    }Exchange; 

Exchange *vec; 

int fd = shm_open("/shmtest8",O_CREAT| O_RDWR,S_IRUSR|S_IWUSR); 
//Check shm_open error 
ftruncate(fd, 100); 
vec = (Exchange*) mmap(NULL,100,PROT_READ|PROT_WRITE, MAP_SHARED, fd ,0);  

    x = forkFunc() //Creates a fork, and return 0 to parente and > 0 to child process 
    if(x == 0){ //Parent 
    int cont = 0; 

    while(cont != 3){ 
     printf("Father\n"); 
     vec->synchronize = 1; //Now go to to the child 

     while(vec->synchronize!=0); //the child change the variable to 0     
     cont++; 
     printf("cont %d",cont); 
    } 


    wait(NULL); 

    munmap(vec,sizeof(vec)); 
    close(fd); 
    shm_unlink("/shmtest8"); 


}else if(x > 0){ //Child 

    int cont = 0; 

     while(vec->synchronize!=1); //Exit while when father change the variable to 1 
     int i; 

    for(i = 0; i < 10; i++){ 
      printf("%d\t",i); 
     } 

     vec->synchronize =0; //Return to the father 
} 

出力のexempleです:

 Father 
    Child 
     0 1 2 3 4 5 6 7 8 9 
    cont 1 
    Father 

最初の反復後、プログラムは "while(vec-> synchronize!= 0);"の後にフリーズします。 ...私はproblemaが子プロセスに存在すると思うが、私はなぜ知りません...任意のアイデア?

+1

は子供だけ '一度、それが戻って '0'して終了し、それをトグル1 'へ' synchronize'を反転させながら、自分の子プロセスの一部は、1以上を持つべきだと思います。したがって、親プロセスは、(終了した)子プロセスがもう一度共有変数を切り替えるための終わりのないビジー待機で、メインループの2回目の反復でスタックされます。 – pilcrow

答えて

3

私はループ

while(cont != 3){ 
    while(vec->synchronize!=1); //Exit while when father change the variable to 1 
    int i; 
    for(i = 0; i < 10; i++){ 
      printf("%d\t",i); 
    } 

    ec->synchronize =0; //Return to the father 
    cont++ 
} 
+0

Worked! 100%機能性、ありがとう! – Joseph

1

がオフ手分からないのですが、私は2つのスレッドが同じ変数(vec->synchronize)に書いているすべての時間は、あなたがトラブルになっていることを伝えることができ、ありがとうございました。このような同期のために、パイプまたはsemaphoresをお勧めします。共有メモリを使用するのは、1つのスレッドのみが書き込みを行う場合、または(セマフォやmutexなどの)他のメカニズムを使用して共有メモリへのアクセスを制御する場合です。

+0

私はセマフォの使い方を知っていますが、許可されていません。 – Joseph

+0

OK、次に、共有変数を使ってどのようにセマフォが低レベルで実装され、独自の実装を書くか:)。冗談ではありません - 実際にshmが利用可能ならば、私は何をしますか?セマフォー(またはmutex)を作業すると、すべてがはるかに簡単になります。出発点については、例えば、[Peterson's Algorithm](https://en.wikipedia.org/wiki/Peterson%27s_algorithm)を参照してください。 – cxw

1

セマフォを使用できない場合は、シグナルとシグナルハンドラを代わりに使用してください。あなたが信号を使用することができない場合は私は2つの他のソリューションを見ることができます:あなたのコードは重要なゾーンにあるとき

  1. 使用マスクは、すべての信号をブロックするために(共有メモリを変更します)。この方法で、データ共有メモリが破損していないことを保証します。

  2. while(vec->synchronize!=1)の代わりに、Test & Setのようなアトミック関数を使用する必要があります。この問題は、ソフトウェアで実装するのがかなり難しいことです。

ここで、これらの最大の欠点は、あまりにもあまり良い解決策ではないことです。マルチプロセッサシステムでは機能しません。

+0

Nevado、答えとして投稿するのは間違いありません:)。サイトへようこそ! – cxw

関連する問題