POSIX 信号量学习与思考

来源:互联网 发布:mac os google chrome 编辑:程序博客网 时间:2024/06/06 10:50

信号量这个东西我也只是听说过,平常代码里面很少见,没用过。我问同事,你知道信号量吗?同事说:“一种通信机制,我也不太懂,就感觉面试时有用”。
最近需要处理进程间同步的问题,又把《UNIX高级编程》拿出来复习了下,发现信号量这个东西似乎还挺好用的。

我大概是要处理这么一种情况,首先A进程会通过socket发消息给B进程,然后B进程执行一系列动作来处理消息,等到B进程处理完了,A进程才能继续往下走。这里差了B进程处理完了通知A进程的处理逻辑。这个时候信号量就派上用场了。

POSIX信号量的接口函数
具体接口参数可以看书或者man,下面只谈有名信号量在写代码时遇到的问题点
sem_open
sem_wait
sem_post
sem_close
sem_unlink
  sem_open的名称参数里面除第一个字符可以是‘/’外,不能有其他’/’,否则报参数不合法的错误。
  
  进程退出时,会自动关闭进程打开的信号量,但该信号量的值不受影响,调用sem_close也不会影响信号量的值,即便打开该信号量的进程都退出了。调用sem_unlink则不一样了,该信号量名的引用计数为0时,会彻底销毁信号量,即信号量的值也没有了。
    
  sem_open如果指定O_CREAT | O_EXCL ,那么我感觉似乎不太好处理,因为只有sem_unlink才会真正销毁信号量(通过ipcs查看不到,也就无法用ipcrm删掉了)。比如这么一种情况,进程异常退出了,当这个进程被守护进程拉起来时就无法创建信号量了。如果我在创建前先unlink掉也不能保证创建成功,因为其他进程可能还在使用这个信号量,无法unlink掉,我该怎么用O_EXCL位吗?
  
  如果我不用O_EXCL就好使了吗?考虑这么一种情况:进程A发消息给进程B,然后调用sem_wait等待进程B处理完消息调用sem_post唤醒, 在等待的过程中进程A挂掉了,然后进程A被守护进程再次拉起来,在拉起来的过程中B进程处理完消息调用sem_post,信号量的值+1,那么以后A进程调用sem_wait时会立即唤醒,就达不到同步的效果了。信号量的值总是多一个!
  

0 0