• 进程间通信:共享内存


    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <sys/mman.h>
    #include <string.h>
    #include <errno.h>
    #include <unistd.h>
    
    /*
    int shm_open(const char *name, int oflag, mode_t mode);
    //创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
    name : 共享内存区的名字;
    oflag: 标志位;open的标志一样
    mode : 权限位
    
    编译时要加库文件-lrt
    */
    
    #ifndef T_DESC
    #define T_DESC(x, y)   (y)
    #endif
    
    #if T_DESC("TU1", 1)
    
    
    #define SHM_NAME        "shm_ram"
    #define FILE_SIZE       4096
    #define WRITE_STR       "to be or not to be"
    
    int tu1_proc(int argc, char **argv)
    {
        int param = 0;
        int ret = -1;
        int fd = -1;
        char buf[4096] = {0};
        void* map_addr = NULL;
    
        if (argc < 2) {
            printf("param error
    ");
            goto _OUT;
        }
        param = atoi(argv[1]);
    
        //创建或者打开一个共享内存
        fd = shm_open(SHM_NAME, O_RDWR|O_CREAT, 0644);
        if(-1 == (ret = fd))
        {
            perror("shm  failed: ");
            goto _OUT;
        }
        
        //调整确定文件共享内存的空间
        ret = ftruncate(fd, FILE_SIZE);
        if(-1 == ret)
        {
            perror("ftruncate faile: ");
            goto _OUT;
        }
        
        //映射目标文件的存储区
        map_addr = mmap(NULL, FILE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
        if(NULL == map_addr)
        {
            perror("mmap add_r failed: ");
            goto _OUT;
        }
    
        if (param > 0) { // read
            memcpy(buf, map_addr, sizeof(buf));
            printf("read: %s
    ", buf);
        } else {  // write
            memcpy(map_addr, WRITE_STR, strlen(WRITE_STR));
            printf("write: %s
    ", WRITE_STR);
        }
    
        //取消映射
        ret = munmap(map_addr, FILE_SIZE);
        if(-1 == ret)
        {
            perror("munmap add_r faile: ");
            goto _OUT;
        }
            
        if (param > 0){ 
            //删除内存共享
            shm_unlink(SHM_NAME);
            if(-1 == ret)
            {
                perror("shm_unlink faile: ");
                goto _OUT;
            }
        }
        
    _OUT:    
        return ret;
    }
    
    #endif
    
    #if T_DESC("global", 1)
    void usage()
    {
        printf("
     Usage: <cmd> <tu> <p1> <...>");
        printf("
       1 -- shm test");
        printf("
         => P1: 0 - write; 1 - read");
        printf("
    ");
    }
    
    int main(int argc, char **argv)
    {
        int ret;
        
        if(argc < 2) {
            usage();
            return 0;
        }
    
        int tu = atoi(argv[1]);
        if (tu == 1) ret = tu1_proc(argc - 1, &argv[1]);
        
        return ret;
    }
    #endif
    
    #if T_DESC("readme", 1)
    /*
    1, how to compile 
    gcc -o shm.out shm.c -lrt
    
    */
    #endif
  • 相关阅读:
    (转载)Centos7 install Openstack Juno (RDO)
    (转载)vmware esxi 6.0 开启嵌套虚拟化
    Delphi XE5 android toast
    delphi中Message消息的使用方法
    delphi中Time消息的使用方法
    Delphi中Interface接口的使用方法
    SystemParametersinfo 用法
    Delphi XE5 android openurl(转)
    Delphi XE5开发Android程序使用自定义字体文件.
    获取 TUniConnection.SpecificOptions默认值和下拉框列表值
  • 原文地址:https://www.cnblogs.com/soul-stone/p/6680338.html
Copyright © 2020-2023  润新知