gpt4 book ai didi

c - 在C中使用sys/sem.h,如何获取信号量值?

转载 作者:行者123 更新时间:2023-11-30 18:15:21 54 4
gpt4 key购买 nike

我在C中使用sys/sem.h来实现信号量,但是现在我遇到了一个奇怪的问题,所以我想检查信号量值。我写了这样一个函数:

int sem_set(int semid, int sem_val)
{
union semun sem_union;
sem_union.val = sem_val;
if (semctl(semid, 0 , SETVAL , sem_union) == -1) return 0;
return 1;
}

int sem_get(int semid)
{
union semun sem_union;

return semctl(semid, 0 , GETVAL , sem_union);
}

int sem_wait(int semid)
{
struct sembuf sb;
sb.sem_num = 0;
sb.sem_op = -1;
sb.sem_flg = SEM_UNDO;
if (semop(semid, &sb, 1) == -1)
{
printf("error/n");
return 0;
}
return 1;
}

但是当我运行这样的两个进程时,函数就会出错:

最初 sem.val 设置为 0;

进程1:...printf("%d", sem_get(sem_id));sem_wait(半);...

进程2:...printf("%d", sem_get(sem_id));sem_wait(半);...

假设进程1首先运行并执行sem_wait(semid),我猜进程2应该输出-1,但实际上打印了0。怎么会发生这种事?我的功能错了吗?或者sem.h中的信号量实现与我在类里面学到的不同?

最佳答案

已经有函数 sem_getvalue()

这是一个例子

int sem_getvalue(sem_t *sem, int *valp);

强烈建议在谷歌上搜索一下“如何在 C 中使用信号量”

这样的网页是:

http://www.csc.villanova.edu/~mdamian/threads/posixsem.html#getvalue

这里是 sem_getvalue 手册页的摘录

sem_getvalue() 放置指向 sem 的信号量的当前值 到 sval 指向的整数。

关于c - 在C中使用sys/sem.h,如何获取信号量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347626/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com