2016-04-15 2 views
0

私はプロセス同期が必要なプロジェクトに取り組んでいます。私が持っている問題は、使用しているサマフォがすべてのプロセスで共有されていないように見えるということです。ローカル変数と同様に動作します。これは単純化されたコードですが、同じ問題を示しています。C - セマフォーがすべてのプロセスで共有されていません

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 
#include <sys/types.h> 
#include <unistd.h> 
#include <time.h> 
#include <semaphore.h> 
#include <fcntl.h> 


sem_t sem_1; //Global variable (semaphore). 

int main(){ 
    sem_init(&sem_1, 1, 0);  //semaphore starts with 0   
    pid_t child_pid_or_zero = fork(); //process fork 
    if (child_pid_or_zero < 0){  
     perror("fork() error"); 
     exit (2); 
    } 

    if (child_pid_or_zero != 0){ 
     sem_wait(&sem_1);   //decrement to -1 and waits 
     printf("I am the parent %d, my child is %d.\n",getpid(),child_pid_or_zero); 

    }else{ 

     printf("i am child\n"); 
     sem_post(&sem_1);  //increments 
    } 
return 0; 
} 

親プロセスは待機信号を決して通過しません。私は両方のプロセスにmupltiple sem_post()を追加し、sem_getvalue()で値を表示しようとしましたが、印刷された数字は共有されていないようでした(すべてのプロセスが独自のセマフォをインクリメントしました)。

ありがとうございました。

+2

'fork'の後、親と子は別々のアドレス空間を持ちます。それらは 'fork'の直後のアドレス空間の正確な(多かれ少なかれ)コピーですが、それ以降の変更は他のものには見られません。 – kaylum

+1

'sem_init'のマニュアルページを読むか、[共有メモリを使ってプロセス間でセマフォを共有する方法](http://stackoverflow.com/questions/8359322/how-to-share-semaphores-between-processes-using-共有メモリ?rq = 1) – kaylum

答えて

1

POSIXは、sem_initへのpshared引き数(2番目の引き数)がどのように機能するかははっきりしていません。 Linuxのmanページには、より良い、それを説明する:

のpsharedがゼロでない場合には、セマフォはプロセス間で共有され、共有メモリ

そのメモリを割り当て、セマフォを置くの領域内に配置する必要がありますあなたの責任があります。これはシステムがあなたのためにするものではありません。

+0

これは、投稿されたコードの根本的な問題を修正しません – user3629249

0

セマフォは、ファイルのグローバル領域ではなく、共有メモリに存在する必要があります。

したがって、共有メモリを使用するにはshm_open()またはshm_get()またはmmap()を使用する必要があります。

私が言ったように

は、プログラムはいくつかの共有メモリやセマフォを必要と sem_post()データがコピーされ、:子プロセスに渡さ

データは、子プロセスは関数呼び出しので、「コピーオンライト」として設定されていますその共有メモリ内に配置する必要があります。

関連する問題