创建共享内存

来源:互联网 发布:linux重启mysql 编辑:程序博客网 时间:2024/06/10 00:25

在接受到客户端请求后需要先创建一个共享内存用于提高程序的运行效率,在接收到业务主机发来的状态信息时将其写入共享内存。

共享内存的创建

共享内存是存在于内核级别的一种资源,在shell中可以使用ipcs命令来查看当前系统IPC中的状态,在文件系统/proc目录下有对其描述的相应文件。函数shmget可以创建或打开一块共享内存区。函数原型如下:

#include <sys/shm.h>
int shmget( key_t key, size_t size, int flag );

函数中参数key用来变换成一个标识符,而且每一个IPC对象与一个key相对应。当新建一个共享内存段时,size参数为要请求的内存长度(以字节为单位)。

注意:内核是以页为单位分配内存,当size参数的值不是系统内存页长的整数倍时,系统会分配给进程最小的可以满足size长的页数,但是最后一页的剩余部分内存是不可用的。

当打开一个内存段时,参数size的值为0。参数flag中的相应权限位初始化ipc_perm结构体中的mode域。同时参数flag是函数行为参数,它指定一些当函数遇到阻塞或其他情况时应做出的反应。shmid_ds结构初始化如表14-4所示。

表14-4 shmid_ds的初始化

shmid_ds结构数据

shmid_ds结构数据

shm_lpid

0

shm_dtime

0

shm_nattach

0

shm_ctime

系统当前值

shm_atime

0

shm_segsz

参数 size

下面实例演示了使用shmget函数创建一块共享内存。程序中在调用shmget函数时指定key参数值为IPC_PRIVATE,这个参数的意义是创建一个新的共享内存区,当创建成功后使用shell命令ipcs来显示目前系统下共享内存的状态。命令参数-m为只显示共享内存的状态。

(1)在vi编辑器中编辑该程序如下:

程序清单14-8 create_shm.c 使用shmget函数创建共享内存

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>

 

#define BUFSZ 4096

int main ( void )
{
int shm_id;    /*共享内存标识符*/

shm_id=shmget(IPC_PRIVATE, BUFSZ, 0666 ) ;
if (shm_id < 0 ) { /*创建共享内存*/
perror( "shmget" ) ;
exit ( 1 );
}

printf ( "successfully created segment : %d /n", shm_id ) ;
system( "ipcs -m");     /*调用ipcs命令查看IPC*/

exit( 0 );
}

(2)在shell中编译该程序如下:
$gcc create_shm.c-o create_shm
(3)在shell中运行该程序如下:
$./ create_shm
successfully created segment : 2752516
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 65536      root      600        393216     2          dest
0x00000000 2654209    root      666        4096       0
0x0056a4d5 2686978    root      600        488        1
0x0056a4d6 2719747    root      600        131072     1
0x00000000 2752516    root      666        4096       0
上述程序中使用shmget函数来创建一段共享内存,并在结束前调用了系统shell命令ipcs -m来查看当前系统IPC状态。

 

 

shmat

作用:共享内存区对象映射到调用进程的地址空间

  核心处理函数: void *shmat( int shmid , char *shmaddr , int shmflag );shmat()是用来允许本进程访问一块共享内存的函数。

  int shmid是那块共享内存的ID。

  char *shmaddr是共享内存的起始地址

  int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式

  成功时,这个函数返回共享内存的起始地址。失败时返回-1

  全国移动、联通、电信、Q币及各种游戏点卡在线充值,三分钟内到帐,
本商城网址:
http://shop62211463.taobao.com,诚招易赛代理,想做淘宝的朋友也可以咨询我。
小颖充值,永远为你守候。
旺旺:qy_build,MSN:
qy_build@126.com
QQ:459415231

原创粉丝点击