c - semctl GETVAL 无法读取信号量值

c - semctl GETVAL can't read the semaphore value

我正在为我的大学做一个项目,所以我不能使用 semaphore.h 库。

我想要做的是将信号量初始化为一个值 MAX_ACCESS(默认值 10),如果该信号量可用,则执行操作。

semId = semget(SEM_KEY, 1, IPC_CREAT | 0666);
if (semId == -1) errExit("semget 1");
if (initSem(semId, 0, MAX_ACCESS) == -1) errExit("initSem");

initSem() 定义如下:

int initSem(int semId, int semNum, int val) {
    union semun arg;

    arg.val = val;
    return semctl(semId, semNum, SETVAL, arg);
}

据我所知,它按预期工作。它将信号量值设置为 10。 只是 post 一切,semun 是:

union semun {
int val;
struct semid_ds* buf;
unsigned short* array;
#if defined(_linux_)
    struct seminfo* _buf;
#endif
};

导致我出现问题的是函数 semAvailable()

int semAvailable(int semId, int semNum) {
union semun arg;

if (semctl(semId, semNum, GETVAL, arg) == -1) errExit("semAvailable: semctl");
return (arg.val > 0); 
}

此函数应该获取信号量的值,如果可用(大于零),return。虽然当我使用 semAvailable() 作为条件时,就在 initSem() 之后,它总是 return 0.

if (semAvailable(semId, 0)) {
/*do things*/
}

所以我尝试在 semAvailable 中打印 arg.val 的值,它打印出零,然后我尝试在调用 semctl(semid, 0, GETVAL, arg) 后立即在 initSem 中打印它并打印出来正确的值,最后我尝试在 initSem() 之后立即在主程序中调用 semctl() 并打印 arg.val 的值,并打印初始化变量的值。

if (initSem(semId, 0, MAX_ACCESS) == -1) errExit("initSem");
arg.val = 0;
semctl(semId, 0, GETVAL, arg);
printf("Semctl val: %d\n", arg.val); /*This print 0*/

为什么在 semctl 之后信号量的值没有存储在 arg.val 中?我是否遗漏了一些明显的东西?

信号量的值是使用 GETVAL 命令的函数 semctl 的 return 值。

int semValue = semctl(semId, 0, GETVAL, arg);
printf("Semctl val: %d\n", semValue);

你不能期望一个没有通过地址(指针)传递参数的函数可以return一个值到一个通过值传递的变量中..

HERE 您可以找到 semctl 函数所有命令的完整示例。