Sysv 共享内存。
sysv 共享内存和posix 共享内存类似。主要用到的API有 shmget, shmat, shmctl, shmdt,下面将这些API一一道来。
在多进程环境中, 经常会碰到该调用返回失败的情况, 比如说返回一个EEXIST错误,是最常见的情况,这时我们可以按如下方式处理:
由shmget创建和打开一个共享内存区以后,我们要将其附到调用进程的地址空间之上。
一般情况下, 可以按如下方式处理:
当然,也可以自己指定附到的某一个地址上, 给addr指定一个具体的值就行了。
类似与ioctl, fcntl, sysv也有用来设置共享内存的一个接口,shmctl
该调用提供了三个命令:
IPC_STAT, IPC_SET, IPC_RMID
最后,删除该共享内存的调用shmdt
sysv 共享内存和posix 共享内存类似。主要用到的API有 shmget, shmat, shmctl, shmdt,下面将这些API一一道来。
int
shmget(key_t key, size_t size,
int
oflag);
返回: 成功返回共享内存的描述字,出错时 - 1
返回: 成功返回共享内存的描述字,出错时 - 1
在多进程环境中, 经常会碰到该调用返回失败的情况, 比如说返回一个EEXIST错误,是最常见的情况,这时我们可以按如下方式处理:
shmid
=
shmget(key,
sizeof
(
struct
XXX), IPC_CREAT
|
IPC_EXCL
|
0666
);
if (shmid < 0 ) {
if (errno != EEXIST) return -1;
shmid = shmget(key, 0, 0);
if (errno < 0) return -1;
}
if (shmid < 0 ) {
if (errno != EEXIST) return -1;
shmid = shmget(key, 0, 0);
if (errno < 0) return -1;
}
由shmget创建和打开一个共享内存区以后,我们要将其附到调用进程的地址空间之上。
void
*
shmat(
int
shmid,
const
void
*
addr,
int
flag);
返回: 成功返回映射区的起始地址,否则返回NULL
返回: 成功返回映射区的起始地址,否则返回NULL
一般情况下, 可以按如下方式处理:
XXX
=
shmat(shmid, NULL,
0
);
if (XXX == NULL) return - 1 ;
if (XXX == NULL) return - 1 ;
当然,也可以自己指定附到的某一个地址上, 给addr指定一个具体的值就行了。
类似与ioctl, fcntl, sysv也有用来设置共享内存的一个接口,shmctl
int
shmctl(
int
semid,
int
cmd,
struct
shmid_ds
*
buf);
返回: 成功返回0, 否则返回 - 1
返回: 成功返回0, 否则返回 - 1
该调用提供了三个命令:
IPC_STAT, IPC_SET, IPC_RMID
最后,删除该共享内存的调用shmdt
int
shmdt(
const
void
*
addr)
返回:成功返回0, 否则,为 - 1
返回:成功返回0, 否则,为 - 1