请教使用sem_unlink删除信号量的问题

yueyixing 2009-06-25 10:30:18
两个进程之间使用同一个命名信号量进行通讯(使用sem_open创建),文档上说sem_unlink会维护一个引用计数只有当此计数为零时才真正删除此信号量,但是现在我发现只要一调用sem_unlink函数信号量就会删除,不知道为什么?(开发环境:Redhat.Enterprise.Linux5.U3.i386)
...全文
804 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yueyixing 2009-06-30
  • 打赏
  • 举报
回复
楼上MM头像好可爱阿,呵呵!再过两天结帖
Joan201401 2009-06-29
  • 打赏
  • 举报
回复
guanzhu
threeleafzerg007 2009-06-26
  • 打赏
  • 举报
回复
用 ipcs 看看状态先
jiangfeng999 2009-06-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yueyixing 的回复:]
还有我写了两个测试程序,一个创建完以后就用pause()挂起,然后另一个也创建同名的信号量,创建成功后就调用sem_close和sem_unlink删除,发现只要第二个程序一调用sem_unlink,信号量就会删除。RedHat 4和5都是这样,不知道为什么。
[/Quote]
你是先调用 sem_close还是先调用sem_unlink呢?
最好把你写的两个测试程序发出来看看
yueyixing 2009-06-26
  • 打赏
  • 举报
回复
ipcs命令是看不到用posix系列函数创建的信号量的
pottichu 2009-06-25
  • 打赏
  • 举报
回复
sem_getvalue - get the value of a semaphore

SYNOPSIS
#include <semaphore.h>

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

DESCRIPTION
sem_getvalue() places the current value of the semaphore pointed to sem into the integer pointed to by sval.

If one or more processes or threads are blocked waiting to lock the semaphore with sem_wait(3), POSIX.1-2001 permits
two possibilities for the value returned in sval: either 0 is returned; or a negative number whose absolute value is
the count of the number of processes and threads currently blocked in sem_wait(3). Linux adopts the former behavior.

RETURN VALUE
sem_getvalue() returns 0 on success; on error, -1 is returned and errno is set to indicate the error.

ERRORS
EINVAL sem is not a valid semaphore.

CONFORMING TO
POSIX.1-2001.

NOTES
The value of the semaphore may already have changed by the time sem_getvalue() returns.
yueyixing 2009-06-25
  • 打赏
  • 举报
回复
还有我写了两个测试程序,一个创建完以后就用pause()挂起,然后另一个也创建同名的信号量,创建成功后就调用sem_close和sem_unlink删除,发现只要第二个程序一调用sem_unlink,信号量就会删除。RedHat 4和5都是这样,不知道为什么。
yueyixing 2009-06-25
  • 打赏
  • 举报
回复
因为我另一个程序还正在运行阿,另外我也想看看他的引用计数值,但是不知道怎么得到,有人告诉一下吗?
  • 打赏
  • 举报
回复
The sem_unlink() function removes the specified named semaphore. If other process are currently referencing the specified semaphore, sem_unlink() has no effect on the state of the semaphore. If one or more processes have the specified semaphore open when you call sem_unlink(), the semaphore is not removed until all references to the semaphore has been destroyed by sem_close(), _exit(), or exec() calls. Calls to sem_open() to re-create or re-connect to the specified semaphore refer to a new semaphore after sem_unlink() is called. The sem_unlink() call does not block until all references have been destroyed; it returns immediately.



你是怎么确定被删除的时候,引用计数不为0.
yueyixing 2009-06-25
  • 打赏
  • 举报
回复
就是在创建的时候判断是否已经存在指定名称的信号量,如果没有就创建,有就返回已创建的并把引用计数加一。
因为Linux是通过文件来实现的,所以创建成功后会在/dev/shm路径下生成对应名称的文件(针对Posix信号量),所以信号量删除的话文件也会删除,所以就会知道何时删除的。不知道我说清楚没有?
rzsheng 2009-06-25
  • 打赏
  • 举报
回复
我不懂
我想知道如何计数呢?
你怎么知道没有计数完成就删除了呢?
yueyixing 2009-06-25
  • 打赏
  • 举报
回复
没有人遇到过这种情况?
yueyixing 2009-06-25
  • 打赏
  • 举报
回复
sem_getvalue取得应该是信号量的值,而不是信号量的引用计数值吧。
第一部分 简介   第1章 简介 2   1.1 概述 2   1.2 进程、线程与信息共享 3   1.3 IPC对象的持续性 4   1.4 名字空间 5   1.5 fork、exec和exit对IPC对象的影响 7   1.6 出错处理:包裹函数 8   1.7 Unix标准 9   1.8 书中IPC例子索引表 11   1.9 小结 13   习题 13   第2章 Posix IPC 14   2.1 概述 14   2.2 IPC名字 14   2.3 创建与打开IPC通道 16   2.4 IPC权限 18   2.5 小结 19   习题 19   第3章 System V IPC 20   .3.1 概述 20   3.2 key_t键和ftok函数 20   3.3 ipc_perm结构 22   3.4 创建与打开IPC通道 22   3.5 IPC权限 24   3.6 标识符重用 25   3.7 ipcs和ipcrm程序 27   3.8 内核限制 27   3.9 小结 28   习题 29   第二部分 消息传递   第4章 管道和FIFO 32   4.1 概述 32   4.2 一个简单的客户-服务器例子 32   4.3 管道 32   4.4 全双工管道 37   4.5 popen和pclose函数 39   4.6 FIFO 40   4.7 管道和FIFO的额外属性 44   4.8 单个服务器,多个客户 46   4.9 对比迭代服务器与并发服务器 50   4.10 字节流与消息 51   4.11 管道和FIFO限制 55   4.12 小结 56   习题 57   第5章 Posix消息队列 58   5.1 概述 58   5.2 mq_open、mq_close和mq_unlink函数 59   5.3 mq_getattr和mq_setattr函数 61   5.4 mq_send和mq_receive函数 64   5.5 消息队列限制 67   5.6 mq_notify函数 68   5.7 Posix实时信号 78   5.8 使用内存映射I/O实现Posix消息队列 85   5.9 小结 101   习题 101   第6章 System V消息队列 103   6.1 概述 103   6.2 msgget函数 104   6.3 msgsnd函数 104   6.4 msgrcv函数 105   6.5 msgctl函数 106   6.6 简单的程序 107   6.7 客户-服务器例子 112   6.8 复用消息 113   6.9 消息队列上使用select和poll 121   6.10 消息队列限制 122   6.11 小结 124   习题 124   第三部分 同步   第7章 互斥锁和条件变量 126   7.1 概述 126   7.2 互斥锁:上锁与解锁 126   7.3 生产者-消费者问题 127   7.4 对比上锁与等待 131   7.5 条件变量:等待与信号发送 132   7.6 条件变量:定时等待和广播 136   7.7 互斥锁和条件变量的属性 136   7.8 小结 139   习题 139   第8章 读写锁 140   8.1 概述 140   8.2 获取与释放读写锁 140   8.3 读写锁属性 141   8.4 使用互斥锁和条件变量实现读写锁 142   8.5 线程取消 148   8.6 小结 153   习题 153   第9章 记录上锁 154   9.1 概述 154   9.2 对比记录上锁与文件上锁 157   9.3 Posix fcntl记录上锁 158   9.4 劝告性上锁 162   9.5 强制性上锁 164   9.6 读出者和写入者的优先级 166   9.7 启动一个守护进程的唯一副本 170   9.8 文件作锁用 171   9.9 NFS上锁 173   9.10 小结 173   习题 174   第10章 Posix信号量 175   10.1 概述 175   10.2 sem_open、sem_close和sem_   unlink函数 179   10.3 sem_wait和sem_trywait函数 180   10.4 sem_post和sem_getvalue函数 180   10.5 简单的程序 181   10.6 生产者-消费者问题 186   10.7 文件上锁 190   10.8 sem_init和sem_destroy函数 191   10.9 多个生产者,单个消费者 193   10.10 多个生产者,多个消费者 19

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧