|
使用共享内存在测试程序编写中经常遇到。
共享内存作为一种IPC,用于进程间通信,甚至可以实现用户程序与内核间的数据交换。现在我们就简单介绍一下共享内存的几个系统调用。
创建
第一步要做的是创建一个共享内存结构。
#include <sys/shm.h>
#include <sys/ipc.h>
int shmget (key_t key, int size, int shmflg);
key是一个整数值,用来指定一个关键字,它可以用于搜寻一个共享内存结构。
size表示要创建的共享内存的大小,以字节计算。
shmflg为创建指派属性。
IPC_CREAT表示创建一个新的共享内存结构,若key已经代表了一个结构并且该结构未被删除,则直接返回这个结构的标识。
IPC_EXCL需要与IPC_CREAT一起使用,指定IPC_EXCL后,若key已经关联了一个共享内存结构,则shmget出错,返回-1。所以IPC_EXCL可以保证shmget创建一个新的结构。若shmflg为0,则shmget寻找key关联的共享内存结构,若找到,返回改结构的标识符,否则返回-1。
若调用成功,则返回得到的共享内存结构标识符,否则返回-1。
连接
创建了一个共享内存结构之后,需要将这个结构和一段存储区域、一个指针连接起来,才能通过该指针正确访问共享的内存区域。
#include <sys/types.h>
#include <sys/shm.h>
void *shmat (int shmid, const void *shmaddr, int shmflg);
shmid是shmget调用得到的共享内存结构标识符。
shmaddr指定连接的目的地址。若shmaddr为0,则由内核选择目的内存段,并返回该段的指针。若shmaddr不为0,且shmflg未指定SHM_RND选项,则shmaddr必须为页对齐的地址,该地址表示的内存段将被连接;若shmaddr不为0且shmflg指定了SHM_RND,则连接的地址为小于shmaddr且最接近shmaddr的SHMLBA的倍数。
shmflg指定连接的属性。除了上面说的SHM_RND外,还可以指定SHM_RDONLY属性。若指定了SHM_RDONLY,则以只读方式连接,否则连接的内存是可读可写的。
若调用成功则返回得到的存储区域指针,否则返回-1。
访问
连接成功后,根据的到的指针,我们就可以根据需要来使用得到的存储空间了。
控制
我们可以根据需要来设置的到的共享内存结构的属性,甚至可以实现删除。
#include <sys/shm.h>
#include <sys/ipc.h>
int shmctl (int shmid, int cmd, struct shmid_ds *buf);
shmid是要操作的共享内存结构标识符。
cmd用来指定我们要进行的操作。
IPC_STAT用来获得共享内存段的状态信息,结果保存在buf中
IPC_SET用来设置共享内存段的一些状态信息,在buf的成员shm_perms中预先指定我们想要改变的属性。
IPC_RMID给shmid指定的内存段加上删除标志,在该段最后一次断开连接后,内存将被释放。
SHM_LOCK锁定内存段以保证不会被访问。
SHM_UNLOCK解除锁定。
SHM_LOCK、SHM_UNLOCK只在Linux系统中有效,并且只有超级用户才可以使用。
buf保存shmid标识的共享内存结构的信息。
断开
一般用完共享内存段之后要断开连接。
#include <sys/types.h>
#include <sys/shm.h>
int shmdt (const void *shmaddr);
shmaddr是连接后得到的指针。
若调用成功,返回0,否则返回-1。
注意,断开操作只是切断进程与该共享内存的关联,并不会释放内存段。
介绍几个调用的功能,使用共享内存的操作顺序为:创建(查找)——连接——控制——访问——断开,在确信不用时进行销毁(实际上是控制的一个特例)。 |
|