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

共享内存的创建

共享内存是存在于内核级别的一种资源,在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