进程间通讯《二》

Sysv 共享内存。

sysv 共享内存和posix 共享内存类似。主要用到的API有 shmget, shmat, shmctl, shmdt,下面将这些API一一道来。

int   shmget(key_t key, size_t size,  int  oflag);
  返回: 成功返回共享内存的描述字,出错时 
- 1

在多进程环境中, 经常会碰到该调用返回失败的情况, 比如说返回一个EEXIST错误,是最常见的情况,这时我们可以按如下方式处理:
shmid  =  shmget(key,  sizeof ( struct  XXX), IPC_CREAT  |  IPC_EXCL  |   0666 );
if  (shmid  <   0 {
        
if (errno != EEXIST)  return -1;
        shmid 
= shmget(key, 00);
        
if (errno < 0)  return -1;
}

由shmget创建和打开一个共享内存区以后,我们要将其附到调用进程的地址空间之上。
void   * shmat( int  shmid,   const   void   * addr,  int  flag);
  返回: 成功返回映射区的起始地址,否则返回NULL

一般情况下, 可以按如下方式处理:
XXX =  shmat(shmid, NULL,  0 );
if  (XXX ==  NULL)   return   - 1 ;

当然,也可以自己指定附到的某一个地址上, 给addr指定一个具体的值就行了。

类似与ioctl, fcntl, sysv也有用来设置共享内存的一个接口,shmctl
int  shmctl( int  semid,  int  cmd,  struct  shmid_ds  * buf);
  返回: 成功返回0, 否则返回
- 1

该调用提供了三个命令:
IPC_STAT,  IPC_SET, IPC_RMID

最后,删除该共享内存的调用shmdt
int  shmdt( const   void   * addr)
  返回:成功返回0, 否则,为
- 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值