• 代码示例_IPC_共享内存


    共享内存

     


    1.头文件

    #ifndef __SHM_H__
    #define __SHM_H__
    
    
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <strings.h>
    #include <unistd.h>
    
    
    key_t Get_Key(void);
    int Shm_Creat(key_t key, size_t size);
    void *Shm_At(int shmid);
    int Shm_Dt(const void *shmaddr);
    int Shm_Del(int shmid);
    
    
    
    #endif

    2.msg.c

    #include"shm.h"
    
    
    //获取key
    key_t Get_Key(void)
    {
        key_t key =ftok("/",0x66);
        if(key <0){
            perror("Get_Key ftok failed");
            exit(1);
        }
        return key;
    }
    
    //创建获取
    int Shm_Creat(key_t key, size_t size)
    {
        int shmid =shmget(key, size, 0666|IPC_CREAT);
        if(shmid < 0){
            perror("Shm_Creat shmget failed ");
            exit(1);
        }
        return shmid;
    }
    
    //挂载
    void *Shm_At(int shmid)
    {
        char *shmat_rel =shmat(shmid,NULL,0);
        if(shmat_rel < 0){
            perror("Shm_At shmat failed ");
            exit(1);
        }
        return shmat_rel;
    }
    
    //卸载
    int Shm_Dt(const void *shmaddr)
    {
        int shmdt_rel =shmdt(shmaddr);
        if(shmdt_rel < 0){
            perror("Shm_Dt shmdt failed ");
            exit(1);
        }
        return shmdt_rel;
    }
    
    //删除
    int Shm_Del(int shmid)
    {
        int shmctl_rel =shmctl(shmid, IPC_RMID, NULL);
        if(shmctl_rel < 0){
            perror("Shm_Del shmctl failed ");
            exit(1);
        }
        return shmctl_rel;
    }

    3.client

    #include "shm.h"
    
    int main(void)
    {
        key_t key =Get_Key();
        int shmid =Shm_Creat(key,1024);
        char *shmat_add =Shm_At(shmid);
        while(1){       //to read
            fgets(shmat_add, 1024, stdin);
            if(strncmp(shmat_add, "quit", 4) ==0)
                break;
        }
        Shm_Dt(shmat_add);
        Shm_Del(shmid);
    
        return 0;
    }

    4.server

    #include "shm.h"
    
    int main(void)
    {
        key_t key =Get_Key();
        int shmid =Shm_Creat(key,1024);
        char *shmat_add =Shm_At(shmid);
        while(1){       //to write
            sleep(1);
            fputs(shmat_add, stdout);
            if(strncmp(shmat_add, "quit", 4) ==0)
                break;
        }
        Shm_Dt(shmat_add);
        Shm_Del(shmid);
    
        return 0; 
    }


    success !

    Stay hungry, stay foolish 待续。。。
  • 相关阅读:
    C++栈(stack)、队列(queue)、链表(list)的常用函数
    C++中cin>>a原理
    C++中vector和堆的常用使用方法&例题:数据流中的中位数
    使用centos8搭建僵尸毁灭工程(PZ)服务器
    【从C#走进Python】四、装饰器
    【从C#走进Python】三、变量声明
    【从C#走进Python】二、迭代器
    【从C#走进Python】一、上下文管理器
    【C#基础】拥抱Lambda(2):表达式树与LINQ
    【机器学习笔记】Python机器学习基本语法
  • 原文地址:https://www.cnblogs.com/panda-w/p/11049407.html
Copyright © 2020-2023  润新知