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,
相关文档:
配置Linux wget,yum 使用代理访问网络。
如果你的linux主机需要通过代理服务器才能访问外部网络。可以通过如下方式实现。
1.wget
需要在当前用户的目录下创建一个".wgetrc"文件
[root@linux ~]#vi .wgetrc
http-proxy = 10.1.18.34:3128
ftp-proxy = 10.1.18.34:3128
分别表示http的代理服务器和ftp的代理服务器。如 ......
信号本质
信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程 ......
在Linux下面去压缩文件或者目录。我们将学习zip, tar, tar.gz和tar.bz2等压缩格式的基本用法。
zip格式已成为压缩文件的标准选择,而且它在windows上也能使用。
经常用zip格式压缩那些需要共享给windows用户的文件。
如果只是共享给linux用户或者Mac用户,偏向于选择tar.gz格式。
ZIP
zip可能是目前使用得最多的文档压 ......
3. 指针与数组的比较
不同点:
数组:要么在惊天存储区域被创建(如全局数组),要么在栈上被创建。数组名对应着(而不是指向)一块内存,其地址与容量在生命周期内保持不变,只有数组的内容可以改变。
指针:可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用 ......
目标:
了解linux应用程序的组成部分
掌握使用RPM工具管理软件包的方法
掌握应用程序源代码包的编译安装方法
掌握图形界面下应用程序管理工具的使用
1、L ......