自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(20)
  • 资源 (1)
  • 收藏
  • 关注

原创 GNU C 扩展(二)

七、attribute机制在GNU C中, 允许声明函数、变量和类型的特殊属性,以便指示编译器进行特定方面的优化和更仔细的代码检查。使用方式为在声明后面加上: __attribute__(( ATTRIBUTE ))。关键字__attribute__用来在声明的时候指定一个特定的属性。该关键字后面紧跟两对圆括号,括号里指定具体的属性,多个说明之间以逗号分隔。GCC支持很多属性,常用的有以下这些:1、noreturn该属性用于函数,表示该函数从不返回。它能够让编译器生成较为优化的代码,消除不必要的警告。例如:

2010-10-26 23:52:00 703

原创 GNU C扩展(一)

。。。要研究LINUX内核,C语言是基础中的基础,但是LINUX并不是完全的标准C,而是对标准C做了很多扩展,这些扩展特性对于我们分析内核有着很重要的作用,下面做些总结性的工作。一:柔性数组(flexible array) 柔性数组也称为零长度数组,或者零长度数组。这种数组通常在结构体当中出现,它本身并不占用空间,但是有了柔性数组意味着结构体的尺寸充满了变数。例如以下例子:struct usb_interface_cache { unsigned num_a

2010-10-26 03:29:00 684

原创 哈希表在进程管理中的应用

LINUX-2.6内核还支持另一种双向链表,其与 list_head 有明显的不同,因为它不是循环的,这就是现在要讨论的内核中的哈希表,也叫散列表。对于散列表而言,重要的不是在固定的时间内找到表中的最末一个元素,而是空间。表头存放在 hlist_head 中,这个结构具体实现如下:struct hlist_head{ struct hlist_node *first;};可以看得出来,不像双向链表的实现,哈希表的表头结点只有一个成员,指向下一个结点(如果没有就为NULL

2010-10-25 12:00:00 1079 1

原创 双向循环链表在 LINUX kernel 中的实现

如果我们把内核中的用链表表示的数据结构画出来,那将是一盘又复杂又美味的。。。。意大利面。。。就像在之前分析的VFS那样。内核中的链表经典实现,改造一下,体会一下,玩味一下。内核的经典双向循环链表结构跟普通教材上教的双向循环链表的实现不大一样,平常我们会把数据存储在节点中,再把节点连接起来形成链表,但是内核中的双向循环链表是用一个独立的结构体来表示的,如下:struct list_head{ struct list_head *prev; struct list_

2010-10-15 18:01:00 678 2

原创 内嵌函数

<br />所谓内嵌函数(nested function)是指定义在另一个函数内部的函数,这个特性也是GNU C的扩展特性,但在GNU C++中不被支持。内嵌函数名只在其所属代码块中有效,例如:<br /> <br />foo(double a, double b)<br />{<br />    int  square(double x) {return x*x;}<br /> <br />    return square(a) + square(b);<br />}<br /> <br />内嵌函数可

2010-07-25 15:57:00 371

原创 语句表达式

语句表达式(Statements and Declarations in Expressions)用一对圆括号包含一个复合语句,在GNU C中称之为 语句表达式,比如以下语句:     ({ int y = foo (); int z;        if (y > 0) z = y;        else z = - y;        z; })虽然看起来比较纠结,但在GNU C中这是合法的,这个 语句表达式 调用foo函数,然后计算其返回值的绝对值,整个表达式的值就是最右边的变量z的值。在宏定义中这

2010-07-25 14:11:00 339

原创 初窥VFS

 今天要拿VFS(Virtual File System)开涮,我们知道LINUX的成功是离不开虚拟文件系统VFS的,因为正是VFS提供的文件访问抽象层,使LINUX得以支持各式各样的文件系统。那究竟VFS是何方神圣?它是如何工作的?它在整个LINUX操作系统中扮演老几?本文试图通过简单易懂图文并茂的方式带领读者初窥门径,脑袋中对VFS有一个比较清晰的概览。“软件设计中,任何问题都可以

2010-02-15 12:58:00 825

原创 玩转VFS

LINUX之所以那么成功,VFS(虚拟文件系统)功不可没,是它让LINUX支持多种多样的文件系统,让我们程序员的生活变得美满幸福,我们可以潇洒地在迥异的文件系统之间进行数据通信而毫不费力,VFS是怎么做到的?看下文分晓。 我们知道,有些文件系统

2010-02-02 17:57:00 154

原创 一道TCL的笔试题---递归

题目:在下面这个程序片段中的划线处填上适当的表达式,使之逆序输出数组元素。  void recur(int a[], int k){    int tmp;    if(_____)    {        recur(_____, _____);        tmp = a[0];        a[0] = a[k-1];        a

2010-01-09 21:37:00 674

原创 变参函数实现细节

C语言的函数虽然不具备C++的多态性,但也可以接受参数不确定的情况,当然,C语言中的变参函数实际在功能上是受限的,废话不多讲,下面来看看变参函数的边边角角的问题。 讨论之前我们来看一下最熟悉的变参函数printf的原型声明:int printf(const char *format,  ...);注意到,在函数中声明其参数是可变的方法是三个点“...”,但同时,这个

2010-01-06 15:30:00 925 2

原创 目标文件里装了什么东西

了解程序中各种变量在编译和运行阶段的状态和属性,对我们开发程序而言是非常有益的,通过对以下几个例子的探讨,搞清楚目标文件中都包含了哪些信息,能让我们明白C语言中各种存储类对程序的影响,也让我们在编写一个程序的时候胸有成竹。就像那个谁说的,真正的程序员,必须对自己程序的每一个字节了如指掌。 我们看看如下这个程序代码: /* simple_section.c */ int

2009-11-20 19:57:00 703

原创 一道试题引发的血案

 某日,看到一道比较恶心的C语言的试题,考了很多比较绕的知识点,嘴脸如下: int main(void){    int a[4] = {1, 2, 3, 4};    int *ptr1=(int *)(&a+1);    int *ptr2=(int *)((int)a+1);    printf("%x, %x/n", ptr1[-1], *ptr2);

2009-11-03 22:40:00 3016 19

原创 字符界面编程利器——vim + ctag + Taglist

习惯了在windows下用sourceInsight编程的人,当然也希望在linux的字符终端下也能有一样酷的软件,这里要介绍给大家的是如题所示的三款软件:vim , ctag 和Taglist 。 很多时候我们需要在多个源程序之间实现函数、宏定义、外部变量等的跳转查询,甚至有时候需要到内核或库源代码里窥视他们真面目,我们也需要有列出程序内部所使用的各个函数、变量、

2009-10-23 15:08:00 6567 6

原创 C语言**位运算**终极剖析

C语言有时候被称为中级语言,即介于低级与高级之家的编程语言,原因是C语言不仅具有高级语言抽象机制,也具有低级语言直接操作变量个别位的能力,即我们即将要讨论的C语言强大的位操作运算。C语言的这种能力也许会让你感到奇怪,但这种能力有时确实是必须的,或者至少是有用的,例如我们通常向硬件设备发送一两个字节来控制该设备,其中的每一位都有特定的含义。许多压缩和加密操作都对单独的位进行操作。高级

2009-10-21 16:24:00 1963 1

原创 类型转换

类型转换是C语言中常识性的知识点,但不注意又会有让人迷惑的时候,来看一道笔试题:以下两个程序片段A和B,问那个for循环能运行?A:unsigned short i;unsigned short index=0;for(i = 0; i <index-1; i++){   ... ...}B:unsigned short i;

2009-10-19 19:33:00 1475 2

原创 IO编程 之 缓冲篇

涉及linux中IO编程的时候,我们总是不可避免地要跟各种各样的缓冲机制打交道,学好linux IO编程不是简单地掌握几个函数的用法就万事大吉,正确地运用IO需要对其缓冲机制全面的理解,切不可依葫芦画瓢,蒙混过关。 切入正题之前,我们先看一个简单的程序: #include #include #include #define BUFSIZE 5*1024intmain(vo

2009-09-27 01:52:00 847 1

原创 vim编码

Vim和所有的流行文本编辑器一样,可以很好的编辑各种字符编码的文件,这当然包括 UCS-2、UTF-8 等流行的 Unicode 编码方式。而且和很多来自 Linux 世界的软件一样,这需要你自己动手设置。Vim 有四个跟字符编码方式有关的选项,encoding、fileencoding、fileencodings、termencoding (这些选项可能的取值请参考 Vi

2009-09-22 09:59:00 862

原创 UNIX缓冲机制

某日一朋友写了一个HELLO WORLD代码,出不来结果,代码如下:#include int main(int argc, char **argv){     printf("hello world!");     _Exit(0); } 注意到,在代码中printf语句打印的字符串最后没有带换行符,而且最后调用了_Exit函数,这导致了在终端屏幕上显

2009-08-31 20:21:00 1522 2

原创 解剖关键字typedef

带你解剖typedef之前,让我们先来看看POSIX.1中对信号处理函数signal的原型说明:void (*signal(int sig, void (*func)(int)))(int); 对于不熟悉C语言声明的朋友,看到这样的函数原型估计离崩溃不远了,我们再来看看ANSI C中对此函数原型是作如何解释的:typedef void (*sighandler_t)

2009-08-28 23:09:00 1226 6

原创 UNIX文件权限探讨

关于unix系统中涉及权限的问题探讨,跟大家分享下首先要明白一个关键点----权限分为两种:第一种是用ls -l命令显示出来的文件性质的权限,比如 -rw-r--r-- foo foo file,这里的读写权限是该文件本身的性质,表示该文件本身属于foo用户,属于foo组。第二种是进程性质的权限,比如 -rwsr--r-- bar b

2009-08-27 16:10:00 953 1

usb转串口驱动。。。。。。。。。

usb转串口驱动,很好用的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2010-08-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除