Linux内核与用户空间通信的方式目前主要有9种,分别是内核启动参数、模块参数与 sysfs、sysctl、系统调用、netlink、procfs、seq_file、debugfs和relayfs。Netlink是一种特殊的文件描述符(套结字),为2.6.14及更高版本的Linux所特有,是一种在内核与用户应用间进行双向数据交互的便捷方式,用户态应用调用标准的套结字API 就可以使用netlink提供的强大功能,内核态需要调用专门的内核 API 来使用netlink。Netlink应用已经相当广泛,例如,Linux系统的网络防火墙分为内核态的netfilter和用户态的iptables,netfilter与iptables的数据交换就是通过Netlink机制来完成。
阅读全文
使用select函数也才一年多时间,也许对select的理解还不是很深刻,所以不敢称详解,我只能简单的描述一下自己对select函数功能的理解和调用方式,我想这些对于初次使用select函数的人来说够用了,如有说得不恰当的地方,还请大家批评指正。
首先我们需要解答一些疑惑。为什么要使用select函数?
比如你有一个服务器程序,维护着N多个TCP连接,你如何去判断这些TCP连接上有数据传送过来了呢?最傻瓜的办法就是隔一定时间去循环读一次所有TCP连接对应的文件描述符,如果read返回正值则说明有数据过来。这样做未免也太傻瓜太浪费CPU了一点,无法做到及时的检测到结果,还好,select函数可以帮我们自动检测指定的文件描述符是否有数据可读,即已经建立好的连接那端有新的数据过来或者有新的尚未建立好的连接请求过来。 阅读全文
1、函数体外定义的未初始化的变量初始值皆为0,函数体内定义的初始化的变量初始值不定。
2、extern声明不是定义,也不分配存储空间,它只是说明常量定义在程序的其他地方。程序中变量可以声明多次,但只能定义一次。
3、只有在函数外部时,extern int week = 7 才能编译通过,因为只有全局常变量才能在其他地方所引用。
4、C++程序中每个名字都与唯一的实体(比如变量、函数和类型等)相关联,名字的唯一性在一定的范围内保证,而这一范围就叫作用域。通常作用域分为三种,全局作用域、局部作用域和语句作用域,其实还有更广义的类作用域和命名空间作用域。
5、作用域可以嵌套,即局部作用域内定义的变量会覆盖全局作用域内定义的同名变量,但通常不鼓励这样重名定义。
1.1 头文件的结构
头文件由三部分内容组成:
(1)头文件开头处的版权和版本声明
(2)预处理块。
(3)函数和类结构声明等。
一些规则与建议:
【规则1】为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块。
【规则2】用 #include <filename.h> 格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则3】用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【建议1】头文件中只存放“声明”而不存放“定义”在C++ 语法中,类的成员函数可以在声明的同时被定义,并且自动成为内联函数。这虽然会带来书写上的方便,但却造成了风格不一致,弊大于利。建议将成员函数的定义与声明分开,不论该函数体有多么小。
【建议2】不提倡使用全局变量,尽量不要在头文件中出现象extern int value 这类声明。
阅读全文