Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >container of()函数用法简介

container of()函数用法简介

作者头像
无刺鱼
发布于 2022-03-29 05:18:08
发布于 2022-03-29 05:18:08
1.6K00
代码可运行
举报
文章被收录于专栏:许唯宇许唯宇
运行总次数:0
代码可运行

Linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member)。已知结构体type的成员member的地址ptr,求结结构体type的起始地址。

container_of

在已知一个结构体的成员的名字,以及其地址的情况向,反推该结构体的首地址

offsetof

获取一个结构体成员在结构里面的偏移,结构体首地址 = 成员地址- 成员偏移

以下是一个container of函数例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>  
#include <stdlib.h>
 
#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)   //为什么这样就能得到偏移
 
#define container_of(ptr, type , member) ({ \
	const typeof(((type *)0)->member) *__mptr = (ptr) ; \
	(type *)((char *)__mptr - offsetof(type,member)) ;})
 
#pragma pack(4)  
struct ptr  
{  
    char a ;   
    short b ;   
    int  c ;   
    double d ;  
};  
#pragma pack()  
int main(void)  
{  
    struct ptr Pt ;  
    struct ptr *pt ;
    printf("ptr:%d\n",sizeof(struct ptr));//16  
    //获取结构体的首地址 
    printf("ptr:%p\n",&Pt); //0028FEA8
    Pt.a = 'a';
    Pt.b = 2 ;
    Pt.c = 4 ;
    Pt.d = 12.04 ;
    //通过container of获取结构体的首地址 
    pt = container_of(&Pt.c, struct ptr , c);
    printf("pt:%p\n",pt);  //0028FEA8
    printf("a:%c\n",pt->a) ;  //'a'
    printf("b:%d\n",pt->b) ;  //2
    printf("c:%d\n",pt->c) ;  //4
    printf("d:%.2lf\n",pt->d);//12.04
    return 0 ;  
}  

linux 内核宏container_of(ptr, type, member)

通过计算member的地址,获取 ptr 所在的结构体type的首地址。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define container_of(ptr, type, member) ({  \         
const typeof(((type *)0)->member) *__mptr = (ptr);\         
(type *)((char *)__mptr - offsetof(type,member));})

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

typeof 获取成员类型

const typeof( ((type *)0)->member ) *__mptr = (ptr); 将ptr 赋值给 __mptr,如果ptr的类型和member指针的类型不一致,这个赋值会有警告,这个是代码严谨性的体现。

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 成员member 在结构体TYPE中的相对地址

ptr - offset 获取ptr所在的结构体的地址。

嵌入式Linux与物联网软件开发:C语言内核深度解析

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/01/29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大数据存储技术(2)—— HDFS分布式文件系统
1、产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS就是分布式文件管理系统中的一种。
Francek Chen
2025/01/22
1310
大数据存储技术(2)—— HDFS分布式文件系统
Hadoop的namenode的管理机制,工作机制和datanode的工作原理
根据文章内容总结,该文介绍了HDFS分布式文件系统的架构、工作机制、副本策略以及Hdfs在企业的应用案例。
别先生
2018/01/02
1.9K0
Hadoop的namenode的管理机制,工作机制和datanode的工作原理
深入浅出学大数据(三)分布式文件系统HDFS及HDFS的编程实践
此系列主要为我的学弟学妹们所创作,在某些方面可能偏基础。如果读者感觉较为简单,还望见谅!如果文中出现错误,欢迎指正~
不温卜火
2021/09/29
1.1K0
进击大数据系列(四):Hadoop 架构基石分布式文件系统 HDFS
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。
民工哥
2023/08/22
5080
进击大数据系列(四):Hadoop 架构基石分布式文件系统 HDFS
Hadoop框架:HDFS简介与Shell管理命令
大数据领域一直面对的两大核心模块:数据存储,数据计算,HDFS作为最重要的大数据存储技术,具有高度的容错能力,稳定而且可靠。HDFS(Hadoop-Distributed-File-System),它是一个分布式文件系统,用于存储文件,通过目录树来定位文件;设计初衷是管理数成百上千的服务器与磁盘,让应用程序像使用普通文件系统一样存储大规模的文件数据,适合一次写入,多次读出的场景,且不支持文件的修改,适合做数据分析。
知了一笑
2020/10/10
6560
Hadoop框架:HDFS简介与Shell管理命令
Hadoop学习指南:探索大数据时代的重要组成——HDFS(上)
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
老虎也淘气
2024/01/30
1890
Hadoop学习指南:探索大数据时代的重要组成——HDFS(上)
HDFS最基础使用
随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
ha_lydms
2023/10/04
2800
HDFS最基础使用
初识HDFS原理及框架
      HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,首先它是一个文件系统,用于存储文件,通过目录树来定位文件位置;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
星哥玩云
2022/07/19
4080
初识HDFS原理及框架
HDFS基本特性常见命令工作机制
HDFS是一个分布式文件系统,采用分而治之的设计思想,将大文件、大批量文件,分布式存放在大量服务器上,为各类分布式运算框架(MapReduce,spark,tez等)提供数据存储服务。首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
spilledyear
2018/10/09
6070
HDFS基本特性常见命令工作机制
Hadoop2.7.6_04_HDFS的Shell操作与常见问题
1、集群启动后,可以查看文件,但是上传文件时报错,打开web页面可看到namenode正处于safemode状态,怎么处理?
踏歌行
2020/10/15
4590
Hadoop2.7.6_04_HDFS的Shell操作与常见问题
大数据|HDFS的shell操作及基本工作机制(四)
一、HDFS分布式文件系统的shell操作 HDFS的shell操作基本和Linux的shell命令差不多,我这边重点介绍几个常用的文件操作的命令,其它更多的操作命令很少用到,当然你也可以通过“fs -help”查看所有命令。 重点在第二部分,介绍HDFS的基本工作机制。 1)–ls显示当前目录结构 -ls:该命令选项表示查看指定路径的当前目录结构,参数:-R递归显示目录结构,后面跟hdfs路径。 hadoop fs -ls / hadoop fs -ls hdfs://Hadoop1:9000/ha
黄小怪
2018/05/21
8360
day07.HDFS学习【大数据教程】
分而治之:将大文件、大批量文件,分布式存放在大量服务器上,以便于采取分而治之的方式对海量数据进行运算分析;
Java帮帮
2018/07/26
1.3K0
day07.HDFS学习【大数据教程】
大数据:hadoop常用操作命令
Hadoop常用操作 命令 说明 1.执行:hadoop fs -mkdir /park 在hdfs 的根目录下,创建 park目录 2.执行:hadoop fs -ls / 查看hdfs根目录下有哪些目录 3.执行:hadoop fs -put /root/1.txt /park 将linux操作系统root目录下的1.txt放在hdfs的park目录下 4.执行:hadoop fs -get /park/jdk /home 把hdfs文件系统下park目录的文件下载到linux的home目录下 5.执行
许喜朝
2020/10/14
1.4K0
《快学BigData》--Hadoop总结(D)(37)
Hadoop总结 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 210
小徐
2019/08/05
5530
《快学BigData》--Hadoop总结(D)(37)
大数据技术之_04_Hadoop学习_01_HDFS_HDFS概述+HDFS的Shell操作(开发重点)+HDFS客户端操作(开发重点)+HDFS的数据流(面试重点)+NameNode和Seconda
传统硬盘HDD(Hard Disk Drive)传输速率:100MB/s 固态硬盘SSD(Solid State Drive)传输速率:500MB/s 混合硬盘HHD(Hybrid Harddrive)传输速率:300MB/s PCIe固态硬盘SSD(Solid State Drive)传输速率:1500MB/s
黑泽君
2019/03/04
1.4K0
BigData--Hadoop技术
(7)-chgrp 、-chmod、-chown:Linux文件系统中的用法一样,修改文件所属权限
MiChong
2020/09/24
3730
BigData--Hadoop技术
hadoop-3.2.0------>入门十八hadoop之HDFS的shell命令操作
13、等同于copyToLocal,从HDFS下载文件到本地
用户5899361
2020/12/07
6220
Hadoop HDFS 实现原理图文详解
Hadoop分布式文件系统 (HDFS) 是运行在通用硬件(commodity hardware)上的分布式文件系统(Distributed File System)。
一个会写诗的程序员
2021/12/16
1.3K0
Hadoop HDFS 实现原理图文详解
【大数据技术基础 | 实验三】HDFS实验:部署HDFS
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。该系统架构于网络之上,势必会引入网络编程的复杂性,因此分布式文件系统比普通磁盘文件系统更为复杂。
Francek Chen
2025/01/22
1050
【大数据技术基础 | 实验三】HDFS实验:部署HDFS
《hadoop权威指南》笔记一:走进hdfs
Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统。
皮皮熊
2019/07/30
1K0
推荐阅读
相关推荐
大数据存储技术(2)—— HDFS分布式文件系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验