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);
                }
            }    
        }
    }
    /*********************程序运行结果*********************


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


     

  • 相关阅读:
    macbook 无声音解决方案
    webapck dev server代理请求 json截断问题
    百度卫星地图开启
    服务器 nginx配置 防止其他域名绑定自己的服务器
    记一次nginx php配置的心路历程
    遇到npm报错read ECONNRESET怎么办
    运行svn tortoiseSvn cleanup 命令失败的解决办法
    svn add 命令 递归目录下所有文件
    m4出现Please port gnulib freadahead.c to your platform! Look at the definition of fflush, fread, ungetc on your system, then report this to bug-gnulib."
    Ubuntu下安装GCC,mpc、mpfr、gmp
  • 原文地址:https://www.cnblogs.com/xiaobaigang/p/2108042.html
Copyright © 2011-2022 走看看