c语言中带信号量的临界截面

c语言中带信号量的临界截面,c,semaphore,C,Semaphore,我试图让两个进程修改一个公共变量,同时相互排斥。我期望从这段代码中得到的输出是 一, 2. 或 2. 一, 但我一直在 1. 一, 在进入关键部分之前,我尝试过让进程休眠,但它们总是以相同的速度执行所有步骤,并一起进入关键部分。我怎样才能修好它 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/sem.h> #include <sys/ipc.h&

我试图让两个进程修改一个公共变量,同时相互排斥。我期望从这段代码中得到的输出是

一, 2. 或 2. 一,

但我一直在 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);
  }
#包括
#包括
#包括
#包括
#包括
#包括
静态结构sembuf-buf;
无效输入(int-semid,int-semnum){
buf.sem_num=semnum;
buf.sem_op=1;
buf.sem_flg=0;
if(semop(semid,&buf,1)=-1){
perror(“开放信号量”);
出口(1);
}
}
无效休假(整数semid,整数semnum){
buf.sem_num=semnum;
buf.sem_op=-1;
buf.sem_flg=0;
if(semop(semid,&buf,1)=-1){
perror(“关闭信号量”);
出口(1);
}
}
int main(int argc,char*argv[]){
int-semid;
int i=0;
semid=semget(45281,1,IPC|u CREAT|0600);
if(semid==-1){
perror(“创建SEM阵列”);
出口(1);
}
if(semctl(semid,0,SETVAL,(int)1)=-1){
perror(“设定值为1”);
出口(1);
}
fork();
输入(semid,0);
i++;
休假(semid,0);
printf(“%d\n”,i);
}

fork操作为子进程创建一个单独的地址空间,它是父进程的精确副本。因此,值为0的变量
i
将被复制到您正在生成的子进程中,并且它自己独立存在,这就是为什么您在两个打印中都将
i
值视为1的原因。

我应该使用共享内存机制来存储变量i吗?是,如果要在父进程和子进程之间共享变量,则应该。我想你的目的是了解更多关于关键部分的信息。然后,这更符合多线程(使用like pthreads)而不是多处理(使用like
fork()
)。所以我建议退房