2017-03-02 6 views
2

私は2つのプロセスを相互に排除しながら共通変数を変更しようとしています。私はこのコードの一部を形成する期待出力がcでセマフォを持つクリティカルセクション

または

ですが、私は私が入る前にスリープ状態にプロセスを入れて試してみた 1.

を得続けます重要なセクションですが、常に同じペースですべてのステップを実行し、クリティカルセクションを一緒に入力しています。どうすれば修正できますか?

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/sem.h> 
#include <sys/ipc.h> 
#include <sys/shm.h> 

static struct sembuf buf; 

void enter(int semid, int semnum){ 
    buf.sem_num = semnum; 
    buf.sem_op = 1; 
    buf.sem_flg = 0; 
    if (semop(semid, &buf, 1) == -1){ 
     perror("Opening semaphore"); 
     exit(1); 
    } 
} 

void leave(int semid, int semnum){ 
    buf.sem_num = semnum; 
    buf.sem_op = -1; 
    buf.sem_flg = 0; 
    if (semop(semid, &buf, 1) == -1){ 
     perror("Closing semaphore"); 
     exit(1); 
    } 
} 
int main(int argc, char* argv[]){ 

    int semid; 

    int i=0; 

    semid = semget(45281, 1, IPC_CREAT|0600); 
    if (semid == -1){ 
     perror("Creating array of sems"); 
     exit(1); 
    } 
    if (semctl(semid, 0, SETVAL, (int)1) == -1){ 
     perror("Setting value to 1"); 
     exit(1); 
    } 
    fork(); 

    enter(semid,0); 
     i++; 
    leave(semid, 0); 

    printf("%d\n",i); 
    } 

答えて

2

fork操作は、親プロセスの完全なコピーである子プロセスのための別のアドレス空間を作成します。したがって、値0の変数iは、生成している子プロセスに複製され、それ自体が別の存在になります。これは、両方のプリントでiの値が1と表示される理由です。

+0

変数iを格納するために共有メモリメカニズムを使用する必要がありますか? –

+0

はい、親プロセスと子プロセスの間で変数を共有する必要があります。 http://stackoverflow.com/questions/13274786/how-to-share-memory-between-process-fork – Jay

+0

完璧、ありがとう!を参照してください! –

関連する問題