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

时间:2016-02-01 16:14:37

标签: c linux semaphore

我正在为我的大学开展一个项目,所以我无法使用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。 只是发布一切,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); 
}

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

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

所以我尝试在semAvailable中打印arg.val的值并打印为零,然后我尝试在initSem中打印它,在调用semctl(semid,0,GETVAL,arg)后立即打印出正确的值,最后我尝试在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中?我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:2)

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

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

您不能指望没有通过地址(指针)传递的参数的函数可以将值返回到由值传递的变量中。

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