随笔分类 -  C

摘要:http://www.cnblogs.com/jeffchen/archive/2006/05/09/395535.html1.以字符串形式出现的,编译器都会为该字符串自动添加一个0作为结束符,如在代码中写 "abc",那么编译器帮你存储的是"abc\0"2."abc"是常量吗?答案是有时是,有时不是。 不是常量的情况:"abc"作为字符数组初始值的时候就不是,如 char str[] = "abc"; 因为定义的是一个字符数组,所以就相当于定义了一些空间来存放"abc",而 阅读全文
posted @ 2012-09-20 18:57 balaamwe 编辑
摘要:./configure该脚本将运行一些测试来猜测一些系统相关的变量并检测你的操作 系统的特殊设置,并且最后在制做树中创建一些文件以记录它找到了什么.缺省设置将制作服务器和应用程序,还有所有只需要C编译器的客户端程序和接口。 缺省时所有文件都将安装到 /usr/local/pgsql.你可以通过给出下面 configure 命令行选项中的一个或更多的选项来客户化 制作和安装过程:--prefix=PREFIX把所有文件装在目录 PREFIX下面而不是 /usr/local/pgsql 里.实际的文件会安装到不同的子目录里;甚至没有一个文件会直接 安装到 PREFIX 目录里.如果你有特殊需要,你 阅读全文
posted @ 2012-06-07 14:35 balaamwe 编辑
摘要:size_t和ssize_t是ANSI C提供的标准头文件里定义的一个“数据类型”,其实并不是新的数据类型,不是关键字,是通过typedef从已有数据类型定义而来。ANSI C总共提供了24个头文件,他们所处的目录因编译器而异,作者用的编译器是gcc4.3.2,大部分头文件在/usr/include目录下,但是定义size_t和ssize_t的头文件stddef.h则位于/usr/lib/gcc/i486-linux-gnu/4.3.2/include目录下,是这样定义的:#define __SIZE_TYPE long unsigned int........................ 阅读全文
posted @ 2012-05-26 00:42 balaamwe 编辑
摘要:http://hi.baidu.com/ljy2008wl/blog/item/9990b01d37dee448f3de32b0.htmlC 语言中,术语副作用(side effect)是指对数据对象或者文件的修改。例如,以下语句 var = 99;的副作用是把 var 的值修改成 99。对表达式求值也可能产生副作用,例如: se = 100对这个表达式求值所产生的副作用就是 se 的值被修改成 100。 序列点(sequence point)是指程序运行中的一个特殊的时间点,在该点之前的所有副作用已经结束,并且后续的副作用还没发生。 C 语句结束标志——分号;和括号()是序列点。也就... 阅读全文
posted @ 2012-04-29 13:19 balaamwe 编辑
摘要:http://kb.cnblogs.com/page/135667/ 阅读全文
posted @ 2012-04-27 22:25 balaamwe 编辑
摘要:用C/C++开发其中最令人头疼的一个问题就是内存管理,有时候为了查找一个内存泄漏或者一个内存访问越界,需要要花上好几天时间,如果有一款工具能够帮助我们做这件事情就好了,valgrind正好就是这样的一款工具。Valgrind是一款基于模拟linux下的程序调试器和剖析器的软件套件,可以运行于x86, amd64和ppc32架构上。valgrind包含一个核心,它提供一个虚拟的CPU运行程序,还有一系列的工具,它们完成调试,剖析和一些类似的任务。valgrind是高度模块化的,所以开发人员或者用户可以给它添加新的工具而不会损坏己有的结构。valgrind的官方网址是:http://valgrin 阅读全文
posted @ 2012-04-24 15:30 balaamwe 编辑
摘要:写了一个多线程的代码,在主线程中申请了一块内存,在另一个线程中释放内存,老出错误,不知道是怎么回事。*** glibc detected *** /home/ydx/vehicle-program/vehicle-v1.0/t: double free or corruption (!prev): 0x080644c8 ***======= Backtrace: =========/lib/libc.so.6[0x7c7261]/home/ydx/vehicle-program/vehicle-v1.0/t[0x804991e]/home/ydx/vehicle-program/vehicle 阅读全文
posted @ 2012-01-12 22:25 balaamwe 编辑
摘要:写了一个多线程的代码,在主线程中申请了一块内存,在另一个线程中释放内存,老出错误,不知道是怎么回事。*** glibc detected *** /home/ydx/vehicle-program/vehicle-v1.0/t: double free or corruption (!prev): 0x080644c8 ***======= Backtrace: =========/lib/libc.so.6[0x7c7261]/home/ydx/vehicle-program/vehicle-v1.0/t[0x804991e]/home/ydx/vehicle-program/vehicle 阅读全文
posted @ 2012-01-12 22:25 balaamwe 编辑
摘要:应用程序:#include <syswait.h>usleep(n) //n微秒Sleep(n)//n毫秒sleep(n)//n秒驱动程序:#include <linux/delay.h>mdelay(n) //milliseconds 其实现#ifdef notdef#define mdelay(n) (\{unsigned long msec=(n); while (msec--) udelay(1000);})#else#define mdelay(n) (\(__builtin_constant_p(n) && (n)<=MAX_UDELA 阅读全文
posted @ 2012-01-12 22:19 balaamwe 编辑
摘要:http://www.cnblogs.com/chingliu/archive/2011/08/29/2223803.html尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义, 它产生一个指针指向结构 task_struct, 在 <linux/sched.h> 定义. current 指针指向当前在运行的进程. 在一个系统调用执行期间, 例如 open 或者 read, 当前进程是发出调用的进程. 内核代码可以通过使用 curre 阅读全文
posted @ 2012-01-12 20:47 balaamwe 编辑
摘要:tcp socket的发送缓冲区实际上是一个结构体struct sk_buff的队列,我们可以把它称为发送缓冲队列,由结构体struct sock的成员sk_write_queue(struct sk_buf_head)表示。sk_write_queue是一个结构体struct sk_buff_head类型,这是一个struct sk_buff的双向链表,其定义如下: struct sk_buff_head { struct sk_buff *next; //后指针 struct sk_buff *prev; //前指针 __u32 qlen; //队列长度(即含有几个struct sk_.. 阅读全文
posted @ 2012-01-12 20:45 balaamwe 阅读(6133) 评论(0) 推荐(1) 编辑
摘要:2.1 网络驱动程序的结构所有的Linux网络驱动程序遵循通用的接口。设计时采用的是面向对象的方法。一个设备就是一个对象(device 结构),它内部有自己的数据和方法。每一个设备的方法被调用时的第一个参数都是这个设备对象本身。这样这个方法就可以存取自身的数据(类似面向对象程序设计时的this引用)。一个网络设备最基本的方法有初始化、发送和接收。------------------- ---------------------|deliver packets | |receive packets queue||(dev_queue_xmit()) | |them(netif_rx()) |-- 阅读全文
posted @ 2012-01-12 20:44 balaamwe 阅读(462) 评论(0) 推荐(0) 编辑
摘要:Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信。1.进程调度(SCHED):控制进程对CPU的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际上是仅等待CPU资源的进程,如果某个进程在等待其它资源,则该进程是不可运行进程。Linux使用了比较简单的基于优先级的进程调度算法选择新的进程。2.内存管理(MM)允许多个进程安全的共享主内存区域。Linux的内存管理支持虚拟内存,即在计算机中运行的程序,其代码,数据,堆栈的总量可以超过实际内存的大小,操作系统只是把当前使用的程序块保留在内存中,其余的程序块则保留在磁盘中。必要时 阅读全文
posted @ 2012-01-12 20:40 balaamwe 编辑
摘要:Linux内核中的等待队列Linux内核的等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在Linux2.4.21中,等待队列在源代码树include/linux/wait.h中,这是一个通过list_head连接的典型双循环链表,如下图所示。在这个链表中,有两种数据结构:等待队列头(wait_queue_head_t)和等待队列项(wait_queue_t)。等待队列头和等待队列项中都包含一个list_head类型的域作为"连接件"。由于我们只需要对队列进行添加和删除操作,并不会修改其中的对象(等待队列项),因此,我们只需 阅读全文
posted @ 2012-01-12 20:39 balaamwe 阅读(2601) 评论(0) 推荐(1) 编辑
摘要:再次看这篇文章,感觉说的好多都是废话,在文章最前面补充一句话:“[]的优先级高于*”,大家可以带着这句话看下面的~~~========================再一次的见证了自己的基础不牢靠。。。幸好发现得早,看见网上说,华为的一个面试题就考了这个方面的。借那道华为的面试题引出问题,题目:char **p, a[16][8]; 问:p=a是否会导致程序在以后出现问题?为什么?可能有一部分朋友会回答正确,这里他们认为,a[]是一级指针,a[][]就是二级指针。那这个到底对不对呢?OK,用事实说话:1234567891011121314151617// Author: Tanky Woo// 阅读全文
posted @ 2012-01-07 22:23 balaamwe 编辑
摘要:GNU计划,又称革奴计划,是由Richard Stallman在1983年9月27日公开发起的。它的目标是创建一套完全自由的操作系统。它在编写linux的时候自己制作了一个标准成为GNU C标准。ANSI美国国家标准协会,它对C做的标准ANSI C标准后来被国际标准协会接收成为标准C所以ANSI C和标准C是一个概念总体来说现在linux也支持标准C,以后标准C可以跨平台,而GUN c一般只在linux c下应用18.1 ANSI C和标准C++的差别这里的ANSI C指的是最新的标准-C991、ANSI C不支持引用2、ANSI C不支持函数重载3、ANSI C多了两个整型(long lon 阅读全文
posted @ 2012-01-07 21:54 balaamwe 编辑
摘要:void的含义 void即“无类型”,void *则为“无类型指针”,可以指向任何数据类型。void指针使用规范①void指针可以指向任意类型的数据,亦即可用任意数据类型的指针对void指针赋值。例如: int *pint; void *pvoid; pvoid = pint; /* 不过不能 pint = pvoid; */ 如果要将pvoid赋给其他类型指针,则需要强制类型转换如:pint = (int *)pvoid; ②在ANSI C标准中,不允许对void指针进行算术运算如pvoid++或pvoid+=1等,而在GNU中则允许,因为在缺省情况下,GNU认为void *与char *一 阅读全文
posted @ 2012-01-07 21:42 balaamwe 编辑
摘要:http://hi.baidu.com/lingiloveyou/blog/item/21e57cf3322a6b40342accc7.html什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视,这时也是线程池该出场的机会了。如果线程创建和销毁时间相比任务执行时间可以忽略不计,则没有必要使用线程池了。 下面是Linux系统下用C语言创建的一个线程池。线程池会维护一个任务链表(每个CThread_worker结构就是一个任务)。 pool_init()函数预先创建好max_thread_num个线程,每个线 阅读全文
posted @ 2012-01-06 18:40 balaamwe 编辑
摘要:http://blog.csdn.net/nowdoit/article/details/6145340很多事物的由来都是有理由的,现在看似晦涩难解的符号token,背后都是有一段历史!1. fp()只是一种简写方式fp()是一个函数指针,所以*fp就是该指针指向的函数,所以(*fp)()就是调用该函数的方式。也就是 (*fp)() 和 fp() 是同一个意思;ANSI C 标准规定允许程序员将上式简写成 fp(),但是要记住,这只是一种简写方式罢了!这样的话,在查看定义比较复杂的函数时候,就能容易理解了!比如(*(void(*)()0)()。2. 数组a[i]的由来.首先我们定义一个数组,a 阅读全文
posted @ 2012-01-06 18:06 balaamwe 编辑
摘要:http://bbs.sjtu.edu.cn/bbscon,board,C,file,M.1290521786.A.htmlhttp://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc.html 一直以来想把2005年写的《再再论指针》修改一下,因为经过了这么多年,对C/C++的理解与05年相比又有了一些进展。但公司的工作一直很忙,没有时间进行修改工作。直到10月初的长假,才开始。从放假到现在过去两个月了,一直利用空闲时间断断续续地修改,共写了两万字,十章节。偶不是作家,两万字对偶来说已经是极限中的极限了,没. 阅读全文
posted @ 2012-01-06 18:05 balaamwe 编辑