C语言
文章平均质量分 84
unix21
这个作者很懒,什么都没留下…
展开
-
Nginx源码分析--数据对齐posix_memalign和memalign函数
对齐数 据的对齐(alignment)是指数据的地址和由硬件条件决定的内存块大小之间的关系。一个变量的地址是它大小的倍数的时候,这就叫做自然对齐 (naturally aligned)。例如,对于一个32bit的变量,如果它的地址是4的倍数,-- 就是说,如果地址的低两位是0,那么这就是自然对齐了。所以,如果一个类型的大小是2n个字节,那么它的地址中,至少低n位是0。对齐的规则是由硬件引原创 2013-10-20 22:49:13 · 6401 阅读 · 0 评论 -
双链表的实现
一、在学习arm过程中发现这“指针函数”与“函数指针”容易搞错,所以今天,我自己想一次把它搞清楚,找了一些资料,首先它们之间的定义:1、指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变原创 2013-05-14 14:07:50 · 1019 阅读 · 0 评论 -
使用指针做函数返回值
1.使用指针做函数返回值1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);2、使用栈内存返回指针是明显错误的,因为栈内存将在调用结束后自动释放,从而主函数使用该地址空间将很危险。3、使用堆内存返回指针原创 2013-02-23 23:55:31 · 3471 阅读 · 0 评论 -
指针的本质2-void和void*及其应用在nginx中的应用
char **p,a[6][8]; 问p=a是否会导致程序在以后出现问题? 直接用程序说明:编译,然后就会发现通不过,报错:错误 1 error C2440: “=”: 无法从“char [6][8]”转换为“char **” 于是乎,我看了下《C专家编程》里10.5节—使用指针向函数传递一个多维数组。方法一,函数是 void fun(int arr[2][3]); 这种方法只原创 2013-10-21 16:53:20 · 1829 阅读 · 0 评论 -
使用NetBeans IDE开发C程序
建立一个malloc和free的队列,用一个malloc就加入队列(加入行号和函数名),用一个free就放出一个malloc,最后这个队列如果不是空,就说明内存有泄露,反之就可以偷着乐了。原创 2013-09-28 10:02:34 · 4168 阅读 · 1 评论 -
仿照redis写的nginx开机画面
1、获取文件的flags,即open函数的第二个参数:flags = fcntl(fd,F_GETFL,0);2、设置文件的flags:fcntl(fd,F_SETFL,flags);3、增加文件的某个flags,比如文件是阻塞的,想设置成非阻塞:flags = fcntl(fd,F_GETFL,0);flags |= O_NONBLOCK;fcntl(fd,F_SET原创 2013-03-29 17:48:37 · 1160 阅读 · 0 评论 -
使用valgrind分析C程序调用线路图
Valgrind可以检测内存泄漏和内存违例,但是用Valgrind生成的日志信息结合kcachegrind就可以查看C程序的执行线路图,调用时间,是做性能优化和查看代码的非常好的工具。下载安装Valgrind 安装到www.valgrind.org下载最新版valgrind# wget http://www.valgrind.org/downloads/valgri原创 2013-04-08 14:01:23 · 5913 阅读 · 0 评论 -
深入理解malloc和free
指针并非只指向一个变量,指针指向的是地址,也可以理解为数组的首地址。返回数组基本上都是使用返回指针的方式。不过需要注意的是,不要返回局部数组变量的指针,因为在函数运行结束后,栈空间将被释放,指针操作会很危险。可以用参数传递指针给函数,或者在函数中声明静态化局部变量或者使用全局变量等变通方法。p只是指向9个int大小的地址,但是却可以有p[0],p[1]等,但是p[10]也可原创 2013-03-07 10:57:08 · 1534 阅读 · 0 评论 -
从寄存器看I386和x64位中函数调用中参数传递
x86_64基本使用寄存器存储函数参数,寄存器不够才入栈;而i386将所有参数保存在栈上,通过gcc的扩展功能__attribute__((regparm()))即可实现部分参数的寄存器传递。代码#include #include int v1 = 1;float v2 = 0.01;#ifdef FAST__attribute__((regparm(3))原创 2012-12-29 13:03:32 · 8906 阅读 · 0 评论 -
从1的补码说起计算机的数制
字节换算bit(b)=位字节(byte)=8位 -128~127 0~255半字=2字节=16位 -32768~32767 0~65,535字(word)=4字节=32位 -2147483848~2147483647 0~4,294,967,295双字=8字节=64位 -9223372036854775808~9223372036854775807 0~18,446,744,0原创 2012-12-29 13:13:12 · 1451 阅读 · 0 评论 -
各种类型的字节数
int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。C、C++标准中只规定了某种类型的最小字节数(防止溢出)64位指的是cpu通用寄存器的数据宽度是64位的。找到一个图 数据类型名称字节数别名取值范围int原创 2013-09-26 18:32:59 · 1048 阅读 · 0 评论 -
说透一级指针和二级指以及(void**)&在双链表中的应用
void (*signal (int signo,void (*func) (int) )) (int)这一大堆看起来很难,其实仔细分析下不算很难搞。首先要明白一件事:这里都是从最基本的语法展开的。那么这里最基本的语法就是函数的声明:返回值 函数名(参数)。先将这一大堆给看成void (f)(int)也就是将*signal (int signo,void (*func) (in原创 2013-05-14 09:26:12 · 6172 阅读 · 0 评论 -
位运算
一、C语言的六种位运算符:& 按位与| 按位或^ 按位异或~ 取反左移>> 右移位运算应用口诀: 清零取反要用与,某位置一可用或若要取反和交换,轻轻松松用异或将int型变量a的第k位清0,即a=a&~(1将int型变量a的第k位置1, 即a=a|(11. 按位与运算按位与运算符"&"是双目运算符。 其功能原创 2013-11-21 22:40:52 · 2412 阅读 · 0 评论 -
深度分析typedef--定义自己的数据类型
最近在看redis源码的时候看到Ae.h的时候看到如下源码不理解:/* Types and data structures */typedef void aeFileProc(struct aeEventLoop *eventLoop, int fd, void *clientData, int mask);typedef int aeTimeProc(struct aeEventLoop原创 2013-07-25 15:59:07 · 1926 阅读 · 0 评论 -
频繁分配释放内存导致的性能问题的分析--brk和mmap的实现
原文地址:已经找不到现象1 压力测试过程中,发现被测对象性能不够理想,具体表现为: 进程的系统态CPU消耗20,用户态CPU消耗10,系统idle大约70 2 用ps -o majflt,minflt -C program命令查看,发现majflt每秒增量为0,而minflt每秒增量大于10000。初步分析majflt代表major fault,中文名叫原创 2013-11-11 18:10:47 · 2915 阅读 · 1 评论 -
结构体的两种声明方式:堆上和栈上以及在双链表的应用
一、头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH (这些变量在windows下对应的是include环境变量)※再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-原创 2013-03-17 22:00:29 · 2222 阅读 · 0 评论 -
linux环境内存分配原理
generate-core-file可将调试中的进程生成内核转储文件gcore可以从命令行直接生成内核转储文件,该命令无需停止正运行的程序以获得内核转储文件(gdb) generate-core-fileSaved corefile core.2785(gdb) gcore 'ps'Saved corefile 'ps' --《未完》---原创 2012-12-29 12:50:17 · 3320 阅读 · 0 评论 -
Nginx内存池--pool代码抽取(链表套路)
作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程原创 2013-09-26 18:38:11 · 1349 阅读 · 0 评论 -
二叉树的建立与遍历
代码:/* Sorting integers using a binary tree */#include #include #include /* Function prototypes */struct Node *createnode(long value); /* Create a tree node */struct Node *add原创 2013-02-21 22:27:16 · 710 阅读 · 0 评论 -
C语言不要重复包含.h头文件和.c文件
本文首先向读者讲解了Linux下进程地址空间的布局以及进程堆栈帧的结构,然后在此基础上介绍了Linux下缓冲区溢出攻击的原理及对策。原理:从逻辑上讲进程的堆栈是由多个堆栈帧构成的,其中每个堆栈帧都对应一个函数调用。当函数调用发生时,新的堆栈帧被压入堆栈;当函数返回时,相应的堆栈帧从堆栈中弹出。尽管堆栈帧结构的引入为在高级语言中实现函数或过程这样的概念提供了直接的硬件支持,但是由于将函数原创 2012-12-29 13:16:28 · 2096 阅读 · 1 评论 -
C语言extern关键字定义外部变量--Redis源码extern使用
在用C语言开发时,特别是在服务器端,内存的使用会成为系统性能的一个瓶颈,如频繁的分配和释放内存,会不断的增加系统的内存碎片,影响内核之后分配内存的效率,这个时候一个比较可行的做法是采用内存池,先分配好比较多的内存,然后在这个已经分配的内存里使用内存,这样就不需要内核过多的参与内存分配和释放的过程。内存池根据应用不同有多种实现的策略,如有些分配很大的内存,然后将内存分配成大小相等的块,并原创 2013-11-11 14:25:20 · 1432 阅读 · 0 评论 -
C语言的HashTable简单实现
原文地址:http://blog.csdn.net/zmxiangde_88/article/details/8025541HashTable是在实际应用中很重要的一个结构,下面讨论一个简单的实现,虽然简单,但是该有的部分都还是有的。一,访问接口创建一个hashtable.hashtable hashtable_new(int size) // size表示包含的接点个数原创 2013-11-11 14:44:57 · 1136 阅读 · 0 评论 -
深度分析define预处理指令
用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量原创 2013-09-26 18:36:49 · 893 阅读 · 0 评论 -
函数指针--Nginx和Redis中两种回调函数写法
Nginx和Redis中两种回调函数写法#include //仿Nginx的写法//定义函数指针类型typedef void (*ngx_connection_handler_pt)(int c);//redis风格typedef void redisCommandProc(int c);typedef struct{int a;//第一步:定义void (*pshow)原创 2013-08-11 16:41:44 · 2001 阅读 · 0 评论 -
从*p++说指针,数组,结构和函数
strlen实现#include main(){ char str[]= "Abcde"; printf("\n string = %s length = %d \n",str,str_length(str));}int str_length (const char *s){ int length = 0; while (*s++){ length++; } retur原创 2013-11-14 14:45:54 · 2010 阅读 · 1 评论 -
nginx源码分析--内存对齐处理
一级指针做形参:首先一定要明白形参和你传递参数的那个实参是两个不同的变量,即使同名也还依然不同。指针传递的是一个变量或者一个值的地址,但是它本身还是采用值传递的方式。即你不能使它指向另外一块地址,但是你可以改变它指向的空间里存的值。二级指针做形参:二级指针也是传值,但是他指向的地址是个一维指针,所以可以改变二维指针指向的地址空间里的内容也就是要申请空间的一维指针,不能改变二维指针本身的值,即不原创 2013-10-21 16:56:12 · 3167 阅读 · 0 评论 -
自己动手写HTTP服务--myhttpd
/** sol12.5.c ** ------------------------------------------------------------ A version of webserv that puts some typical CGI variables into the environment before calling exec is sol12.5.c. Thr原创 2013-03-26 23:01:13 · 1904 阅读 · 0 评论 -
轻量级简单队列服务HTTPSQS安装与使用
原文地址:http://blog.s135.com/httpsqs1.安装wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gztar zxvf libevent-2.0.12-stable.tar.gzcd libevent-2.0.12-stable/./configure -原创 2013-04-02 10:51:08 · 4040 阅读 · 0 评论 -
PHP内核中的哈希表结构
https://github.com/HonestQiao/tipi/commit/17ca680289e490763a6a402f79afa2a13802bb36下载:https://github.com/HonestQiao/tipi/tree/master/book/sample/chapt03原文地址:http://www.nowamagic.net/librarys/veda原创 2013-02-28 17:55:20 · 703 阅读 · 0 评论 -
TCMalloc:线程缓存的Malloc
转载自:http://shiningray.cn/tcmalloc-thread-caching-malloc.html作者:Sanjay Ghemawat, Paul Menage原文翻译:ShiningRay动机TCMalloc要比glibc 2.3的malloc(可以从一个叫作ptmalloc2的独立库获得)和其他我测试过的malloc都快。ptm原创 2013-03-13 10:34:55 · 942 阅读 · 0 评论 -
memset函数使用详解
1.void *memset(void *s,int c,size_t n)总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。2.例子#includevoid main(){char *s="Golden Global View";clrscr();memset(s,'G',6);printf("%s",s);getchar()原创 2013-02-27 16:50:03 · 567 阅读 · 0 评论 -
B树建立与遍历
# include # include # include "btrees.h"/* 给一个结点分配空间 */struct btnode * allocateNode(struct btnode *ptr){ int i,max; ptr = (struct btnode *)malloc(sizeof(struct btnode)); if(!ptr){原创 2013-02-21 22:39:04 · 2267 阅读 · 1 评论 -
C语言文件操作函数大全
unix中一切皆文件,所以文件操作至关重要!clearerr(清除文件流的错误旗标) 相关函数 feof表头文件 #include 定义函数 void clearerr(FILE * stream); 函数说明 clearerr()清除参数stream指定的文件流所使用的错误旗标。 返回值 fclose(关闭文件) 相关函数 close,fflush,f原创 2013-02-20 09:09:42 · 701 阅读 · 0 评论 -
TCMalloc
tcmalloc业界最有名的内存分配库,当数google 的tcmalloc。Tcmalloc 在管理小内存块时非常有效,而且能够避免在大内存分配时的mmap()系统调用。它在多线程中的表现也不错能很好的减少锁碰撞(glibc 致命的问题)。Tcmalloc 现在基本上成了mysql DBA 的标配了。--《打造支撑海量用户的高性能server》By @codebox-腾讯原创 2013-02-01 23:51:42 · 1023 阅读 · 0 评论 -
汇编包含C代码
反汇编的时候带上C代码便于观察 比较三元表达式和if else的差异a1.c#include int main(void) { int a=1;int b=2;int c=0;a = (b>c)?1:0;return 0;}a2.c#include int main(void) { int a=1;原创 2013-01-15 18:42:13 · 801 阅读 · 0 评论 -
Win32 环境下的堆栈
原文已经找不到,作者应该是:http://blog.csdn.net/slimak 但是没有找到此文,其中丢了2幅图简介在Win32环境下利用调试器调试应用程序的时候经常要和堆栈(Stack)打交道,尤其是在需要手工遍历堆栈(Manually Walking Stack)的时候我们需要对堆栈的工作过程有一个比较清晰的了解.接下来的这些文字将通过一个例子程序详细的讲解堆栈的工作过程.原创 2013-01-12 11:19:26 · 2433 阅读 · 0 评论 -
C语言Free时报错HEAP CORRUPTION DETECTED
char *k1;k1 = (char *) malloc(4*sizeof(char));v1 = (char *) malloc(4*sizeof(char)); strcpy(k1,"abcd");free(k1); 在linux下不会报错,但是在VC++环境会报错:HEAP CORRUPTION DETECTED 出现这个错误的原因一般都是操作new申请的内原创 2013-07-23 22:36:37 · 3158 阅读 · 0 评论 -
结构体中定义函数指针
结构体指针变量的定义,定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct结构体标识符{成员变量列表;…};struct 结构体标识符 *指针变量名;变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };形式2:在定义类型的同时定义变量struct结构体标识符{成员变量列原创 2013-07-10 18:54:20 · 14821 阅读 · 0 评论 -
浅谈无缓存I/O操作和标准I/O文件操作区别 (转载)
首先,先稍微了解系统调用的概念: 系统调用,英文名system call,每个操作系统都在内核里有一些内建的函数库,这些函数可以用来完成一些系统系统调用把应用程序的请求传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序,如果没有系统调用和内核函数,用户将不能编写大型应用程序,及别的功能,这些函数集合起来就叫做程序接口或应用编程接口(Application Progra原创 2013-09-26 19:03:44 · 919 阅读 · 0 评论 -
自己写的内存池Slabs
看memcached的源码写的,虽然很粗糙,但是基本思想还是有的,自娱自乐,后期不断改进。#include #include #include struct st{ void * start; void * end; char ptr[10];};struct it{ struct it* prev; struct it* next; int key; int val原创 2013-11-20 19:17:19 · 1163 阅读 · 1 评论