我有 2 个程序需要相互通信,第一个程序必须输出第二个程序放入共享内存的内容,但我已经删除了除信号量之外的所有内容,因为同步存在问题。 这是一项学校作业,所以我必须完全按照下面显示的方式使用信号量,不要提出任何其他建议,因为我不会使用它。
#include <sys/shm.h>
#include <errno.h>
#include <sys/sem.h>
int main()
{
int semid;
struct sembuf sobs;
semid=semget(9999,1,IPC_CREAT|0600);
semctl(semid, 0, SETVAL,1);
sobs.sem_num=0;
sobs.sem_op= 0;
sobs.sem_flg=0;
semop(semid,&sobs,1);
/* DO SOMETHING */
sobs.sem_op=1;
semop(semid,&sobs,1);
shmctl(shmid1,IPC_RMID,0);
return 0;
}
第二个程序:
#include <sys/shm.h>
#include <errno.h>
#include <sys/sem.h>
int main()
{
int semid;
struct sembuf sobs;
semid=semget(9999,1,0600);
sobs.sem_num=0;
sobs.sem_op=-1;
sobs.sem_flg=0;
semop(semid,&sobs,1);
/* DO SOMETHING */
sobs.sem_op=1;
semop(semid,&sobs,1);
shmctl(shmid1,IPC_RMID,0);
return 0;
}
所以问题是,如果我在第二个程序中将 sleep() 放在 DO SOMETHING 之上,第一个仍然会进入临界区,并且它会在第二个之前完成,但第一个必须'在第二个退出之前不进入临界区,我该怎么做才能防止第一个进入?
最佳答案
通常,程序 A 最初应使用 semctl
将信号量设置为 0。然后程序A以sobs.sem_op=-1
调用semop
,等待信号量。
程序 B 不需要在 “do something”
之前对信号量做任何事情。 (请注意,A 必须先运行,以便在 B 启动之前创建和设置信号量。)B 完成后,它应该通过使用 sobs.sem_op=1 调用
。semop
向 A 发出信号
简而言之,A 在“做某事”
之前设置信号量并等待它。 B “做某事”
然后向信号量发送信号以唤醒 A。
关于C 信号量同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23886051/