申请共享内存并写入
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char const* argv[]) {
// int shmid = shmget(7500, 1024, IPC_CREAT | IPC_EXCL);
int shmid = shmget(7501, 1024, IPC_CREAT);
if (shmid < 0) {
return -1;
}
char* addr = (char*)shmat(shmid, NULL, 0); //将共享内存进行挂接
memset(addr, 0, 1024);
int i = 0;
while (i < 26) {
addr[i] = 'A' + i;
i++;
}
addr[i] = 0;
shmdt(addr); //取挂接
return 0;
}
读取共享内存内容
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char const* argv[]) {
int shmid = shmget(7501, 1024, IPC_CREAT);
if (shmid < 0) {
return -1;
}
char* addr = (char*)shmat(shmid, NULL, 0); //将共享内存进行挂接
// 读取
printf("client:%s\n", addr);
shmdt(addr); //取挂接
return 0;
}
此外,还有一个用来控制共享内存的shmctl()函数如下:
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl( int shmid , int cmd , struct shmid_ds *buf );
int shmid是共享内存的ID。
int cmd是控制命令,可取值如下:
IPC_STAT 得到共享内存的状态
IPC_SET 改变共享内存的状态
IPC_RMID 删除共享内存
struct shmid_ds *buf是一个结构体指针。IPC_STAT的时候,取得的状态放在这个结构体中。如果要改变共享内存的状态,用这个结构体指定。返回值: 成功:0,失败:-1
struct shmid_ds buf;
shmctl( shmid , IPC_STAT , &buf ); // 取得共享内存的状态
shmctl( shmid , IPC_RMID , &buf ); // 删除共享内存
在使用共享内存,结束程序退出后。如果你没在程序中用shmctl()
删除共享内存的话,一定要在命令行下用ipcrm
命令删除这块共享内存。你要是不管的话,它就一直在那儿放着了。
ipcs
和ipcrm
命令:
取得ipc信息:
ipcs [-m|-q|-s]
-m 输出有关共享内存(shared memory)的信息
-q 输出有关信息队列(message queue)的信息
-s 输出有关“遮断器”(semaphore)的信息
$ sudo ipcs -m
删除ipc
ipcrm -m|-q|-s shm_id
$ sudo ipcrm -m 105