我试图使两个进程修改一个公共变量,同时相互排斥我希望这段代码的输出是
一
二
或
二
一
但我总是
一
一
我试过在进入临界区之前让进程进入睡眠状态,但它们总是以相同的速度执行所有步骤,并一起进入临界区我怎样才能修好它?
#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);
}
最佳答案
fork操作为子进程创建单独的地址空间,子进程是父进程的精确副本因此,你的变量i
值0将被复制到你正在生成的子进程中,并且有它自己的独立存在,这就是为什么你在两个打印中看到i
值为1的原因。
关于c - C中带有信号灯的关键部分,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42548278/