共享内存 未完结
写入共享内存数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
key_t key=ftok(".",'b');//ftok函数返回钥匙,.为当前目录,'b'为字符
if(key < 0)
{
printf("key");
exit(-1);
}
printf("key=%d\n",key);
int ret=shmget(key,512,0664|IPC_CREAT);//shmget函数返回共享内存段标识符,key为钥匙 填IPC_PRIVATE创建的共享内存只能用于具有亲缘关系的进程间通信,512为共享内存区大小,0664为8进制权限|IPC_CTEAT为创建一个新的段。如果这个标志未被使用,那么shmget()将找到与key相关的段,并检查用户是否有访问该段的权限。
if(ret<0)
{
printf("ret");
exit(-1);
}
printf("ret=%d\n",ret);
void *addr=shmat(ret,NULL,0);//shmat函数返回共享内存区映射后的地址,ret为shmget函数返回的内存段标识符,NULL为系统自动完成映射地址 也可以自己给定安全合法的地址,0为共享内存可读可写 填SHM_RDONLY为只能读不能写
if(addr==(void*)-1)
{
printf("shmat");
exit(-1);
}
while(1)
{
fgets((char*)addr,512,stdin);//写入共享内存 访问共享内存映射地址即可
}
/* printf("shmat=%p\n",addr);
int shmd=shmdt(addr); //取消映射
if(shmd<0)
{
printf("shmdt");
exit(-1);
}
int shmct=shmctl(ret,IPC_RMID,NULL);//shmct函数是删除共享内存,IPC_RMID为删除对象/IPC_SET为设置对象属性/IPC_STAT为获取对象属性,NULL在使用IPC_RMID时使用
if(shmct<0)
{
printf("shmctl");
exit(-1);
}
*/
return 0;
}
读取共享内存数据
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main()
{
key_t key=ftok(".",'b');//ftok函数返回钥匙,.为当前目录,'b'为字符
if(key < 0)
{
printf("key");
exit(-1);
}
printf("key=%d\n",key);
int ret=shmget(key,512,0664|IPC_CREAT);//shmget函数返回共享内存段标识符,key为钥匙,512为共享内存区大小,0664为8进制权限|IPC_CTEAT为创建一个新的段。如果这个标志未被使用,那么shmget()将找到与key相关的段,并检查用户是否有访问该段的权限。
if(ret<0)
{
printf("ret");
exit(-1);
}
printf("ret=%d\n",ret);
void *addr=shmat(ret,NULL,0);//shmat函数返回共享内存区映射后的地址,ret为shmget函数返回的内存段标识符,NULL为系统自动完成映射地址 也可以自己给定安全合法的地址,0为共享内存可读可写 填SHM_RDONLY为只能读不能写
if(addr==(void*)-1)
{
printf("shmat");
exit(-1);
}
while(1)
{
printf("%s\n",(char*)addr);//直接访问共享内存地址即可完成打印
}
/* printf("shmat=%p\n",addr);
int shmd=shmdt(addr); //取消映射
if(shmd<0)
{
printf("shmdt");
exit(-1);
}
int shmct=shmctl(ret,IPC_RMID,NULL);//shmct函数是删除共享内存,IPC_RMID为删除对象/IPC_SET为设置对象属性/IPC_STAT为获取对象属性,NULL在使用IPC_RMID时使用
if(shmct<0)
{
printf("shmctl");
exit(-1);
}
*/
return 0;
}
共享内存
使用流程:
创建或者打开共享内存 -- shmget()
内存映射-- shmat()
访问共享内存
取消映射-- shmdt ()
删除共享内存-- shmctl()