我正在尝试在C语言中使用System V信号量进行实验,但我的课程没有帮助。
我可以创建我的信号量并将其删除(使用semget()和semctl()),但是我无法与其进行交互:它的值始终保持不变(0),并且在我执行信号量工作时不会起作用要求(使用semop())。
顺便说一下,我从下面已经提取的有关信号量的代码中提取了代码:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int main()
{
// some code
int sem;
struct sembuf up = {0,1,0};
struct sembuf down = {0,-1,0};
sem = semget(IPC_PRIVATE, 1, 777 | IPC_CREAT);
// Tried with 777 because why not. Originally at 600
// but it gave me a "Permission denied" error.
semop(sem, &up, 1); // up
// some critical code
semop(sem, &down, 1); // ... and down
semctl(sem, 0, IPC_RMID); // deletion
}
有人知道我的代码中缺少什么来使我的信号灯正常工作吗?
NB:不,我不能使用POSIX信号量。是的,我知道这很可悲。
semget()
函数返回的内容不是“信号量”,它是信号量集的ID(或者,在您的情况下,是单个信号量,因为您正在创建大小为1的集合)。该set id将保持为0,并且不会改变,无论sempahore本身发生了什么-在程序中都不会将其保存为变量。
与信号量的交互仅通过semop()
和semctl()
函数(可能还有semtimedop()
。例如,如果我们有:
union semun
{
int val;
struct semid_ds *buf;
ushort array [1];
} sem_attr;
int result;
定义,我们可以写:
sem_attr.val = 1;
result = semctl (semaphore_set_index, 0, SETVAL, sem_attr);
if (result == -1) { /* handle error here */ }
将信号量值设置为1。
注意:
我将这个答案部分地基于本文: