进程间通信:共享内存

#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
原文地址:https://www.cnblogs.com/soul-stone/p/6680338.html