在C中使用sys/sem.h,如何获取信号量值?
Using sys/sem.h in C, How to get the semaphore value?
我在 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;
}
但是我有这样两个进程时功能出错了运行ning:
最初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 中的信号量实现与我在 class?
中学到的不同
已经有函数sem_getvalue()
这里有一个例子
int sem_getvalue(sem_t *sem, int *valp);
强烈建议对 'how to use semaphores in C'
进行一些谷歌搜索
一个这样的网页是:
http://www.csc.villanova.edu/~mdamian/threads/posixsem.html#getvalue
这里是 sem_getvalue
手册页的摘录
sem_getvalue() 将信号量的当前值指向sem
进入 sval.
指向的整数
我在 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;
}
但是我有这样两个进程时功能出错了运行ning:
最初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 中的信号量实现与我在 class?
中学到的不同已经有函数sem_getvalue()
这里有一个例子
int sem_getvalue(sem_t *sem, int *valp);
强烈建议对 'how to use semaphores in C'
进行一些谷歌搜索一个这样的网页是:
http://www.csc.villanova.edu/~mdamian/threads/posixsem.html#getvalue
这里是 sem_getvalue
手册页的摘录sem_getvalue() 将信号量的当前值指向sem 进入 sval.
指向的整数