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


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


     

  • 相关阅读:
    嵌入式实验一:LED灯点亮
    [转] sql中的in与not in,exists与not exists的区别
    订单管理系统基本情况
    solaris系统分区及格式化
    百度超大网盘邀请码,点击可以获得额外的300M哦
    vb设置代理ip
    我看到一种防伪查询系统,叫做西门防伪防伪查询系统,不知道好不好用。
    零碎知识点整理
    初学WCF之消息模式3——双工模式
    HTTP 错误 500.21 Internal Server Error
  • 原文地址:https://www.cnblogs.com/xiaobaigang/p/2108042.html
Copyright © 2011-2022 走看看