日期:2014-05-16  浏览次数:20675 次

进程间通信 信号量
很多软件会创建信号量,如果软件被人为或者异常终止了,那么信号量的资源没有释放,ipcs -a可以查询到,怎么清理这些垃圾,不要用shell人为做,这个我已经写了,
我想用程序每次启动的时候判断,因为都是在当前目录下 ftok("./", 'a')创建键值,我现在是如果'a'创建不成功就 'a'+1创建,可是如果垃圾太多,最后会创建不成功,有什么好的方法在程序启动的时候把这里垃圾删除掉,而且不会删除正常的信号量

------解决方案--------------------
加上SEM_UNDO选项就行了;在程序异常终止的情况下,内核会自动帮你进行处理
------解决方案--------------------
进程死了的话,此进程占用的信号量就会自动释放。
探讨
引用:
加上SEM_UNDO选项就行了;在程序异常终止的情况下,内核会自动帮你进行处理
这个释放资源应该是恢复到此进程占用的前一状态,不是消除信号量,只是为了避免死锁的

------解决方案--------------------
加了sem_opem的时候把SEM_UNDO置上,进程死了的话,此进程占用的信号量就会自动释放。
探讨
引用:
进程死了的话,此进程占用的信号量就会自动释放。

引用:
引用:
加上SEM_UNDO选项就行了;在程序异常终止的情况下,内核会自动帮你进行处理
这个释放资源应该是恢复到此进程占用的前一状态,不是消除信号量,只是为了避免死锁的
这个回答显然是错的。。。。。。

------解决方案--------------------
晕,又看了一下题,你的要求是要把信号量删除吗?

这样应该是你应该自己去反思一下自己的设计,信号量属于系统资源,并不是属于某一个进程,所以Linux提供应该是没有让哪个进程退出的时候自动把信号量删除的机制。

我想正确的做法应该是程序启动的时候试着去打开这个已知的信号量,如果此已知的信号量不存在,你再去创建这个信号量。这样就不会有问题了。
------解决方案--------------------
楼上说的很有道理呀
------解决方案--------------------
我好像看到都是这样的:创建时指定IPC—CREAT|IPC—EXCL,返回错误再判断是否存在(EEXIST),存在的话打开就行啦
------解决方案--------------------
学习下。