Linux下IPC:信号量与共享内存详解

    蛋疼了很久,漏了一个括号,结果在shmat返回错误Identifier removed...废话不多说,最后解释。。
    信号量,很多人把他和mutex进行类比,是的,可以简单认为mutex是信号量只在0-1变化的。不过二者还是有些差别的(现在我还没深入到。。),信号量表示资源数,如果信号量大于0,则表示他还有val个资源可以被获取,当val<=0时候表示没有信号量了,这里出现小于0是表示有多少进程在等待。
    共享内存使得多个进程能够通过共享的内存区域进行通信。这个最大的好处就是在server/client上实现二者通信。
    但是共享内存的过程有个同步问题随之而来,server什么时候去取得共享区域数据,什么时候不能取呢,我首先想到的就是用信号呗,确实,不过这里有个条件,client要知道server的pid,server也要知道client的pid,这个当然也是可以的。
    还有一种方法就是采用信号量的方式(可以暂时理解成用锁的形式)来阻塞某一端,直至数据准备就绪再去取得数据。
我这里用个网络上很流行的案例,server-client
---------------------------------------
设计目的:实现client向server传递数据,只有在client发送完毕后,server才取得数据,否则阻塞等待。
设计思路:1、首先运行服务器,创建一个共享内存区域,存放数据;
              2、同时创建一个semid,注意,信号量一般是多个(不像mutex就是一个0-1状态,这里semid表示信号量的id)
int semid=semget(ket_t key,int nsems,int flag)   key就是IPC的键了,nsems表示这个semid里有多少个信号量,flag表示权限,一般IPC_CREAT|IPC_EXCL|0666(注意下,IPC_EXCL这个表示如果key已经被绑定过则报错,这个在服务器里可以使用,但是客户机上就不要用IPC_EXCL当然IPC_CREAT也不用了),创建好semid。
              3、这里细致说下sembuf和union semun
                  struct sembuf{
                        unsigned short sem_num;//表示semid的第几个信号量0开始计数
                        short sem_op;//表示semop()函数后的操作,正:则向val加上sem_op;负:则val+(sem_op);当然也可以为0
                          short sem_flg;//IPC_NOWAIT   SEM_UNDO
                  }

                  union semun{
                          int val;//这个表示信号量的资源数 很关键的数,就是上面说的val
                  }

         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值