最开始主要是好奇reddr=shmat的返回值,经过读写reddr已经变了,为什么还可以用shmdt(reddr)断开跟共享内存的链接。我的理解是此时reddr已经变了,因为共享空间里面已变成对后打印的东西了,理解过去就好了,就怕理解不过去。
更详细的请看——————————大神(85条消息) 共享内存函数(shmget、shmat、shmdt、shmctl)及其范例_guoping16的博客-优快云博客_shmdt
#include <head.h>
#define SHMSIZE 4096
int main(int argc, const char *argv[])
{
key_t key;
int shmid;
char*reddr=NULL;
if((key=ftok("/home/linux/",'i'))==-1)
PRINT_ERR("ftok error");
if((shmid=shmget(key,SHMSIZE,IPC_CREAT|0666))==-1)
//得到一个共享内存标识符或(标识的物理内存的地址)(跟mloccal)
//创建一个共享内存对象并返回共享内存标识符
PRINT_ERR("shmget error");
if((reddr=shmat(shmid,NULL,0))==(void*)-1)
PRINT_ERR("shmid error");
//链接共享内存标识符为shmid的共享内存,链接成功后把共享内存取对象
//映射到调用进程的地址空间,可以向本地空间一样访问
//reddr保存的地址是进程中的空间地址,是物理共享内存映射到虚拟共享内存中的
printf("raddr=%s",reddr);
while(1){
getchar();
if(strcmp(reddr,"quit")==0)
break;
printf("reddr=%s\n",reddr);
}
printf("raddr=%s",reddr);
if(shmdt(reddr)) //为什么再把共享内存从当前进程分离,此时reddr已经变了,因为共享空间里面已变成对后打印的东西了
//断开共享内存附加点的地址,禁止本进程访问共享内存(与shmat相反)
PRINT_ERR("shmdt error");
shmctl(shmid,IPC_RMID,NULL);
//对共享内存的控制,删除,改变状态等
return 0;
}
#include <head.h>
#define SHMSIZE 4096
int main(int argc, const char *argv[])
{
key_t key;
int shmid;
char*waddr=NULL;
if((key=ftok("/home/linux/",'i'))==-1)
PRINT_ERR("ftok error");
if((shmid=shmget(key,SHMSIZE,IPC_CREAT|0666))==-1)
PRINT_ERR("shmget error");
if((waddr=shmat(shmid,NULL,0))==(void*)-1)
//连接共享内存标识符为shmid的共享内存,连接成功后把共享
//内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问
PRINT_ERR("shmat error");
while(1){
fgets(waddr,SHMSIZE,stdin);
waddr[strlen(waddr)-1]='\0';
if(strcmp(waddr,"quit")==0)
break;
}
if(shmdt(waddr)==-1)
PRINT_ERR("shmdt error");
shmctl(shmid,IPC_RMID,NULL);
return 0;
}