static char *g_shm = NULL;
void init_share_memory(void)
{
int g_shmid = 0;
key_t key;
// Segment key.
key = PD_SHM_KEY;//8001
// Create the segment.
if( ( g_shmid = shmget( key, PD_SHMSZ, IPC_CREAT | 0666 ) ) < 0 ) {//0x1000 01000
perror( "shmget" );
exit(1);
}
// Attach the segment to the data space.
if( ( g_shm = shmat( g_shmid, NULL, 0 ) ) == (char *)-1 ) {
perror( "shmat" );
exit(1);
}
// Initialization.
memset(g_shm, 0, PD_SHMSZ );
}
void exit_share_memory(void)
{
if (g_shm) {
shmdt(g_shm);
shmctl(g_shmid, IPC_RMID, NULL);//0
}
}
void init_share_memory(void)
定义了一个变量
g_shmid
用于保存共享内存的标识符,以及一个key
用于标诐共享内存段。使用
shmget
函数创建共享内存段。shmget
函数的第一个参数是共享内存的键值,第二个参数是共享内存的大小,第三个参数是权限标志(IPC_CREAT | 0666
表示创建共享内存段并设置读写权限)。如果出现错误,则会输出错误信息并退出程序。使用
shmat
函数将共享内存段连接到当前进程的地址空间。shmat
函数的第一个参数是共享内存的标识符,第二个参数是指定共享内存连接到当前进程中的地址,通常设置为NULL
,第三个参数是标志位,通常设置为 0。如果出现错误,则会输出错误信息并退出程序。使用
memset
函数对共享内存进行初始化,将共享内存的内容全部设置为0。
void exit_share_memory(void)
判断全局变量
g_shm
是否已经被分配了内存,如果没有,则直接退出函数。使用
shmdt
函数将共享内存从当前进程中分离。shmdt
函数的参数是共享内存连接到当前进程的地址。如果出现错误,则会输出错误信息。使用
shmctl
函数删除共享内存段。shmctl
函数的第一个参数是共享内存标识符,第二个参数是要执行的操作(这里是IPC_RMID
,表示删除共享内存段),第三个参数是一个结构体指针,通常设置为NULL
。如果出现错误,则会输出错误信息。