进程间通信:共享内存

简介: #include #include #include #include #include #include #include #include #include /*int shm_open(const char *name, int oflag, mode_t mode);//创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。

 

#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\n");
        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\n", buf);
    } else {  // write
        memcpy(map_addr, WRITE_STR, strlen(WRITE_STR));
        printf("write: %s\n", 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("\n Usage: <cmd> <tu> <p1> <...>");
    printf("\n   1 -- shm test");
    printf("\n     => P1: 0 - write; 1 - read");
    printf("\n");
}

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

 

目录
相关文章
|
3月前
|
Linux
|
1月前
|
消息中间件 Linux
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
24 2
|
1月前
|
Linux 数据安全/隐私保护
进程间通信之共享内存及其shm函数的使用【Linux】
进程间通信之共享内存及其shm函数的使用【Linux】
|
2月前
|
Linux
百度搜索:蓝易云【深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式】
通过以上方法,你可以深入了解Linux进程的内存使用情况,包括VSS、RSS、PSS、USS等指标,帮助你进行性能优化和资源管理。
41 12
|
2月前
|
网络协议 Linux
【系统DFX】如何诊断占用过多 CPU、内存、IO 等的神秘进程?
【系统DFX】如何诊断占用过多 CPU、内存、IO 等的神秘进程?
108 0
|
3月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
49 0
|
3月前
|
Linux
进程通信——共享内存
进程通信——共享内存
43 0
|
4月前
|
存储 消息中间件 算法
Linux进程间通信【共享内存】
Linux进程间通信【共享内存】
61 0
|
4月前
|
存储
进程间通讯-共享内存
进程间通讯-共享内存
22 0
|
4月前
|
消息中间件 存储 开发者
解析进程复制:父子进程内存地址的神秘之处
解析进程复制:父子进程内存地址的神秘之处
33 0

相关实验场景

更多