log模块学习

一、linux 共享内存shm_open实现进程间大数据交互

linux下,每个进程都有自己拥有的内存区域,进程的内存总是私有的。共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它。这个连接过程称为映射。

在这里插入图片描述
基本流程:编译时要加库文件-lrt

shm_id=shm_open(argv[1],O_RDWR|O_CREAT,0644);/*创建共享内存区*/
ftruncate(shm_id,100);/*修改共享区大小*/
fstat(shm_id,&buf);
ptr=mmap(NULL,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,shm_id,0);/*连接共享内存区*/
strcpy(ptr,"hello linux");/*写入共享内存区*/
printf("%s\n",ptr);/*读出共享内存区*/
shm_unlink(argv[1]);/*删除共享内存区*/

1. shm_open()函数

int shm_open(const char *name, int oflag, mode_t mode);
//创建或打开一个共享内存,成功返回一个整数的文件描述符,错误返回-1。
1.name:共享内存区的名字;
2.标志位;open的标志一样
3.权限位
shm_id=shm_open(argv[1],O_RDWR|O_CREAT,0644);/*创建共享内存区*/

2.ftruncate()函数

功能:    调整文件或共享内存区大小
头文件:    #include <unistd.h>
函数原形:    int ftruncate(int fd,off_t length);
参数:    
fd          描述符
length       大小
返回值:    成功返回0,出错返回-1

3. fstat()

当打开一个已存在的共享内存区对象时,我们可调用fstat来获取有关该对象的信息
功能:    获得文件或共享内存区的信息
头文件:    #include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
函数原形:    int stat(const char *file_name,struct stat *buf);
参数:    
file_name          文件名
buf               stat结构
返回值:    成功返回0,出错返回-1
对于普通文件stat结构可以获得12个以上的成员信息,然而当fd指代一个共享内存区对象时,只有四个成员含有信息。
struct stat{
    mode_t st_mode;
     uid_t st_uid;
     gid_t st_gid;
     off_t st_size;
};

4.mmap

void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);//地址映射
参数说明:
    addr:   建立映射区的首地址,由Linux内核指定。使用时,直接传递NULL
    length: 欲创建映射区的大小
    prot:   映射区权限PROT_READ、PROT_WRITE、PROT_READ|PROT_WRITE
    flags:  标志位参数(常用于设定更新物理区域、设置共享、创建匿名映射区)
            MAP_SHARED:  会将映射区所做的操作反映到物理设备(磁盘)上,无血缘关系的进程通信
            MAP_PRIVATE: 映射区所做的修改不会反映到物理设备。
            MAP_ANONYMOUS:匿名映射区
    fd:     用来建立映射区的文件描述符
    offset: 映射文件的偏移(4k的整数倍)

5、shm_unlink

shm_unlink(argv[1]);/*删除共享内存区*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值