2017-03-02 40 views
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

完美,謝謝! –