• 11月26日:操作系统实验杂记 shmget(创建共享存储区) shmat(连接共享存储区) shmdt(断连共享存储区) shmctl(共享存储区控制)


    函数语法介绍

    注意:以下的四个函数都需要使用到头文件

    1.创建共享存储区shmget

    函数伪原型:

    int shmget(key,size,flag)
    
    • 1

    ①shmget函数用于创建一个共享存储区,返回值是一个表示共享存储区ID的整数。
    ②key:共享内存标识符,用来表示项目的ID(一般可以自己指定一个整数)。如果指定的项目ID已经存在,那么这个创建过程就变为获取该项目的共享存储区ID。
    ③size:共享存储区的大小,以字节为单位。
    ④flag:共享存储区的权限,用Linux的文件权限表示(如0777)最常用的是0666|IPC_CREAT。

    2.连接共享存储区shmat

    函数伪原型

    void* shmat(mid,address,flag)
    
    • 1

    ①shmat函数用于进程连接共享存储区,返回一个指向共享存储区指定位置的指针。
    ②mid表示所访问的共享存储区的ID(shmget函数的返回值就是创建的共享存储区的ID)。
    ③address:一般指定为NULL。
    ④flag:一般指定为0。
    ⑤返回值:返回值是一个void指针,因此需要根据需要从共享存储区中取出的数据类型对该指针进行强制类型转换。

    3.断连共享存储区shmdt

    函数伪原型:

    int shmdt(address)
    
    • 1

    ①shmdt函数用于实现一个进程与指定共享存储区的断开连接。
    ②参数address是shmat函数的返回值。
    ③返回值:断连成功返回0,断连失败返回-1。

    4.控制共享存储区shmctl

    函数伪原型:

    int shmctl(mid,cmd,pointer)
    
    • 1

    ①shmctl用于控制共享存储区进行一些操作,最常用的是删除共享存储区;
    ②返回值:操作成功返回0,操作失败返回-1;
    ③mid即需要操作的存储区的共享存储区ID;
    ④cmd表示操作类型,一般是删除操作,参数为IPC_RMID;
    ⑤pointer一般为NULL。

    示例程序代码

    题目要求:生产者和消费者通过共享存储区进行数据通信。生产者随机产生10个整型数据,写入共享存储区;消费者读出数据,并计算各数据之和sum,并输出各个数据及sum。

    进程1代码

    #include
    #include
    #include
    #include
    
    int main(void)
    {
        int Pro2=fork();
        if(Pro2<0)
        {
            printf("子进程创建失败!\n");
        }	
        else if(Pro2==0)
        {
            execlp("./2.4.2",0); //即进程2
        }
        else
        {
            printf("进入数据生成进程!\n");
            int Shared_Memory=shmget(12345,1024,0666|IPC_CREAT);
            char* Shared_Pointer=shmat(Shared_Memory,NULL,0);
            int* Num_Pointer=(int*)Shared_Pointer;
            int i;
            srand(1);
            for(i=0;i<10;++i)
            {
                *Num_Pointer=rand()%100;
                Num_Pointer++;
                sleep(1);
            }
            shmdt(Shared_Pointer);
            printf("\n");
        }
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    进程2代码

    #include
    #include
    #include
    
    int main(void)
    {
        sleep(12);
    
        printf("进入求和进程!\n");
        int mid=shmget(12345,80,0666|IPC_CREAT);
        char* Shared_Pointer=shmat(mid,NULL,0);
        int* Num_Pointer=(int*)Shared_Pointer;
    
        int i;
        int sum=0;
        printf("共享存储区内的数据分别为:");
        for(i=0;i<10;++i)
        {
            printf("%d ",*Num_Pointer);
            sum+=(*Num_Pointer);
            Num_Pointer++;
        }
        printf("\n所有数据之和为:%d",sum);
                     
        shmdt(Shared_Pointer);
        shmctl(mid,IPC_RMID,0);
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
  • 相关阅读:
    鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统
    【详细】Java网络通信 TCP、UDP、InetAddress
    TiUP 命令概览
    美国服务器速度变慢了有没有解决办法?
    Flutter快学快用20 原生通信:应用原生平台交互扩充 Flutter 基础能力
    多团队协同开发的18条实践
    360数字安全:2024年3月勒索软件流行态势分析报告
    计算机毕业设计:基于HTML学校后台用户登录界面模板源码
    Win10系统使用pip安装juypter notebook过程记录(安装在系统盘以外的盘)
    【面试题精讲】SpringTemplate使用
  • 原文地址:https://blog.csdn.net/hanmo22357/article/details/128054169