共享内存()-其他
共享内存()
# write.c
/*
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
作用:创建一个新的共享内存段,或获取一个既有共享内存段的标识
新创建的段会初始化为0
参数:
key:是一个整形,通过这个找到或创建一个共享内存,
一般使用16进制,非0值
随便自定义即可
size:共享内存的大小
shmflg:
访问权限
附加属性:创建/判断共享内存是否存在
创建:IPC_CREAT
判断:IPC_EXCL,需要和IPC_CREAT一起使用
IPC_CREAT | IPC_EXCL | 0664
返回值:
成功:共享内存标识
失败:-1
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将共享内存与当前进程关联
参数:
shmid:标识
shmaddr:申请的共享内存起始地址,传入NULL即可,由内核指定
shmflg:权限
SHM_RDONLY,读权限,必须要有
0,读写
返回值:
成功:共享内存起始地址
失败:void * -1
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
功能:解除当前进程和共享内存的关联
参数:
shmaddr:共享内存首地址
返回值:
成功:0
失败:-1
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存,主要使用删除功能
参数:
shmid:标识
cmd:操作命令
IPC_STAT:获取共享内存当前状态
IPC_SET:设置共享内存的状态
IPC_RMID:标记共享内存被删除
buf:需要设置或获取的共享内存属性信息
IPC_STAT:获取的数据
IPC_SET:需要设置的数据
IPC_RMID:NULL
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:根据指定的路径和int值,生成一个共享内存的key
参数:
pathname:指定一个存在的路径
/home/wtsruvf/Linux/a.txt
proj_id:int类型的值,但系统调用只会只用其中一个字节
因此一般指定一个字符即可,如'a'
*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
// 创建共享内存
int shmid = shmget(100, 4096, IPC_CREAT | 0777);
// 共享内存与当前进程关联
void *shmaddr = shmat(shmid, NULL, 0);
// 写数据
char *str = "Hello World";
memcpy(shmaddr, str, strlen(str));
printf("please press any key to continue\n");
getchar();
// 解除关联
shmdt(shmaddr);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
# read.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
// 获取共享内存
int shmid = shmget(100, 4096, IPC_CREAT);
// 共享内存与当前进程关联
void *shmaddr = shmat(shmid, NULL, 0);
// 读数据
printf("%s\n", (char *)shmaddr);
printf("please press any key to continue\n");
getchar();
// 解除关联
shmdt(shmaddr);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
————————
# write.c
/*
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
作用:创建一个新的共享内存段,或获取一个既有共享内存段的标识
新创建的段会初始化为0
参数:
key:是一个整形,通过这个找到或创建一个共享内存,
一般使用16进制,非0值
随便自定义即可
size:共享内存的大小
shmflg:
访问权限
附加属性:创建/判断共享内存是否存在
创建:IPC_CREAT
判断:IPC_EXCL,需要和IPC_CREAT一起使用
IPC_CREAT | IPC_EXCL | 0664
返回值:
成功:共享内存标识
失败:-1
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:将共享内存与当前进程关联
参数:
shmid:标识
shmaddr:申请的共享内存起始地址,传入NULL即可,由内核指定
shmflg:权限
SHM_RDONLY,读权限,必须要有
0,读写
返回值:
成功:共享内存起始地址
失败:void * -1
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
功能:解除当前进程和共享内存的关联
参数:
shmaddr:共享内存首地址
返回值:
成功:0
失败:-1
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:操作共享内存,主要使用删除功能
参数:
shmid:标识
cmd:操作命令
IPC_STAT:获取共享内存当前状态
IPC_SET:设置共享内存的状态
IPC_RMID:标记共享内存被删除
buf:需要设置或获取的共享内存属性信息
IPC_STAT:获取的数据
IPC_SET:需要设置的数据
IPC_RMID:NULL
#include <sys/types.h>
#include <sys/ipc.h>
key_t ftok(const char *pathname, int proj_id);
功能:根据指定的路径和int值,生成一个共享内存的key
参数:
pathname:指定一个存在的路径
/home/wtsruvf/Linux/a.txt
proj_id:int类型的值,但系统调用只会只用其中一个字节
因此一般指定一个字符即可,如'a'
*/
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
// 创建共享内存
int shmid = shmget(100, 4096, IPC_CREAT | 0777);
// 共享内存与当前进程关联
void *shmaddr = shmat(shmid, NULL, 0);
// 写数据
char *str = "Hello World";
memcpy(shmaddr, str, strlen(str));
printf("please press any key to continue\n");
getchar();
// 解除关联
shmdt(shmaddr);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
# read.c
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
int main()
{
// 获取共享内存
int shmid = shmget(100, 4096, IPC_CREAT);
// 共享内存与当前进程关联
void *shmaddr = shmat(shmid, NULL, 0);
// 读数据
printf("%s\n", (char *)shmaddr);
printf("please press any key to continue\n");
getchar();
// 解除关联
shmdt(shmaddr);
// 删除共享内存
shmctl(shmid, IPC_RMID, NULL);
return 0;
}