
C/C++
刘军卫
linux爱好者,主要致力于虚拟化云计算方面的研究,尤其专注于openstack,kvm,linux kernel等源码和架构的研究
微博:Marshal-Liu
展开
-
C++关键字static、const和volatile的几点说明
1 static关键字 首先他表示定义的变量是静态的,在静态存储区分配内存空间,c++里面主要有三种用法 (1)在函数外用static关键字 static int var = 0; int var2 = 0; int main() { var++; var2原创 2009-03-20 18:56:00 · 1457 阅读 · 0 评论 -
什么是Big Endian和Little Endian?
<br />什么是Big Endian和Little Endian?<br />我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。<br />2.什么是Big Endian和Little Endian?<br />在设计计算机系统的时候,有两种处理内存中数据的方法。一种叫为little-endian,存放在内存中最低位的数值是来自数据的最右边部分(也就是数据的最低位部分)。比如一个16进制数字0x12345678,在内存存放的方式如下:<br转载 2010-09-02 20:01:00 · 4042 阅读 · 0 评论 -
configure: error: GRUB requires a working absolute objcopy; upgrade your binutils 解决方法
编译grub-0.97时,执行configure后,出现如下错误: configure: error: GRUB requires a working absolute objcopy; upgrade your binutils 错误提示upgra原创 2011-10-16 16:14:41 · 4501 阅读 · 3 评论 -
fcntl设置FD_CLOEXEC标志作用
通过fcntl设置FD_CLOEXEC标志有什么用?close on exec, not on-fork, 意为如果对描述符设置了FD_CLOEXEC,使用execl执行的程序里,此描述符被关闭,不能再使用它,但是在使用fork调用的子进程中,此描述符并不关闭,仍可使用。eg:jamie@jamie-laptop:~$ cat test.c#include #include原创 2011-11-02 22:11:05 · 40394 阅读 · 2 评论 -
系统调用和c库之间的关系
Tips: 用man查询函数时候有些并不能直接man + 函数名查到,例如:man fopen man 2 open所以可以用man+数字+函数名来试试,具体的内容可以查看 /usr/local/share/man/下面对应的目录___________________________________________________________________________原创 2011-11-03 22:27:29 · 9560 阅读 · 1 评论 -
linux编程之定时器
创建一个定时器:int timer_create(clockid_t clock_id, struct sigevent *evp, timer_t *timerid) 进程可以通过调用timer_create()创建特定的定时器,定时器是每个进程自己的,不是在fork时继承的。clock_id说明定时器是基于哪个时钟的,*timerid装载的是被创建的定时器的ID。该函数创原创 2011-11-06 21:29:00 · 2270 阅读 · 0 评论 -
linux编程之mprotect
mprotect: 设置内存访问权限mmap 的第三个参数指定对内存区域的保护,由标记读、写、执行权限的 PROT_READ、PROT_WRITE 和 PROT_EXEC 按位与操作获得,或者是限制没有访问权限的 PROT_NONE。如果程序尝试在不允许这些权限的本地内存上操作,它将被 SIGSEGV 信号(Segmentation fault,段错误)终止。在内存映射完成后,这些权限仍可原创 2011-11-06 22:46:12 · 22188 阅读 · 1 评论 -
Makefile常用函数总结
在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具 有智能。make所支持的函数也不算很多,不过已经足够我们的操作了。函数调用后,函 数的返回值可以当做变量来使用。 一、函数的调用语法函数调用,很像变量的使用,也是以“$”来标识的,其语法如下:$( ) 或是${ } 这里,就是函数名,make支持的函数不多。是函数的参数,参原创 2011-11-12 18:00:35 · 54224 阅读 · 4 评论 -
qemu源码分析之Makefile
通过分析qemu的Makefile可以了解qemu代码的组织方式以及qemu功能模块的划分,一方面,有助于理解qemu源代码设计思路,另一方面,有助于根据需求裁剪qemu代码,生成精简的符合制定要求的qemu。 为了更好的理解qemu的Makefile的设计,对于不熟悉makefile语法规则的同学建议阅读下面两篇文章: 1. 《Makefile常用函数分析》 2.原创 2011-11-12 18:06:57 · 6871 阅读 · 0 评论 -
位置无关代码(PIC)的思考
应用程序必须经过编译、汇编和链接后才变成可执行文件,在链接时,要对所有目标文件进行重定位(relocation),建立符号引用规则,同时为变量、函数等分配运行地址。当程序执行时,系统必须把代码加载到链接时所指定的地址空间,以保证程序在执行过程中对变量、函数等符号的正确引用,使程序正常运行。在具有操作系统的系统中,重定位过程由操作系统自动完成。 在设计Bootloader程序时,必须在裸机环境中进原创 2011-11-13 11:49:46 · 15198 阅读 · 1 评论 -
elf转化成bin后,bin文件变大的问题
在上一篇文章《位置无关代码(PIC)的思考》中提到,在elf文件转化成bin文件的过程中,输出段与段之间如果有空隙的话,objcopy会用0来填充段与段之间的空隙,也可以通过objcopy的选项--gap-fill= val来制定填充值的内容为val,这将会导致bin文件比elf文件大很多的问题,在很多嵌入式设备上将是无法接受的,因为嵌入式设备通常会将程序转化成bin烧写到FLASH中,这样做的目原创 2011-11-13 16:22:00 · 10769 阅读 · 4 评论 -
c实现的扫描线算法
今天突然发现自己csdn的草稿箱中有几篇以前写过的文章,发出来与大家分享!/* * ===================================================================================== * * Filename: FillPolygon.c * * Description:原创 2012-03-13 19:19:44 · 2751 阅读 · 0 评论 -
两个函数声明的理解
1 当今计算机启动时,硬件会去调用地址为0的函数,用c语言模拟这个过程,应该如何声明这个函数?调用某个函数,c语言中一般会利用指向函数的指针,即如下形式: void (*f)(void);上面的表达式的意思是, f是指向函数的指针,指向的函数的形式是: 参数是void类型的,返回值也是void类型的。这个很好理解,通常我们根据运算符的优先级来理解,首先*f是个指针,其次*f()表明这个指针指向一个函数。原创 2010-07-08 19:49:00 · 1616 阅读 · 0 评论 -
百度面试题
百度面试题,仅提供一些参考。 1 完成函数size_t foo(unsigned int *a1, size_t al1, unsigned int* a2, size_t al2)其中a1和a2都为无符号数组,al1和al2为数组的长度,数组的长度为偶数。无符号数组由一对数字区间组成。如下例:a1 为 0,1,3,6,10,20a2 为 0,1,20,50,4原创 2010-04-05 10:55:00 · 2900 阅读 · 1 评论 -
虚函数详细解析
虚函数联系到多态,多态联系到继承。所以本文中都是在继承层次上做文章。没了继承,什么都没得谈。 下面是对C++的虚函数这玩意儿的理解。 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism),多态性是将接口与实现进行原创 2009-03-26 15:57:00 · 1357 阅读 · 0 评论 -
C++学习--使用类(1)
1 操作符重载 operator op(argument-list) eg operator +(argument)注意: (1)重载的操作符不能违反操作符原来的语法规则,例如不能将%,重载成之使用一个操作符 (2) 不能重新定义新的操作符 (3)不能重载下面的操作符:sizeof . :原创 2009-03-31 18:31:00 · 1064 阅读 · 0 评论 -
c++ 学习 -- 复制构造函数
复制构造函数是个非常微妙的函数,如果不能深刻理解它,可是会出现很多莫名奇妙的错误,下面通过一个程序来详细的介绍其中的奥妙。 1 c++中的隐士成员函数 (1)默认构造函数,如果没有定义 (2)复制构造函数,如果没有定义 (3)赋值操作符,如果没有定义 (4)默认析构函数,如果没有定义原创 2009-03-31 22:04:00 · 1227 阅读 · 0 评论 -
c++ 友元模板类的定义
友元概念就不罗嗦了,使用也简单,就两种形式:1.友元函数:friend ret-type classname::funname(....);2.友元类:friend class classname;唯一要注意的就是不管是友元函数还是友元类,定义友元关系前必须先声明友元类其实还是有些故事要说的,一旦类继承起来友元关系还是有些小复杂的,下面简单说明:C中声明A是其友元类,那么最基本的就是A可以使用C中原创 2009-04-12 16:59:00 · 5884 阅读 · 2 评论 -
c++ 学习---类的设计总结
1 编译器生成的成员函数(1)默认构造函数 这个不做详细的介绍,相信的大家已经很了解了。(2)复制构造函数 className(const className &);在下述情况下将使用复制构造函数 a)将新的对象初始化为一个同类的对象 b)按值就对象传递给参数 c)函数按值返回对象 d)编译器生成临时对象 (3)复制操作符 c原创 2009-04-01 14:19:00 · 1081 阅读 · 0 评论 -
c++ 模板实现 -- 直接插入排序和归并排序
刚刚学习c++模板,试着写了几个程序:#include using namespace std;template class Sort{ private: int length; T * array; public: Sort(int size); void initArray(); void dispArray(); void insertSort(); void mergeS原创 2009-04-07 12:37:00 · 1669 阅读 · 0 评论 -
递归函数应用举例(集合元素的全排列)
#include using namespace std;int count;int sum(int *array,int n){ if(n==0) return 0; else return (sum(array,n-1)+array[n-1]);}void initSum(){ int array[20]; int sum1 = 0; for(int i=0;i { array[原创 2009-04-09 20:21:00 · 1893 阅读 · 0 评论 -
getline(cin,str) 函数分析
运行环境vc6! 先来看这段代码:string fileName;coutcin>>fileName;string name;ofstream fcout(fileName.c_str(),ios::out|ios::app);while(getline(cin,name)&&name.size()>0) { cout fcout } 当你输入:xxxxx 时,原创 2009-04-09 10:59:00 · 2529 阅读 · 0 评论 -
由signal谈起--typedef 指向函数的指针
由signal谈起--typedef 指向函数的指针 在学习《unix环境高级编程》信号的时候,我们会遇到一个比较复杂的函数,signal函数:void (*signal(int signo,void (*func)(int)))(int)单纯看这个函数还是比较容易理解的,即函数名,*signal(int signo,void (*func)(int))书中采用typed原创 2009-09-05 21:32:00 · 1878 阅读 · 1 评论 -
C++ 容易忽略的输入输出特性
1 cin cout cin.get() cin.get(ch)的返回值(1)cin ,cout 就不用多说了还是返回一个iostream对象,因此它们可以这么使用。cin >> var1 >> var2 >>var3;cout cin.get() 没有参数时,返回值是一个整数,所以通常这么用while((ch=cin.get()) != EOF){ c原创 2009-12-25 22:01:00 · 1733 阅读 · 0 评论 -
C++ 容易忽略的数据类型
1 超出数据类型指定长度的赋值(1)无符号数据类型unsigned char ch1= 336;unsigned char ch2 = -1;上面两个赋值都超出了unsigned char 类型的范围,大部分的编译器对这种情况是这么处理的:允许赋值,仅仅给出一个警告,但是是经过modulo之后的值。cout(2) 对于有符号的书来说,要根据具体的编译器来定。2 浮点型的原创 2009-12-27 21:38:00 · 1060 阅读 · 0 评论 -
C++ 容易忽略的细节
1 超出数据类型指定长度的赋值(1)无符号数据类型unsigned char ch1= 336;unsigned char ch2 = -1;上面两个赋值都超出了unsigned char 类型的范围,大部分的编译器对这种情况是这么处理的:允许赋值,仅仅给出一个警告,但是是经过modulo之后的值。cout(2) 对于有符号的书来说,要根据具体的编译器来定。2 浮点型的原创 2009-12-28 21:17:00 · 1315 阅读 · 0 评论 -
SPARC寄存器窗口上溢(overflow)和下溢分析(underflow)
今天在复习sparc体系结构的相关知识时,发现自己对寄存器窗口的上溢和下溢处理代码有点理不清了,特此记录一下,SPARC体系结构相关知识参见《http://www.sics.se/~psm/sparcstack.html》一文,这里仅分析上溢和下溢的处理函数。1 上溢陷阱(Overflow Trap)处理函数/* a SAVE instruction caused原创 2012-05-12 10:17:40 · 3519 阅读 · 2 评论