Liunx 与 C
文章平均质量分 65
Mrpre
??
展开
-
tcp_diag 内核相关实现 以及调用层次
tcp_diag 内核相关实现前言tcp_diag 是一个内核模块,本文的目的是梳理调用关系,如果从用户态的socket一路调用到tcp_diag模块dump出所有socket的。大致分层关系 总结如下:netlink层->sock_diag层->inet_diag层->tcp_diag用户态代码类似 ss 功能的代码可以从 https://man7.org/linux/man-pages/man7/sock_diag.7.html 中获得,但是它只是打印 unix_socket原创 2022-04-22 16:09:19 · 4138 阅读 · 0 评论 -
隐藏动态库so中的符号(函数名)
隐藏动态库so中的符号(函数名)正常的lib库生成1.cint func1(){ return 1;}2.cextern int func1(void);int func2(){ return func1();}编译成动态库 libfunc.so:gcc -shared -fPIC -o libfunc.so 1.c 2.c查看符号:$nm libf...原创 2018-11-29 19:35:50 · 11218 阅读 · 0 评论 -
通过代码获取Linux nameserver(域名服务器ip)
通过代码获取Linux 域名服务器ip/etc/resolv.conf首先,/etc/resolv.conf定义了机器的域名服务器ip,例如nameserver 1.1.1.1nameserver 2.2.2.2表示DNS服务器地址有2个。当然,你可以人肉解析改配置文件,这个是没问题的,如果你代码没有BUG的话。glibc 对配置文件的处理#ifdef _LIBC if (M...原创 2018-11-16 19:10:54 · 3881 阅读 · 0 评论 -
调用malloc时发生了什么(2) - sys_brk函数与VMA
调用malloc时发生了什么(2) - sys_brk函数在上一篇中我们讲过,malloc实际调用了brk函数完成堆的分配,也了解了进程的内存布局。现在我们来看看,进程的内存布局到底是怎么实现的。具体如何堆指针增加减少的。增加减少,堆进程的影响是什么?一系列的问题等着我们去解决。sys_brk函数(去掉了与本篇无关的代码)SYSCALL_DEFINE1(brk, unsigned原创 2018-01-20 17:24:00 · 1196 阅读 · 2 评论 -
pipe函数内核实现
pipe源码分析本文基于linux kernel 4.13 分析,与通用的2.6差距较大。请读者自行甄别本文的特性,是否符合自己当前环境。本文要解决的问题1:pipe源码分析2:pipe大小限制3:如果没有读(写)端了,那么我写(读)操作会发生什么。父子进程之间通信,首先想到的是pipe函数,pipe函数返回2个fd。通常原创 2017-12-09 17:32:10 · 4443 阅读 · 0 评论 -
调用malloc时发生了什么(1) - brk与sbrk
调用malloc时发生了什么这或许是老生常谈的问题,也是面试中经常碰到的问题,有人简单的几句话就回答完了,有人却能大谈特谈。疑问进程的堆栈结构malloc是否会占用内存malloc对应的系统调用malloc返回的地址free函数干了什么一般,我们在需要申请内存的时候,需要执行malloc(),分配内存,需要注意的是,malloc()是glibc函数,其实际对应的系统原创 2018-01-13 21:22:00 · 4766 阅读 · 0 评论 -
__attribute__((weak))
情况是这样的,碰到一个棘手的问题:我们不确定外部模块是否提供一个函数func,但是我们不得不用这个函数,即自己模块的代码必须用到func函数:extern int func(void);...................int a = func();if( a > .....){..........}............我们不知道func函数是否被...原创 2014-04-07 12:57:20 · 13973 阅读 · 0 评论 -
setcontext getcontext makecontext swapcontext
Linux上下文切换以及协程 上下文切换,听起来虚无缥缈,什么是上下文,切换又是指的是什么?其实上下文就可以理解为一个进程所运行的相关的寄存器值,即包括sp/bp/pc等值,换句话说,一个上下文,就是包括了能够恢复进程运行所需要的所有必要的东西。所谓的切换, 那是多进程的操作系统必要的功能,一个CPU能够运行多个进程(看起来),那么必然要在多个进程之间不停的切换,A切换到B时,必...原创 2017-12-03 10:02:48 · 3328 阅读 · 3 评论 -
位域&大小端
int main(){ char* c; struct bitfield { int ia:3; int ib:2; int ic:3; } field; field.ia=4; field.ib=2; field.ic=2; c=(char *) &field; printf("原创 2014-06-18 00:03:00 · 860 阅读 · 0 评论 -
if语句的效率
这个帖子的内容非常精彩。http://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array大概内容是在这样的,有这么一条语句:if (data[c] >= 128) sum += data[c];data数组是排过原创 2014-01-27 17:55:27 · 2524 阅读 · 0 评论 -
linux 内核定时器 timer_list
linux内核使用timer_list 结构体当作定时器。点击(此处)折叠或打开#include linux/timer.h>#include linux/module.h>MODULE_LICENSE("GPL"); //不加这句话,虽然不影响功能,但“有时候”程序执行时会打印错误,类似 Disa原创 2013-12-22 17:17:26 · 3428 阅读 · 0 评论