【问题标题】:Using sys/sem.h in C, How to get the semaphore value?在 C 中使用 sys/sem.h,如何获取信号量值?
【发布时间】:2015-09-29 14:35:00
【问题描述】:

我在 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中的信号量实现和我在课堂上学的不一样?

【问题讨论】:

  • 你在进程1中睡觉吗?进程 2 执行时,进程 1 应处于临界区。
  • 请注意,信号量永远不会变成负数。如果您尝试减少 (sem_wait() ) 值为 0 的信号量,您只需阻塞,并且当有人增加 (sem_post() ) 值时将被唤醒。 sem_wait() 不能递减它,除非信号量值 > 0

标签: c operating-system semaphore


【解决方案1】:

已经有函数 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指向的整数中。

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多