
C
文章平均质量分 66
xiongping_
这个作者很懒,什么都没留下…
展开
-
使struct对象拥有可变大小的数组
结构体中最后一个元素是长度为0的数组在Linux源代码中,有很多的结构体最后都定义了一个元素个数为0个的数组,如/usr/include/linux/if_pppox.h中有这样一个结构体: struct pppoe_tag { __u16 tag_type; __u16 tag_len; char tag_data[0];转载 2016-12-12 10:16:43 · 4162 阅读 · 0 评论 -
进程退出后,malloc分配的资源会被系统回收
当进程退出时,会释放进程的所用资源(进程分配的内存,打开的套接字,用户malloc资源)这一步是有操作系统完成的,malloc内存泄露是指在一个进程中malloc了内存没有free,在进程结束前,这段内存都是被占用的。原创 2015-07-06 12:07:34 · 3585 阅读 · 0 评论 -
signal信号值对应表
下表是linux2.6在80x86上的前31个signals及其相关说明.这些信号中有些是体系结构相关的(eg:SIGCHLD,SIGSTOP),有些则专门了某些体系结构才存在的(eg:SIGSTKFLT) (可以参考中断处理,里面也列出了一些异常对应的signal).The first 31 signals in Linux/i386#原创 2015-07-13 10:04:07 · 11202 阅读 · 0 评论 -
log文件超过2G导致程序崩
文件超过2G导致的问题:使用open打开文件的时候,加上O_LARGEFILE标志:int fd = open("test.dat", O_RDWR|O_APPEND|O_CREAT|O_LARGEFILE, 0666);read(), write()等与一般的用法一致,无变化。3、注意lseek()函数,文件未超过2G的时候,一切工作良好;文件超过2G后,调用返回-1,e原创 2015-07-02 10:47:11 · 1721 阅读 · 0 评论 -
HTTP Keep-Alive模式
http://www.cnblogs.com/skynet/archive/2010/12/11/1903347.html转载 2015-05-25 14:53:49 · 320 阅读 · 0 评论 -
转义字符总结
所有的转义字符和所对应的意义:转义字符意义ASCII码值(十进制)\a响铃(BEL)007\b退格(BS) ,将当前位置移到前一列008\f换页(FF),将当前位置移到下页开头原创 2015-07-01 16:11:33 · 1538 阅读 · 0 评论 -
Linux系统调用--getrlimit/setrlimit函数详解
Linux系统调用--getrlimit/setrlimit函数详解功能描述:获取或设定资源使用限制。每种资源都有相关的软硬限制,软限制是内核强加给相应资源的限制值,硬限制是软限制的最大值。非授权调用进程只可以将其软限制指定为0~硬限制范围中的某个值,同时能不可逆转地降低其硬限制。授权进程可以任意改变其软硬限制。RLIM_INFINITY的值表示不对资源限制。用法:in转载 2015-07-01 15:06:47 · 403 阅读 · 0 评论 -
Arrays of Length Zero在redis中的应用
Hacking StringsThe implementation of Redis strings is contained in sds.c (sds stands for Simple Dynamic Strings).The C structure sdshdr declared in sds.h represents a Redis string:struct sds转载 2015-06-01 15:44:46 · 550 阅读 · 0 评论 -
C语言结构体里的成员数组和指针
单看这文章的标题,你可能会觉得好像没什么意思。你先别下这个结论,相信这篇文章会对你理解C语言有帮助。这篇文章产生的背景是在微博上,看到@Laruence同学出了一个关于C语言的题,微博链接。微博截图如下。我觉得好多人对这段代码的理解还不够深入,所以写下了这篇文章。为了方便你把代码copy过去编译和调试,我把代码列在下面:123456转载 2015-06-01 15:09:56 · 752 阅读 · 0 评论 -
goto对资源的释放问题的解决
Q:一块代码中有大于1的资源的分配时,很容易造成跳过资源的释放;从而导致资源的泄露。A:利用goto语句的跳转特点可以一定程度上解决这个问题example:FILE *f1=open();if(NULL==f1){ goto error1;}FILE *f2=open();if(NULL==f2){ goto error2;原创 2015-03-13 11:49:30 · 529 阅读 · 0 评论 -
linux无锁化编程--__sync_fetch_and_add系列原子操作函数
最近编码需要实现多线程环境下的计数器操作,统计相关事件的次数。下面是一些学习心得和体会。不敢妄称原创,基本是学习笔记。遇到相关的引用,我会致谢。 当然我们知道,count++这种操作不是原子的。一个自加操作,本质是分成三步的: 1 从缓存取到寄存器 2 在寄存器加1 3 存入缓存。 由于时序的因素,多个线程操作同一个全局变量,会出现问题。这也转载 2015-07-14 16:15:59 · 569 阅读 · 0 评论 -
数据类型的加1位移的长度
char *p; p++ ; p位移加sizeof(char) 1;int *p ; p++; p位移加sizeof(int) 4;double *p; p++ p位移加sizeof(double)8;truct sdshdr { unsigned int len; unsigned原创 2015-10-08 11:06:44 · 357 阅读 · 0 评论 -
memmove和memcpy
memmove和memcpy1.memmove函数原型:void *memmove(void *dest, const void *source, size_t count)返回值说明:返回指向dest的void *指针参数说明:dest,source分别为目标串和源串的首地址。count为要移动的字符的个数函数说明:memmove用于从source拷贝count个字符到d转载 2016-05-06 14:05:53 · 364 阅读 · 0 评论 -
关于socket阻塞与非阻塞情况下的recv、send、read、write返回值
1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 0接收到数据大小,特别:返回值 2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?阻塞与非阻塞write返回值没有区分,都是 0发送数据大小,特别:返回值 3、阻塞模式下read返回值 非转载 2016-05-04 09:59:52 · 444 阅读 · 0 评论 -
127.0.0.1和本机ip区别
127.0.0.1 :这个地址通常分配给 loopback 接口。loopback 是一个特殊的网络接口(可理解成虚拟网卡),用于本机中各个应用之间的网络交互。只要操作系统的网络组件是正常的,loopback 就能工作。常的网络包从ip层进入链路层,然后发送到网络上,而发向loopback地址的包,直接在IP层短路了,也就是发到IP层的包直接被IP层接收了,不再向下发送。原创 2016-04-13 17:57:53 · 3008 阅读 · 0 评论 -
AIO
转载:http://blog.chinaunix.net/uid-11572501-id-2868654.htmlLinux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。稍后或在接收到 I/O 操作完成转载 2016-03-24 10:56:56 · 480 阅读 · 0 评论 -
thread join和detach区别
在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached)。一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。相反,一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。 线程的分离状态决定一个线程以什么样的方式来终止自己。在默认情况下线程是非分离状态的,这种情况原创 2016-03-24 10:01:26 · 4786 阅读 · 0 评论 -
慢系统调用
1. 术语1.1. 慢系统调用(Slow system call)该术语适用于那些可能永远阻塞的系统调用。永远阻塞的系统调用是指调用永远无法返回,多数网络支持函数都属于这一类。如:若没有客户连接到服务器上,那么服务器的accept调用就会一直阻塞。慢系统调用可以被永久阻塞,包括以下几个类别:(1)读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在转载 2015-10-15 17:20:36 · 838 阅读 · 0 评论 -
内存管理内幕
http://www.ibm.com/developerworks/cn/opensource/os-cn-kafka-distributed/为什么必须管理内存内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与 局限性至关重要。在大部分系统语言中,比转载 2015-11-16 11:44:39 · 423 阅读 · 0 评论 -
errno 错误宏定义的值及解释
注意:只有当一个库函数失败时,errno才会被设置。当函数成功运行时,errno的值不会被修改。这意味着我们不能通过测试errno的值来判断是否有错误存在。反之,只有当被调用的函数提示有错误发生时检查errno的值才有意义。查看错误代码errno是调试程序的一个重要方法。当linux C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示转载 2015-10-15 10:17:33 · 5366 阅读 · 0 评论 -
队列汇总
消息队列可以把消息产生和消息处理解耦合,分离开来,并且可以避免了使用线程或进程同步的锁是一个典型的生产者消费者模式生产者生产数据入队列=>队列缓存=>消费者取数据队列采用先进先出的阻塞队列,队列前后分别有至少一个线程,前一线程负责往队列中放数据,后一线程负责从队列中取数据进行分析处理等操作经典的队列应用:1.内存队列2.无锁内存队列Rin原创 2015-11-06 16:58:58 · 290 阅读 · 0 评论 -
文件结构体之struct stat
在使用这个结构体和方法时,需要引入:struct stat这个结构体是用来描述一个linux系统文件系统中的文件属性的结构。可以有两种方法来获取一个文件的属性:1、通过路径:int stat(const char *path, struct stat *buf);int lstat(const char *path,struct stat *转载 2015-04-21 09:00:00 · 471 阅读 · 0 评论 -
共用体、位段、typedef、enum区别
一、共用体1、定义:使几个不同的变量共占同一段内存的结构,称为共用体类型的结构。 union共用体名 { 成员表列; }变量表列;注意:(1)共用体中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有成员就失去作用。 (2)不能对共用体变量赋值,不能初始化。2、举例:存放教师学生数据,如果是学生,数据包括号码、姓名、性别、职业、班转载 2015-02-06 18:57:36 · 625 阅读 · 0 评论 -
Linux下利用backtrace追踪函数调用堆栈以及定位段错误
一般察看函数运行时堆栈的方法是使用GDB(bt命令)之类的外部调试器,但是,有些时候为了分析程序的BUG,(主要针对长时间运行程序的分析),在程序出错时打印出函数的调用堆栈是非常有用的。在glibc头文件"execinfo.h"中声明了三个函数用于获取当前线程的函数调用堆栈。int backtrace(void **buffer,int size) 该函数用于获取当前线程的调用堆栈转载 2015-02-14 15:26:48 · 372 阅读 · 0 评论 -
realloc,malloc,calloc的区别
(1)C语言跟内存分配方式从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量、static变量.在栈上创建 在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限.从堆上分配,亦称动态内存分配转载 2015-02-04 09:37:22 · 409 阅读 · 0 评论 -
struct结构体初始化3种方法
c语言 struct 的初始化struct数据有3中初始化方法:顺序,C风格及C++风格的乱序。1)顺序 这种方法很常见,在一般的介绍C的书中都有介绍。顺序初始化的特点是: 按照成员定义的顺序,从前到后逐个初始化;允许只初始化部分成员;在被初始化的成员之前,不能有未初始化的成员。 eg: struct User oneUser = {10, "Lucy", "/home转载 2015-02-06 18:55:06 · 4925 阅读 · 0 评论 -
enum枚举类型
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型,通常和switch case一起使用。语法:enum gvod_type_app_e { GVOD_TYPE_APP_GVOD = 0x00, GVOD_TYPE_APP_GIPTV = 0x01, GVOD_TYPE_APP_ALL = 0x02, GVOD_TYPE_A原创 2015-02-06 18:49:30 · 402 阅读 · 0 评论 -
结构体中的函数指针(类中的成员函数效果)
结构体指针变量的定义,定义结构体变量的一般形式如下:形式1:先定义结构体类型,再定义变量struct结构体标识符{成员变量列表;…};struct 结构体标识符 *指针变量名;变量初始化一:struct结构体标识符 变量名={初始化值1,初始化值2,…, 初始化值n };形式2:在定义类型的同时定义变量struct结构体标识符{成员变量列转载 2015-02-28 10:17:56 · 1294 阅读 · 0 评论 -
for和while等价
一切可以用while的,都可以用for表示,反之也可以。while(逻辑值){ 循环体;}for(初始值 ;逻辑值 ;改变变量的值) { 循环体;}其实,它们工作原理是一样的。那么就从内存使用情况来考虑了:如果它们定义的变量类型一样,变量的个数一样。那么。。。。。。哎,其实这两个就是一样的。。。我也不知道怎么解释。。。比如,在for中,“改变变量的值“不一原创 2015-02-27 14:35:28 · 2362 阅读 · 0 评论 -
define小结
define小结 1. 定义简单的常数:定义常量,便于修改(切不可在后面加上分号!) #define N 1000 等效于 const int N = 1000; 但略有不同,define只是简单替换,而不是作为一个量来使用.2. 定义简单的函数:注意多使用括号 #define MAX(x, y) ((x) > (y)) ? (x) : (y)3. 定义单行宏:主要有以转载 2015-02-26 09:27:44 · 345 阅读 · 0 评论 -
linux进程双向通信
Linux环境下使用socketpair函数创造一对未命名的、相互连接的UNIX域套接字。定义int socketpair(int d, int type, int protocol, int sv[2]);描述建立一对匿名的已经连接的套接字创建一对Socket:转载 2015-02-14 16:43:09 · 638 阅读 · 0 评论 -
C,C++头文件的作用
在C语言家族程序中,头文件被大量使用。一般而言,每个C++/C程序通常由头文件(header files)和定义文件(definition files)组成。头文件作为一种包含功能函数、数据接口声明的载体文件,用于保存程序的声明(declaration),而定义文件用于保存程序的实现 (implementation)。 C++/C程序的头文件以“.h”为后缀。以下是假设名称为 graphic原创 2015-02-04 10:50:13 · 417 阅读 · 0 评论 -
函数指针的应用
struct ngx_module_s { ngx_uint_t ctx_index; ngx_uint_t index; ngx_uint_t spare0; ngx_uint_t spare1; ngx_uint_t spare2;原创 2015-02-28 09:28:37 · 364 阅读 · 0 评论 -
指针内存分配总结
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存原创 2015-02-11 20:07:01 · 668 阅读 · 0 评论 -
mmap介绍
UNIX网络编程第二卷进程间通信对mmap函数进行了说明。该函数主要用途有三个:1、将一个普通文件映射到内存中,通常在需要对文件进行频繁读写时使用,这样用内存读写取代I/O读写,以获得较高的性能;2、将特殊文件进行匿名内存映射,可以为关联进程提供共享内存空间;3、为无关联的进程提供共享内存空间,一般也是将一个普通文件映射到内存中。头文件: #include原创 2015-02-13 10:13:05 · 469 阅读 · 0 评论 -
Socket发送和接受
发送的函数:ssize_t write(int sockfd, void *buf, int nbyte);ssize_t send(int sockfd, const void *buf, size_t len, int flags);ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,转载 2015-04-08 14:07:47 · 1701 阅读 · 0 评论 -
大端小端问题
大端小端,是针对操作数地址存放方式而言的小端:从低字节到高字节存放;低地址存放低字节,高地址存放高字节大端:从高字节到低字节存放;低地址存放高字节,高地址存放低字节例如0x12345678小端存放方式: 大端存放方式:内存地址: 存放内容:原创 2015-04-07 10:14:25 · 443 阅读 · 0 评论 -
系统函数之signal()详解
函数名: signal表头文件#include功 能:设置某一信号的对应动作函数原型:void (*signal(int signum,void(* handler)(int)))(int);或者:typedef void (*sig_t)( int );sig_t signal(int signum,sig_t handler);参数说明:第一个参数signu原创 2015-04-07 09:30:56 · 1406 阅读 · 0 评论 -
C读取XML配置文件开源项目SCEW
SCEW的目的是提供在XML围绕一个简单的接口Expat解析器,以及用于创建新的XML的简单接口文档。它提供的功能来加载和访问XML元素而不需要每次都创建外籍事件处理例程要加载一个新的XML文档。这些是主要的SCEW特点: - 使用新的或解析XML文档的DOM样的对象模型。 - 支持级联加载XML文档。 - 可以复制和比较完整的X原创 2015-03-13 11:11:17 · 2303 阅读 · 0 评论 -
Nginx:双向队列(Queue)
源码文件src/core/ngx_queue.hsrc/core/ngx_queue.c 设计思路Nginx提供一个非常简单的侵入式双向队列(双向链表),也即向每个元素嵌入数据结构的链接结点。这样做的好处在于:1. 省去对数据结构所用内存的管理,进一步减少内存碎片;2. 降低代码复杂度。 另外,通过使用额外的哨兵结点机制,简化了代码。 数据结构nginx转载 2015-02-28 15:54:00 · 1443 阅读 · 0 评论