关于共享空间读和写函数详细解释

最开始主要是好奇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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值