Linux内核编码拾锦
1.一种定义函数指针的方法
<linux/proc_fs.h>
typedef int (read_proc_t)(char *page, char **start, off_t offset, int count, int *eof, void *data);
read_proc_t *proc_read;
这种定义方法有一个优势就是,即使你没有看到read_proc_t的定义,也能够清楚的知道proc_read是一个指针,如下面2中的的create_proc_read_entry中的参数中显示的那样。另一种常用方法是:
typedef int (*read_proc_t)(....);定义函数指针。
read_proc_t p;
但是这种方法没有上面那种可读性好,因为不能一眼就看出p是一个函数指针。
2.一种定义宏的方法
<linux/proc_fs.h>
static inline struct proc_dir_entry *create_proc_read_entry(const char *name, mode_t mode,
struct proc_dir_entry *base, read_proc_t *read_proc, void *data);
inline关键字是GNU C扩展的,专门为设计内核而扩展的,它能够将函数编译成宏,如果它是函数,那么由于有static关键字修饰,显然你不能在本文件之外定义及使用它。
3.枚举变量的数量
<linux/interrupt.h>
enum{
HI_SOFTIRQ,
TIMER_SOFTIRQ,
...
...
NR_SOFTIRQS,
};
这个枚举定义了软中断类型,最后一个NR_SOFTIRQS理所当然的表示了枚举类型的最大值。
4.联合和结构的嵌套
<linux/mm_types.h>
struct page{
unsigned long flags;
union {
atomic_t _mapcount;
struct {
u16 inuse;
u16 objects;
};
};
}
结构page中的成员怎样访问呢?初始化怎样初始化呢?含有匿名的联合和结构。测试以后可以发现最内层的成员还是当成第一层来访问,但是不能这样初始化。如有
struct page p;
p.flags=1;
atomic_set(&p._mapcount,1);
p.inuse=1;
p.objects=1;
而不能如下这样初始化
struct page p={
.flags=1,
.inuse=1,
相关文档:
c++库文件中的符号的含义:
所有的符号都是以下划线加上大写字母也就是"_Z"开头,对于在 类里或者命名空间中的符号,后面紧跟"N",然后是各个命名空间和类的名字,每个名字前是名字字符串的长度,随后是大写字母"E",对于一个函数,他的参数列表都在E后面, ......
php 通用的调用 so的方法是使用dl()函数,但是在php5.3之后不再支持这种方法,仅支持静态调用,使用dl() 动态调用的方法见:
引用页1: http://tech.idv2.com/2007/07/06/use-local-so-in-php/
感谢原作者提供的清晰明了的方法,但是我在5.3.1版本i中没有通过,于是我找到了页面:
  ......
3. 指针与数组的比较
不同点:
数组:要么在惊天存储区域被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命周期内保持不变,只有数组的内容可以改变。
指针:可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用 ......
一:Linux多线程编程:
线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的Unix也支持线程的概念,但是在一个进程(process)中只允许有一个线程,这样多线程就意味着多进程。现在,多线程技术已经被许 ......