c语言中带信号量的临界截面
我试图让两个进程修改一个公共变量,同时相互排斥。我期望从这段代码中得到的输出是 一, 2. 或 2. 一, 但我一直在 1. 一, 在进入关键部分之前,我尝试过让进程休眠,但它们总是以相同的速度执行所有步骤,并一起进入关键部分。我怎样才能修好它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&
#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)而不是多处理(使用likefork()
)。所以我建议退房