摘要: 转自:http://hellogcc.blogbus.com/logs/71170939.html在以前,如果在GDB中想调试多进程的程序,需要在fork以前“set follow-fork-mode parent|child”来确定fork后是调试父进程还是调试子进程,而另一个进程在fork就会被detach。而在GDB 7.1之后你只要用"set detach-on-fork off"关掉fork之后的detach就可以很方便的同时调试2个进程。同时GDB现在还可以支持同时调试多个程序(符号信息不同的几个进程)。首先进行一个名词解释inferior,GDB将每个被调试程 阅读全文
posted @ 2013-04-12 20:05 在于思考 阅读(2362) 评论(0) 推荐(0) 编辑
摘要: 我实现的文件监控主要是对某个文件夹里所有的文件检测是否修改、是否有新建文件、是否有文件被删除,并把这些改变记录到文件中。开始想用链表存储文件信息,毕竟链表删除方便,但链表的查找效率不高,所以打算用红黑树实现,因为红黑树查找和删除的操作都是比较快的。 基本思路是这样的:对于指定的文件夹,首先调用一个扫描函数,扫描指定文件夹里的所有文件和文件夹,当遇到一个文件或文件夹时,用文件名作为关键字在红黑树中查找该文件,如果不存在,就把文件名作为关键字,将文件路径,文件修改时间,标记等信息存入一个结点插入到红黑树中,将标记设置为新插入,如果存在,由于找到的结点会有多个(同名文件),所以要比较所有找到结... 阅读全文
posted @ 2013-04-10 09:42 在于思考 阅读(1773) 评论(3) 推荐(1) 编辑
摘要: 红黑树的定义和插入在红黑树的实现(一)中已经描述和实现了,下面说一下红黑树的删除。 红黑树的删除也包括两个步骤: 1.删除结点 2.调整树满足红黑树的定义 首先是删除一个结点,同样可以按二叉排序树的删除结点来删除。删除结点又分为4中情况: (1)删除结点没有左孩子,有右孩子 (2)删除结点没有右孩子,有左孩子 (3)删除结点为叶子结点 (4)删除结点既有左孩子又有右孩子 对于情况(1),可以直接用右孩子代替删除的结点,并且由于删除结点有右孩子,所以删除结点必定为黑色,右孩子必定为红色(假设删除结点为红色,右孩子必定为黑色,这样是违反红黑树定义4的,所以删除结点必定为黑色,... 阅读全文
posted @ 2013-04-09 20:20 在于思考 阅读(1195) 评论(0) 推荐(1) 编辑
摘要: 由于看个东西,发现要用到红黑树,所以拿算法导论看了下红黑树的定义和实现,第一遍看发现红黑树挺复杂的,第二遍再看发现好了点,第三遍又好点。。。n遍之后终于有点理解了。最后打算自己实现这个红黑树,也能更好的理解它。1 红黑色定义 首先红黑树的定义是非常重要的,它的定义如下: 1.一个结点要么是黑色,要么是红色,只能是其中的一种。 2.树的根结点一定是黑色。 3.如果一个结点为红色,那么它的孩子结点必定为黑色。 4.从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点。 正是有了这个定义,使得红黑树保持了良好的性质,如树的高度不会超过2lgn,所以对某个关键字的查找时间为o(... 阅读全文
posted @ 2013-04-09 17:00 在于思考 阅读(1647) 评论(4) 推荐(1) 编辑
摘要: GDB的使用当程序出错并产生core时快速定位出错函数的办法gdb程序名core文件名(一般是core,也可能是core.xxxx)调试程序使用的键rrun运行.程序还没有运行前使用ccuntinue继续运行。运行中断后继续运行q 退出kill终止调试的程序hhelp帮助<tab>;命令补全功能step跟入函数next不跟入函数bbreakpoint设置断点。用法:b函数名对此函数进行中断b文件名:行号对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略看当前断点数使用infobreak.禁止断点disable断点号.删除delete断点号.list列出代码行。一次列10 阅读全文
posted @ 2013-04-07 19:13 在于思考 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 1 红黑树的定义 (1)每个节点或者为黑色,或者为红色。 (2)根必须为黑色。 (3)每个叶子节点(不包含关键字的节点)都是黑色。 (4)如果有一个节点是红色,那么它的两个儿子都是黑色。 (5)对于每个节点,从该节点出发到其子孙节点的所有路径上包含相同数目的黑节点。 满足上面5个条件的树就是一颗红黑树,红黑树有着很好的性质,它类似于平衡二叉树(AVL)。一颗红黑树的高度不会超过2lg(n+1),而且插入和删除操作较AVL更快,由于它分别最多做2次和3次旋转来维护树的性质,所以在linux内核中大量使用了红黑树,如ext3文件系统中使用红黑色来记录目录项,虚拟内存区也是使用它来记录的... 阅读全文
posted @ 2013-04-06 11:05 在于思考 阅读(6221) 评论(0) 推荐(4) 编辑
摘要: 1 Makefile编写ifneq ($(KERNELRELEASE),)obj-m := mytest.omytest-objs := file1.o file2.o file3.oelseKDIR := /lib/modules/$(shell uname -r)/buildPWD := $(shell pwd)default: $(MAKE) -C $(KDIR) M=$(PWD) modules//到linux源码所在的目录执行主Makefile 并当前路径传给主Makefile,告诉主Makefile执行完后返回到当前目录,执行Makefileendif解释为:KERNELRELE. 阅读全文
posted @ 2013-04-05 19:10 在于思考 阅读(1516) 评论(0) 推荐(0) 编辑
摘要: 1 静态变量1.1 全局静态变量 在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。 (1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在) (2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化) (3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。 好处: 定义全局静态变量的好处: <1>不会被其他文件所访问,修改 <2>其他文件中可以使用相同名字的变量,不会发生冲突。1.2 局部静态变量 在局部变量之前加上关键字static,局部变量就被定 阅读全文
posted @ 2013-04-05 11:17 在于思考 阅读(659) 评论(1) 推荐(0) 编辑
摘要: EXPORT_SYMBOL只出现在2.6内核中,在2.4内核默认的非static 函数和变量都会自动导入到kernel 空间的, 都不用EXPORT_SYMBOL() 做标记的。2.6就必须用EXPORT_SYMBOL() 来导出来(因为2.6默认不到处所有的符号)。1、EXPORT_SYMBOL的作用是什么?EXPORT_SYMBOL标签内定义的函数或者符号对全部内核代码公开,不用修改内核代码就可以在您的内核模块中直接调用,即使用EXPORT_SYMBOL可以将一个函数以符号的方式导出给其他模块使用。这里要和System.map做一下对比:System.map 中的是连接时的函数地址。连接完 阅读全文
posted @ 2013-04-05 09:43 在于思考 阅读(1771) 评论(0) 推荐(0) 编辑
摘要: (1)引用总是指向一个对象,没有所谓的 null reference .所有当有可能指向一个对象也由可能不指向对象则必须使用 指针.由于C++ 要求 reference 总是指向一个对象所以 reference要求有初值.String & rs = string1;由于没有所谓的 null reference 所以所以在使用前不需要进行测试其是否有值.,而使用指针则需要测试其的有效性.(2)指针可以被重新赋值而reference则总是指向最初或地的对象.(3)必须使用reference的场合. Operator[] 操作符 由于该操作符很特别地必须返回 [能够被当做assignment 阅读全文
posted @ 2013-04-04 21:32 在于思考 阅读(174) 评论(0) 推荐(0) 编辑