zoukankan      html  css  js  c++  java
  • System V共享内存资料

     

     

     

     

     

     

     

                                            内存映射图 

     

    所用主要函数:shmget(),shmat(),shmctl(),shmdt()

    shmget:通过文件描述符(一般为绝对路径名)产生Key,创建新的共享内存区(最大4096KB)

    shmat:    将共享内存区映射到调用进程(A,B进程)的地址空间。

    shmctl:   设置(IPC_SET),获取(IPC_STAT),删除(IPC_RMID)共享内存区。

     shmdt():进程删除共享内存区映射的内存段

     

    *********************程序相关信息*********************/
    #include
    <sys/ipc.h>
    #include
    <sys/shm.h>
    #include
    <stdlib.h>
    #include
    <string.h>
    #include
    <stdio.h>
    int main()
    {
        
    int pid,shmid;//后者为共享内存识别代号
        char *write_address;
        
    char *read_address;
        
    struct shmid_ds dsbuf;
        
    if((shmid=shmget(IPC_PRIVATE,32,0))<0)//分配共享内存
        {
            printf(
    "shmid共享内存分配出现错误。\n");
            exit(
    1);
        }
        
    else
            printf(
    "shmid共享内存分配成功,共享内存识别代号为:%d。\n",shmid);
        
    if((pid=fork())<0)
        {
            printf(
    "fork函数调用出现错误!\n");
            exit(
    2);
        }
        
    else if(pid>0)//父进程,向共享内存中写入数据
        {
            printf(
    "父进程的ID是:%d\n",getpid());
            write_address
    =(char *)shmat(shmid,NULL,0);//连接共享内存
            if((int)write_address==-1)
            {
                printf(
    "shmat连接共享内存错误。\n");
                exit(
    3);
            }
            
    else
            {
                printf(
    "shmat连接共享内存成功。\n");
                strcpy(write_address,
    "我是写入共享内存的测试数据");//将数据写入共享内存
                printf("写入共享内存的信息为“%s”。\n",write_address);
                
    if((shmdt((void *)write_address))<0)//断开与共享内存的连接
                    printf("shmdt共享内存断开错误。\n");
                
    else
                    printf(
    "shmdt共享内存断开成功。\n");
                sleep(
    2);
                
    return;
            }
        }
        
    else//子进程,从共享内存中读取数据
        {
            sleep(
    2);//等待父进程写入共享内存完毕
            printf("子进程ID是:%d\n",getpid());
            
    if((shmctl(shmid,IPC_STAT,&dsbuf))<0)
            {
                printf(
    "shmctl获取共享内存数据结构出现错误。\n");
                exit(
    4);
            }
            
    else
            {
                printf(
    "shmctl获取共享内存数据结构成功。\n建立这个共享内存的进程ID是:%d\n",dsbuf.shm_cpid);
                printf(
    "该共享内存的大小为:%d\n",dsbuf.shm_segsz);
                
    if((read_address=(char *)shmat(shmid,0,0))<0)//连接共享内存
                {
                    printf(
    "shmat连接共享内存出现错误。\n");
                    exit(
    5);
                }
                
    else
                {
                    printf(
    "自共享内存中读取的信息为:“%s”。\n",read_address);
                    printf(
    "最后一个操作该共享内存的进程ID是:%d\n",dsbuf.shm_lpid);
                    
    if((shmdt((void *)read_address))<0)//断开与共享内存的连接
                    {
                        printf(
    "shmdt共享内存断开错误。\n");
                        exit(
    6);
                    }
                    
    else
                        printf(
    "shmdt共享内存断开成功。\n");
                    
    if(shmctl(shmid,IPC_RMID,NULL)<0)//删除共享内存及其数据结构
                    {
                        printf(
    "shmctl删除共享内存及其数据结构出现错误。\n");
                        exit(
    7);
                    }
                    
    else
                        printf(
    "shmctl删除共享内存及其数据结构成功。\n");
                    exit(
    0);
                }
            }    
        }
    }
    /*********************程序运行结果*********************


    其它参考学习:享内存的使用方法


     

  • 相关阅读:
    图-拓扑排序
    图-最短路径-Dijkstra及其变种
    【链表问题】打卡7:将单向链表按某值划分成左边小,中间相等,右边大的形式
    【链表问题】打卡5:环形单链表约瑟夫问题
    【链表问题】打卡6:三种方法带你优雅判断回文链表
    【链表问题】打卡4:如何优雅着反转单链表
    【链表问题】打卡3:删除单链表的中间节点
    【链表问题】打卡2:删除单链表的第 K个节点
    史上最全面试题汇总,没有之一,不接受反驳
    一些可以让你装逼的算法技巧总结
  • 原文地址:https://www.cnblogs.com/xiaobaigang/p/2108042.html
Copyright © 2011-2022 走看看