摘要:
写了一个小程序,测试了一下vector是如何分配内存的: Code: Select all#include <iostream>#include <vector>#include <string>using namespace std;int main(){ vector<string> vec1; cout << "Vector size is: " << vec1.size() << ", capacity is: " << vec1.capacity() 阅读全文
posted @ 2011-03-26 10:26
super119
阅读(266)
评论(0)
推荐(0)
摘要:
第八章有个例子,非常简单,就是读入用户输入,赋给一个int,这里面有一个判断,就是如果用户输入的不是int,那么,cin就会变成invalid,里面就有condition state,于是我们可以catch这个state并clear,然后继续读入。 但是书上给的例子有个错误,原来的程序是这样的: Code: Select all#include <iostream>#include <stdexcept>using namespace std;int main(int argc, char **argv){ int ival; // cout << &quo 阅读全文
posted @ 2011-03-26 10:26
super119
阅读(294)
评论(0)
推荐(0)
摘要:
区别很简单,看这两个函数的man手册就能看的出来。简单来说,memmove是把一堆byte从src移到dst,memcpy是把一堆byte从 src拷贝到dst,最大不同的是:memmove是先把一堆byte拷贝到一个临时的array中,然后再把这个临时的array写到dst中去;而 memcpy没有这个逻辑,直接就是从src一个一个字节的读,同时往dst一个一个字节的写。这样就导致了一个最根本的不同: memcpy不适合或者说不能处理src和dst两块内存有重叠(overlap)的情况。因为memcpy是直接从src拷贝,然后往dst中写,这样,如果src和dst两块内存有重叠,这样就会导致 阅读全文
posted @ 2011-03-26 10:25
super119
阅读(646)
评论(1)
推荐(0)
摘要:
在看lftp的源代码的时候,看到了程序的一开头有这样几句代码: setlocale (LC_ALL, ""); setlocale (LC_NUMERIC, "C"); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); 注:PACKAGE, LOCALEDIR都是宏,在autoconf的时候自动生成,PACKAGE宏就是lftp, LOCALEDIR就是/usr/share/locale 不明白有什么用,于是查了一下资料,写了一个测试程序,搞明白了。 setlocale是用来设置程序的l 阅读全文
posted @ 2011-03-26 10:25
super119
阅读(1129)
评论(0)
推荐(0)
摘要:
在看lftp的源代码的时候,发现这么一行: operator bool() const { return ... } 一下子没想起来,这是什么语法,是operator overload么?不像阿,怎么不以函数的返回值打头呢?后来一查C++ Primer,明白了,这是convert operator,也就是将这个类如果要转化成bool值的话,就会调用到这个函数。convert operator以operator关键字打头,紧跟类型,然后是两个括号(括号中不能带有参数)。更具体的看C++ Primer和上面的注释。 不过看明白了之后有个问题: operator int() const { .... 阅读全文
posted @ 2011-03-26 10:24
super119
阅读(420)
评论(0)
推荐(0)
摘要:
来自interview的一个考题,所以写了一个测试程序来demonstrate一下。 func是一个函数指针,该函数返回值是int,没有输入参数;然后主程序中声明了一个函数指针myFuncPointer,该函数指针代表的函 数输入参数是一个int,返回值也是一个函数指针,类型就是func类型的。所以我们可以把func2这个函数赋给myFuncPointer这个指针。 interview的题目要的就是myFuncPointer这个指针的声明。 #include<stdio.h>typedefint(*func)();intfunc3(){printf("Infunction 阅读全文
posted @ 2011-03-26 10:23
super119
阅读(1044)
评论(0)
推荐(0)
摘要:
1.classA{public:A(){func(0);};virtualvoidfunc(intdata){printf("A1:%d\n",data);}virtualvoidfunc(intdata)const{printf("A2:%d\n",data);}voidfunc(char*str){printf("A3:(%s)\n",str);}};classB:publicA{public:voidfunc(){printf("B1:%s\n","");}voidfunc(intdata 阅读全文
posted @ 2011-03-26 10:22
super119
阅读(567)
评论(0)
推荐(0)
摘要:
在gstreamer的源码中,看到了GST_BOILERPLATE_FULL宏的定义,原来在这个宏中就定义着_base_init, _init, _class_init这些函数的原型,难怪我们的源码中不需要定义这些函数原型呢,而且这个宏中最重要的就是可以说明我们的plugin是继承自哪个 class的(看GObject的相关内容),而且这个宏最重要的就是调用了gst_type_register_static_full函数,将 _base_init, _init, interface等等这些内容全部注册进了gstreamer。 OK,在这个宏的定义部分,就看到了##这样的代码,这是什么意思?这其 阅读全文
posted @ 2011-03-26 10:21
super119
阅读(618)
评论(0)
推荐(0)
摘要:
printf, g_message这些函数中,使用 %lld 就可以打印一个unsigned long long了,glib中的guint64就是unsigned long long。这是GNU编译器支持的。在微软的编译器中,使用%lld, %I64都可以。 阅读全文
posted @ 2011-03-26 10:20
super119
阅读(22888)
评论(1)
推荐(1)
摘要:
rtspplayer这个程序在手机上运行的时候,要使用fbsink来作为video sink组件。这是使用了framebuffer的一个video sink组件。所以在代码中,很自然只需要在gst_element_factory_make的时候将xvimagesink换成fbsink就可以 了。但是程序在scratchbox中编译了之后,传到了手机上,运行却发生错误,报告说: No such element ...... `fbsink' 奇怪的是在手机上使用alp-gst-inspect|grep "fbsink"却能查到这个element。后来才知道,fbsin 阅读全文
posted @ 2011-03-26 10:19
super119
阅读(1542)
评论(0)
推荐(0)
摘要:
共享库的初始化和~初始化函数分析 转载时请注明出处:http://blog.csdn.net/absurd/ Win32下可以通过DllMain来初始化和~初始化动态库,而Linux下则没有与之完全对应的函数,但可以通过一些方法模拟它的部分功能。有人会说,很简单,实现_init/_fini两个函数就行了。好,我们来看看事实是不是这样的。 很多资料上都说可以利用_init/_fini来实现,而我从来没有测试成功过,原因是这两个函数都已经被gcc占用了。比如: test.c Code: Select all#include <stdio.h> void _init(void){ pri 阅读全文
posted @ 2011-03-26 10:18
super119
阅读(1632)
评论(0)
推荐(0)
摘要:
diff -u -d xxx xxx 即可 可以再加-r,这样就可以直接针对两个目录做diff比较,也就是diff -u -d -r <dir A> <dir B> 阅读全文
posted @ 2011-03-26 10:18
super119
阅读(317)
评论(0)
推荐(0)
摘要:
RTM: inet_aton() doesn't appear to support IPv6, inet_pton does. The parameter lists are different. The return values are different. inet_pton() requires a four part dot notation and inet_aton can process some other presentation formats. Don't be surprised that you will encounter similar and 阅读全文
posted @ 2011-03-26 10:17
super119
阅读(1524)
评论(0)
推荐(0)
摘要:
How to generate coredump file and debug it in gdb 1. ulimit -a 可以查看当前所有的limit 2. ulimit -c用来设置coredump。比如:ulimit -c unlimited,就设置不限制生成的coredump文件的大小。也可以ulimit -c 1024,这样就设置了coredump文件大小不超过1M。 3. 运行程序crash之后,core文件生成。此时: gdb <program> <corefile> 或者直接运行gdb,然后在gdb的命令行中输入:core <corefile&g 阅读全文
posted @ 2011-03-26 10:16
super119
阅读(1276)
评论(0)
推荐(0)
摘要:
性能测试中,Tester程序由start.sh脚本来启动。现在的需求是:用户按下ctrl-c,程序能graceful退出,从而不用重启板子。问题 是:ctrl-c产生信号SIGINT,但是这个信号是传递给脚本进程的,不是传递给Tester进程的。所以这里就存在一个信号传递的问题。解决办法如 下: 1. 在脚本中加入代码: Code: Select allforward_sigint(){ # check out the tester's pid testerpid=$(cat /tmp/tester.pid) kill -2 $testerpid # call analyser and 阅读全文
posted @ 2011-03-26 10:15
super119
阅读(1037)
评论(0)
推荐(0)
摘要:
ignore SIGCHLD信号的作用 -- 防止僵尸进程的产生 signal(SIGCHLD, SIG_IGR); //忽略SIGCHLD信号,这常用于并发服务器的性能的一个技巧 //因为并发服务器常常fork很多子进程,子进程终结之后需要 //服务器进程去wait清理资源。如果将此信号的处理方式设为 //忽略,可让内核把僵尸子进程转交给init进程去处理,省去了 //大量僵尸进程占用系统资源。(Linux Only) Code: Select allsome code();pid = fork(); //生成一个子进程if (pid < 0) // error check. hand 阅读全文
posted @ 2011-03-26 10:15
super119
阅读(1227)
评论(0)
推荐(0)
摘要:
#include<stdio.h>#include<string.h>intmain(){chara;memset(&a,0xff,1);if(a==0xff)printf("Equal.\n");elseprintf("Notequal.\n");return0;}答案是不相等。可以用gdb来看,a变量在内存中的确是0xff,因为使用memset设置的。但是,由于a的类型是char,最大只能到0x7f,所 以,在做==比较的时候,0xff已经超过了char语义上的限制,所以,相等不成立。如果a是unsigned char 阅读全文
posted @ 2011-03-26 10:10
super119
阅读(1470)
评论(0)
推荐(0)
摘要:
格式: x /nfu <addr>说明x 是 examine 的缩写n表示要显示的内存单元的个数f表示显示方式, 可取如下值x 按十六进制格式显示变量。d 按十进制格式显示变量。u 按十进制格式显示无符号整型。o 按八进制格式显示变量。t 按二进制格式显示变量。a 按十六进制格式显示变量。i 指令地址格式c 按字符格式显示变量。f 按浮点数格式显示变量。u表示一个地址单元的长度b表示单字节,h表示双字节,w表示四字节,g表示八字节Format letters are o(octal), x(hex), d(decimal), u(unsigned decimal),t(binary 阅读全文
posted @ 2011-03-26 10:09
super119
阅读(22552)
评论(0)
推荐(1)
摘要:
1. ld的-static开关加上之后,就可以编译出一个静态链接的程序了。要注意该程序用到的所有的库,都要有相应的.a版本,编译的时候作为一个source file放到命令行中即可。光有库的.so没用,需要重新编译该库,让它生成.a文件。2. 要注意ld的一个特性:当ld查找一个symbol的时候,ld只会往后查找,不会往前查找。比如程序以来两个库A和B,而A库又调用了B库中的函数,那 么编译的时候,在命令行上,A库文件要出现在B库文件的前面。当ld发现A库中某个函数找不到时,他就会往后查找,于是在B库中找到了这个函数,OK。如 果AB两个库互相依赖,那么一般命令行中要写成A B A或B A 阅读全文
posted @ 2011-03-26 10:07
super119
阅读(718)
评论(0)
推荐(0)
摘要:
很多 CPU ,如基于 Alpha, IA-64, MIPS, 和 SuperH 体系的,拒绝读取未对齐数据。当一个程序要求其中之一的 CPU 读取未对齐数据时,这时 CPU 会进入异常处理状态并且通知程序不能继续执行。举个例子,在 ARM, MIPS, 和 SH 硬件平台上,当操作系统被要求存取一个未对齐数据时默认通知应用程序一个异常。对齐性 对齐性是一种内存地址的特性,表现为内存地址模上 2 的幂。例如,内存地址 0x0001103F 模 4 结果为 3 ;这个地址就叫做与 4n + 3 对齐, 4 指出了所选用的 2 的幂的值。内存地址的对齐性取决于所选择的关于 2 的幂值。同样的地址模 阅读全文
posted @ 2011-03-26 10:06
super119
阅读(482)
评论(0)
推荐(0)
摘要:
man fifo to see detail informations.In linux, if an application opened a pipe while another side hasn't opened this pipe, the open will block.You can use `mknod' with S_FIFO attribute to create a FIFO(named pipe), then use open/read/write just as usual. 阅读全文
posted @ 2011-03-26 10:05
super119
阅读(198)
评论(0)
推荐(0)
摘要:
getopt函数可以用来非常方便的处理命令行参数。函数的原型是:int getopt(int argc, char * const argv[], const char *optstring);以下是关键点:1. argc, argv就是main函数的那两个。optstring是我们给出的格式字符串,特别的是格式字符串中的:表示该command option后面是有一个value的,比如:./xtop -n 20 -i 2 1111,在这里optstring就可以写成"n:i:",这表示n和i这两个是command option,而且这两个option后面都需要给value 阅读全文
posted @ 2011-03-26 10:05
super119
阅读(546)
评论(0)
推荐(0)
摘要:
glibc提供了backtrace这个库函数,可以用来打印call stack。这个对于debug非常的有帮助。比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中,利用backtrace打印出call stack,这样debug就非常的方便。backtrace的使用很简单,使用man手册中的Example代码即可,例如:Code: Select all char strbuffer[1024]; int errcode; int btnum = 0; void *btbuf[100]; char **btstrings = N 阅读全文
posted @ 2011-03-26 10:04
super119
阅读(1219)
评论(0)
推荐(0)
摘要:
有时我们需要读取链接文件指向的内容,比如,给定一个进程的fd,我们想知道这个fd具体是什么东西,那么,就可以在/proc/<pid>/fd目录下看到该fd指向的内容,只不过这个目录下该fd是一个链接文件,我们需要的是该文件指向的内容。此时就可以用readlink这个system call,具体用法很简单,比如:Code: Select all char proc_fd_path[255]; char fd_des_buf[255]; ssize_t fd_des_len; /* Get fd descriptions, fd is the input parameter */ sp 阅读全文
posted @ 2011-03-26 10:04
super119
阅读(929)
评论(0)
推荐(0)
摘要:
semaphore很类似windows下的kernel object,一旦创建,可以被多个进程使用,当然一个进程中多个线程也可以使用semaphore来互斥。谈到互斥,一般semaphore的值就是 1。man 7 sem_overview可以看到很多有用的信息,再结合sem_open, sem_wait, sem_post这些函数的man手册,就可以把程序编的七七八八了。Semaphore和pipe一样,也有有名的和无名的两种。无名的嘛,在父子进程间使用比较方便,有名的嘛,在不搭界的多进程中使用很方便。这里贴一段代码,代码最能说明问题,其他都参考manual就OK了。在Fix TI的一个bu 阅读全文
posted @ 2011-03-26 10:03
super119
阅读(2181)
评论(0)
推荐(0)
摘要:
lthough system uses "fork" & "exec" function to replace the whole process address space, but in child process, the FDs will still be inherited from parent process. About whether signals are inheritted, I'm not sure but seems it's very possible.So be careful with " 阅读全文
posted @ 2011-03-26 10:02
super119
阅读(273)
评论(0)
推荐(0)
摘要:
addr2line,输入一个地址,指定一个带-g编译的可执行程序,就可以打印出该地址对应的代码行。其实gdb也有这个功能,不过addr2line的好处是,很多时候,bug很难重现,我们手上只有一份crash log。这样就可以利用addr2line找到对应的代码行,很方便。前提条件是:1. 该可执行程序用-g编译,带调试信息(所谓调试信息就是代码和地址的一个对应关系的信息)。2. 如果crash在一个so里面,那addr2line不能直接给出代码行。因为我们都知道,so里面的地址在可执行文件装载的时候,是可以被 reallocate的。在windows核心编程中说dll的加载逻辑的时候,也提到 阅读全文
posted @ 2011-03-26 10:00
super119
阅读(2932)
评论(0)
推荐(0)
摘要:
这两个函数都是linux实现i18n需要用到的。其中setlocale用来设定locale,比如LC_ALL,LC_CTYPE等,一般用法是:setlocale(LC_ALL, "")这用来设置LC_ALL,第二个参数是一个空字符串表示使用环境变量中定义的LC_ALL的值。然后就是用bindtextdomain,比如:bindtextdomain("libgammu", LOCALE_PATH);Linux i18n中,每个资源文件是.mo文件,这个文件是二进制的,用工具针对一个文本生成(作成二进制应该是考虑了性能)。所以,上面的代码 中,LOCALE_ 阅读全文
posted @ 2011-03-26 10:00
super119
阅读(2895)
评论(0)
推荐(0)
摘要:
1. SMP机器中实现并行常见的做法就是使用threads, hardware vendors有自己的threads实现,但是给程序移植带来很大问题。于是,对于UNIX系统来说,IEEE POSIX 1003.1c标准出台,这就是POSIX Threads -- pthread 2. 据我所知,有一个open source的项目,是一个library,实现了windows下的pthread,简单来说,将我们写的pthread的函数映射到了windows 下的线程操作函数上。windows本身并不支持pthread,pthread更多是用于UNIX系统的 3. 这里有个对thread的精彩概括, 阅读全文
posted @ 2011-03-26 09:59
super119
阅读(568)
评论(0)
推荐(0)
摘要:
在做DealSpider的时候,必须要知道页面的charset,然后转成UTF-8,最后才能用glib的正则表达式来进行匹配和搜索。CURL本身 是不提供这样的功能的,之前在curl_easy_setopt的man手册中看到了:CURLOPT_CONV_TO_NETWORK, CURLOPT_CONV_FROM_NETWORK,以为这两个可以自动进行转码,后来发现是不行的。这两个仅仅是用于non-ascii平台的。什 么是Non-ASCII平台?简答来说,就是不是所有的计算机系统都用ASCII码的,比如IBM的mainframe机器。在这种机器上,由于不使用 ASCII码,而像http, ft 阅读全文
posted @ 2011-03-26 09:59
super119
阅读(564)
评论(0)
推荐(0)
摘要:
有关这两者的区别和联系,之前其实一直都非常的模糊,特别是extern关键字。这次读C++ Primer,在第二章正好读到,于是好好理解了一次,而且做了一些代码测试。结论是这样的: 1. definition只能用于变量,也就是定义一个变量,此时,变量的内存空间会被分配。诸如int i, int i = 10这样的都是definition,因为i变量会被分配内存。 2. declaration可以用于变量或类型(比如声明一个struct,但是不定义变量),如果用于变量,该变量不会被分配内存,而且前面必须加上 extern(表示这个变量的definition不是在这里,而且在其他地方,所以是ext 阅读全文
posted @ 2011-03-26 09:57
super119
阅读(958)
评论(0)
推荐(0)
摘要:
写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide)。在早期的C++书籍中,可能翻译的 人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的,他们是英语专业的),常常把重载(overload)和覆盖(override)搞错! 我们先来看一些代码及其编译结果。 实例一: Code: Select all#include <iostream>using namespace std;class CB{public: void f(int) { cout << "CB::f(int)" <&l 阅读全文
posted @ 2011-03-26 09:57
super119
阅读(788)
评论(0)
推荐(0)
摘要:
static用来修饰一个函数的时候,表示的意思如下: 1、表示该方法只在本c文件中有效。在其他c文件中无法访问这个方法。 2、static的方法的定义一般不放在.h文件中,因为这个方法只在一个c文件中有效。一般直接将该方法定义在c文件的开头部分就可以了。 3、一般申明这种方法用来封装一些逻辑,和面向对象的private有点类似。比如,我们申明一个方法为static,然后申明一堆其他的方法 (根据用途的不同),这些方法会用不同的参数调用该static方法,而这些方法不是static的,所以,这些方法是可以被其他文件调用的,而这个 static方法封装了所有的逻辑,而且只在本c文件中有效,有效避免 阅读全文
posted @ 2011-03-26 09:56
super119
阅读(549)
评论(0)
推荐(0)
摘要:
阅读了C++ Primer 4th第七章,有了明确的答案。 首先,函数的参数。 如果参数类型不是reference的,那么,函数的调用方压入的参数(我们称之为argument,函数本身的参数我们称为 parameter,两者区分来),会被copy一份,然后被赋予到parameter中。如果很不幸这个参数是个vector,那么,整个 vector,包括里面所有的元素,都会被copy一份,这就是参数拷贝。 如果参数类型是reference类型的,那么,就不会有上述的参数拷贝的过程。 很显然,如果有参数拷贝的动作,那么,在函数中对parameter的修改,不会影响到argument。如果没有参数拷贝 阅读全文
posted @ 2011-03-26 09:56
super119
阅读(733)
评论(0)
推荐(0)
摘要:
关于C语言中有符号的整数值范围为什么是从-32768~32767 悬赏分:5 - 解决时间:2008-7-9 13:57 尽量讲得详细些!例如16个1111111111111111头位是符号位,这应是-32767,那-32768怎么 用16位二进制来表示? 问题补充:负数的二进制表示怎么算的? 例如: -1 的二进制 -32767 的二进制 答案: -2^15~(2^15-1) 计算机中数字是以补码存储的 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。 在C中,用高位置1来表示负数,in 阅读全文
posted @ 2011-03-26 09:55
super119
阅读(11176)
评论(0)
推荐(0)
摘要:
当有多个程序使用同一个共享库的时候,我们都知道,多个程序有多个进程,但是共享库在内存中只有一份。所以问题来了:如果我在共享库中定义了全局变量,那 么全局变量是不是也只有一份?如果是这样,那么当多个进程都在使用这个共享库的时候,就有问题了。比如:我们在共享库中定义了一个全局变量 server_inited,用来表示一个socket server是否已经启动成功了,如果这个变量是TRUE,那么,下次用户调用启动server的函数的时候,这个函数一check这个变量,发现已经是 TRUE了,就不会再启动server了。这样就导致了一个进程调用过了一次启动server的函数之后,其他进程再调用这个函数 阅读全文
posted @ 2011-03-26 09:54
super119
阅读(1933)
评论(2)
推荐(1)
摘要:
首先来看CPU使用率到底是怎么算出来的。依据的是这个公式:(process jiffies) * 100.0f / ((float)Hertz * (float)et * (Rc.mode_irixps ? 1 : Cpu_tot));process jiffies是内核提供的该进程在DeltaT时间内消耗的jiffies。具体是/proc/<pid>/stat文件的第14-17 token。14-17token分别是utime, stime, cutime, cstime。cutime/cstime分别是该进程spawn的子进程在用户态和内核态消耗的jiffies。/proc/& 阅读全文
posted @ 2011-03-26 09:53
super119
阅读(2032)
评论(0)
推荐(0)

浙公网安备 33010602011771号