c中有信号量的关键部分

时间:2017-03-02 06:27:26

标签: c semaphore

我正在尝试让两个进程修改一个公共变量,同时互相排斥。我希望这段代码的输出是

1 2 要么 2 1

但我一直在接受 1 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);
  }

1 个答案:

答案 0 :(得分:2)

fork操作为子进程创建一个单独的地址空间,它是父进程的精确副本。因此,值为0的变量i将被复制到您正在生成的子进程中并且具有它自己的独立存在,这就是为什么在两个打印中看到$all=[]; for($i=0;$i<6;$i++){ $all[]=$doctor[$i]; $all[]=$clinic[$i]; } 值为1的原因。