繁体   English   中英

在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;
}

但是当我运行以下两个进程时,该函数出错了:

最初sem.val设置为0;

process1:... printf(“%d”,sem_get(sem_id)); sem_wait(semid); ...

process2:... printf(“%d”,sem_get(sem_id)); sem_wait(semid); ...

假设进程1首先运行并执行sem_wait(semid),我猜进程2应该输出-1,但实际上输出0。 这怎么可能呢? 我的功能错了吗? 还是sem.h中的信号量实现与我在课堂上学到的不同?

已经有功能sem_getvalue()

这是一个例子

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

强烈建议执行google搜索“如何使用信号量在C”的位

这样的网页之一是:

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

这里是从sem_getvalue手册页的摘录

sem_getvalue()将该信号量的当前值指出SEM到由SVAL指向的整数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM