存档

‘linux’ 分类的存档

c中出现的offsetof宏和container_of宏 解析

2015年12月27日 606 人阅读 没有评论
1、offsetof宏用于求成员变量在结构体中的偏移量
#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE*)0)->MEMBER)
我们来逐步分解这个宏:
((TYPE*)0) 把地址值为0指针转换为TYPE指针
((TYPE*)0)->MEMBER 解指针应用,求起始地址为0的类型为TYPE的成员MEMBER
&((TYPE*)0)->MEMBER 求起始地址为0的类型为TYPE的成员MEMBER的地址
((size_t)&((TYPE*)0)->MEMBER) 把起始地址为0的类型为TYPE的成员MEMBER的地址值类型转换为size_t类型
综上我们可以看到一个很巧妙的地方,就是把值为0的地址转换为TYPE*指针,这样求得的MEMBER的地址就是成员MEMBER在TYPE中的偏移量。

阅读全文…

分类: c/c++, linux 标签:

memmove函数真的没有问题了?

2015年11月18日 632 人阅读 没有评论

1、思考

首先思考一个问题:“不是已经有了memcpy了码?为什么还要提供memmove?”

2、解惑

通过man手册我们可以发现memcpy和memmove的原型都是void * (void *dest, const void *src, size_t n);那么它们有什么区别,通过查看memcpy和memmove的源码我们发现memcpy是从低地址往高地址逐字节的拷贝,而memmove则会比较一下dest和src地址的大小,当src地址大于dest时memmove的行为和memcpy的行为是一致的,当dest地址大于src时,memmove则是从高地址往低地址逐字节的拷贝,从而避免了当dest地址大于src地址且拷贝区域存在交叉的情况下,dest最后几个字节的值有误的情况。

阅读全文…

分类: c/c++, linux, 面试 标签: ,

linux c函数中打印当前函数调用栈

2015年10月16日 583 人阅读 没有评论
1、概述

    在execinfo.h的头文件中提供了backtrace,和backtrace_symbols两个c函数接口用于打印程序当前的调用栈。backtrace用于获取调用栈,backtrace_symbols用于把调用栈转换成函数名和地址的字符串。

阅读全文…

分类: c/c++, linux 标签:

linux环境变量浅析

2015年9月6日 468 人阅读 没有评论

1、概念

环境变量是存在于系统中的公用数据,任何程序都可以访问。通常来说,环境变量存储的都是系统的一些公用信息,例如执行文件的搜索动态库的搜索路径,当前用户等。环境变量是key=value的形式的字符串集合,shell里可以使用env这个内建(build-in)的命令来获取环境变量信息。所以说环境变量是存储公共配置信息的地方。

阅读全文…

分类: linux 标签: ,

命令大杂烩(实用而经常记不牢)

2015年8月10日 364 人阅读 没有评论

计算机领域水太深了,不可能什么都记住,所以只需要理解并记住核心的原理,其他的交给网络,用的时候查一下就可以了。整理平时自己觉得好用而又记不住的命令如下:

1、让内核参数立即生效:sysctl -p

阅读全文…

分类: linux 标签: