- 博客(44)
- 收藏
- 关注
原创 linux进程间内存共享---mmap
系统调用mmap()用于共享内存的两种方式:(1)使用普通文件提供的内存映射:适用于任何进程之间; 此时,需要打开或创建一个文件,然后再调用mmap();典型调用代码如下: fd=open(name, flag, mode); if(fd ptr=mmap(NULL, len , PROT_READ|PROT_WRITE, MAP
2011-10-27 23:16:54
1389
转载 实现Mysql的远程登录
http://blog.sina.com.cn/s/blog_54bbad8b0100bs7v.html 折腾到凌晨3点,才弄明白mysql的远程设置。粗心大意害死人啊,其实一开始按照网上提示已经设置成功了,只不过在另一机器使用mysql query browser测试的
2011-09-01 21:03:39
599
转载 信号
http://blog.youkuaiyun.com/ljx0305/archive/2008/09/09/2904056.aspx SIGHUP 终止进程 终端线路挂断SIGINT 终止进程 中断进程SIGQUIT 建立CORE文件终止进程,并且生成core文件SIGILL 建立CORE文件 非法指令SIGTRAP 建立CORE文件 跟踪自陷SI
2011-06-20 17:43:00
455
原创 用gcc还是g++?
今天写了个service.cpp,用gcc编译:gcc -o service service.cpp;出现如下错误码:/tmp/ccCJCMyo.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0collect2: ld returned 1 exit status为什么会出现这个错误:是因为用gcc编
2011-06-03 14:29:00
730
原创 uniq和sort的组合运用
对一个文件中的数据进行排序、重复删选、以及统计重复项的数目linux的命令为:sort f.txt | uniq -c
2011-06-01 20:59:00
1347
原创 GCC链接中的库依赖
<br />GCC在链接过程中,对参数中的库的顺序是有要求的,参数右侧的库会先于左侧的库加载,也就是说参数的解析是从右往左的。<br /> 假设库B依赖与库A,则链接的时候要写为:<br /> gcc -o bin -lB -lA<br /> 如果写为:<br /> gcc -o bin -lA -lB<br /> 则在B中引用的A中的内容就会无法链接通过。<br /> <br />--------------------------------------------
2011-03-22 15:48:00
741
原创 GCC链接中的库依赖
<br />GCC在链接过程中,对参数中的库的顺序是有要求的,参数右侧的库会先于左侧的库加载,也就是说参数的解析是从右往左的。<br /> 假设库B依赖与库A,则链接的时候要写为:<br /> gcc -o bin -lB -lA<br /> 如果写为:<br /> gcc -o bin -lA -lB<br /> 则在B中引用的A中的内容就会无法链接通过。<br /> <br />--------------------------------------------
2011-03-22 15:46:00
1198
原创 localtime 和 localtime_r
上程序:#include #include #include #include using namespace std;int main(int argc, char *argv[]){ time_t tNow =time(NULL); time_t tEnd = tNow + 1800; struct tm* ptm = localtime(&tNow); struct tm* ptmEnd = localtime(&tEnd); char szTmp[50] = {0};
2011-03-03 21:16:00
70621
1
原创 关于offsetof()的warning!
<br />先不多说,直接上程序:<br />#include <cstdlib><br />#include <iostream><br />#include <sstream><br />#include <stdexcept><br />#include <cstring><br />#include <map><br /><br />using namespace std;<br /> <br />struct test {<br /> uint32_t a;<br />};<br />
2011-03-02 20:58:00
5444
原创 Lua的基本信息调试(三)--lua_getstack
在前面那篇文章Lua的基本信息调试(二)中,我使用了lua_getstack(L, 2, &debug);去取堆栈中的错误信息,但至于错误信息在stack中的层数并不清楚,经过信息打印发现,错误信息在stack的最深处,因此,修改函数为:int pcall_callback_err_fun(lua_State* L){ lua_Debug debug; //取得层数 uint32_t level = 0; while (lua_getstack(L, level, &debug))
2011-02-25 20:03:00
6472
1
原创 gcc 加载库和头文件的次序
<br />gcc在加载inlcude和lib的时候是优先载入makefile里定义的,然后再去搜索环境变量里配置的默认的路径!
2011-02-22 21:56:00
772
原创 Lua的基本信息调试(二)
<br />前面说过,在我们的项目中使用的是luabind。<br />调用lua函数的接口是:call_function<bool>(m_lua, func_name, player);<br />如果func出错了,lua会抛出异常,c++程序捕捉到后程序可能会崩掉(就看有没有对异常的抛出做反映),所以光写call_function这个函数的话是看不到错误信息的,我们需要把异常捕捉出来。<br /> try {<br /> bool ret = call_function<b
2011-02-16 21:45:00
4565
原创 Lua的基本信息调试(一)
前段时间在项目中试加入了lua脚本,但由于匆忙很不完善,没有任何的调试信息,包括出错信息的打印,所以很是痛苦!最近终于开始着手完善lua程序,只是从没用过,一切都是从头学起!首先是载入脚本的时候:luaL_dofile(m_lua, pathname.c_str());如果是lua脚本的语法等基本错误,这时候luaL_ dofile会返回错误码,但想知道错误信息就必须看堆栈了。其实查看文档就知道,luaL_dofile分两步:luaL_loadfile以及lua_pcall,因此可以加入如下信息: i
2011-02-15 21:47:00
6124
原创 简单而容易忽略的类型转换问题
<br />先看以下代码:<br />uint8_t get_stage(uint16_t cur_val, uint16_t init_val)<br />{<br /> uint8_ state = 0;<br /> float rate = cur_val / init_val;<br /> if (rate > 0.5) {<br /> state = 10;<br /> } else if (rate > 0.2) {<br /> state = 20;<br /> } else if (ra
2010-06-08 22:43:00
694
原创 小心使用定时器时发生的内存泄露
今天实现如下代码:struct info_t { uint32_t id; uint32_t count;}; void use_timer(uint32_t uid){ //... info_t* info = reinterpret_cast(g_slice_alloc0(sizeof(info_t))); info->id = uid; info->c
2010-05-28 10:09:00
1701
原创 关于std::vector指针的下标“[]”的使用
#include #include #include #include using namespace std;struct test_t { uint32_t a; uint32_t b;};int main(int argc, char *argv[]){ test_t t; memset(&t, 0x00, sizeof(test_t));
2010-05-21 16:40:00
7486
原创 关于memset的慎用
先看一段代码:#include #include using namespace std;struct test_t { test_t() { memset(this, 0, sizeof(test_t)); } uint32_t a; uint32_t add() {
2010-05-18 19:20:00
1296
原创 重载转换操作符
转换操作符是一种特殊的类成员函数。将类类型值转变为其他类型值的转换。operator type()必须是成员函数,不能指定返回类型,并且形参表必须为空 例如:class Test {public: Test(int t){ t_ = t; } ~Test(){} //operator int(){ return t_; } operato
2010-05-16 12:21:00
549
原创 关于map使用失误
今天又犯了个错误:原先 typedef std::map XXXMap;XXXMap xxx;然后在退出时删除:for (XXXMap::iterator it = xxx.begin(); it != xxx.end(); ++it) { delete it->second;}这个没问题。一切OK。后来修改: typedef std::map XXX> XXXMap;XXXMap x
2010-05-11 17:29:00
1783
原创 函数指针数组的点滴
以下内容摘至《C++编程思想》:#include using namespace std; #define DF(N) void N(){cout DF(a);DF(b);DF(c);DF(d);void (*func_table[])()={a,b,c,d};int main() { while(1){ cout char
2010-05-08 23:24:00
490
转载 c++ 之类的前置声明
原文地址:http://software.intel.com/zh-cn/blogs/2010/05/04/c-2/?cid=sw:prccsdn1073 刚开始学习c++的人都会遇到这样的问题:定义一个类 class A,这个类里面使用了类B的对象b,然后定义了一个类B,里面也包含了一个类A的对象a,就成了这样:一编译,就出现了一个互包含的问题了,这时就有人跳出来说
2010-05-07 14:34:00
551
原创 关于rand()和srand()的理解
函数一:int rand(void);从srand (seed)中指定的seed开始,返回一个[seed, RAND_MAX(0x7fff))间的随机整数。函数二:void srand(unsigned seed); 参数seed是rand()的种子,用来初始化rand()的起始值。 如果在rand()之前没有调用srand (),它会自动调用srand(1)一次。可以把随机数列
2010-05-07 14:05:00
763
原创 关于时间的操作
1、时间类型。 Linux下常用的时间类型有4个:time_t,struct timeval,struct timespec,struct tm。(1)time_t是一个长整型,一般用来表示用1970年以来的秒数。 time_t long integer (2)struct timeval有两个成员,一个是秒,一个是微妙。 struct timeval {
2010-04-29 11:05:00
807
原创 数组中元素顺序的安排
今天写了一组数组,需要经常搜索。假设有结构体struct player_info { uint32_t id; uint32_t lv; ...};player_info players[10]; 有5个players的搜索频率比另五个高多了,所以要有心把那5个安排在数组的前面,这要减少搜索的次数我们也可以使用sort、binary_search之类的标准函数库http:/
2010-04-29 10:18:00
607
原创 关于sort、binary_search
今天在使用数组的时候,亲身体验了一把sort、binary_search,以前只是在用map、set之类的时候才用到。假设有结构体struct player_info { uint32_t id; uint32_t lv; ...};player_info players[10];想对players按id进行排序,并且用二分法进行搜索。sort有两种方法:template void
2010-04-29 10:14:00
1138
原创 调试小技巧--define
案例一:#includeiostream>using namespace std;#define DEBUGint factorial(int num){ if(num == 0) return 1; else { # if defined(DEBUG) static i; printf("%d"
2010-04-23 17:56:00
704
原创 vim替换
语法为 :[addr]s/源字符串/目的字符串/[option]全局替换命令为::%s/源字符串/目的字符串/g[addr] 表示检索范围,省略时表示当前行。如:“1,20” :表示从第1行到20行;“%” :表示整个文件,同“1,$”;“. ,$” :从当前行到文件尾;s : 表示替换操作[option] : 表示操作类型如:g 表示全局替换; c 表示进
2010-04-13 09:59:00
444
转载 const 函数
用const 修饰函数的返回值如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。例如函数const char * GetString(void);如下语句将出现编译错误:char *str = GetString();正确的用法是const char *str = GetString();如果函数返回
2010-04-09 16:21:00
1823
原创 using关键字
using关键字 1、using声明与using指示符:前者是声明某名字空间内的一个成员,后者是使用整个名字空间。例如: 代码: using std::map; // ok,using声明 using namespace std; //ok,using指示符 2、该using指示符语句可以加在程序文件的几乎任何地方,包括
2010-04-09 11:34:00
1256
转载 new的深入分析
“new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A
2010-04-08 14:10:00
606
原创 boost:pool 一实例
#ifndef LIB_MEMPOOL_HPP_#define LIB_MEMPOOL_HPP_ #include template class MemPool {public: virtual ~MemPool() { }public: void* operator new(std::size_t n); void operator delete(void* p, std
2010-04-08 13:56:00
1351
转载 boost::pool与内存池技术
原文地址:http://www.cnitblog.com/schkui/archive/2007/04/16/25775.html Pool分配是一种分配内存方法,用于快速分配同样大小的内存块, 尤其是反复分配/释放同样大小的内存块的情况。 1. pool 快速分配小块内存,如果pool无法提供小块内存给用户,返回0。 Example:
2010-04-08 12:47:00
625
转载 广播和多播,IGMP协议
原文地址:http://dev.youkuaiyun.com/author/goodboy1881/c81170474227432a957e29e474627b21.html 1.单播,多播,广播的介绍1.1.单播(unicast)单播是说,对特定的主机进行数据传送。例如给某一个主机发送IP数据包。这时候,数据链路层给出的数据头里面是非常具体的目的地址,对于以太网来 说,就是网卡
2010-04-08 09:54:00
563
转载 一个通用的单体模板
原文地址:http://www.azure.com.cn/article.asp?id=206 #include template class Singleton{ static T* ms_Singleton;public: Singleton( void ) { assert( !ms_Singleton); int offset = (int)(T*)1 - (i
2010-04-07 15:11:00
684
转载 降低编译时间的几条方案
http://www.azure.com.cn/article.asp?id=341 关于include的原则最多,因为包含头文件相当于将代码复制到本文件来编译,而头文件又经常是用来被别人包含的,所以工程文件多了,每个文件都有include链(包含的文件又include了其他文件),该链条不会止步于你工程,而会延伸到你所有使用的第3方库里面。A.能够去掉的include就去掉。说明:1.代
2010-04-07 14:37:00
553
转载 绝对不要重新定义继承而来的缺省参数
http://www.azure.com.cn/article.asp?id=342 看下面这个例子: class CBase{public:virtual void Test(int iTest = 0) const = 0;};class CDerived : public CBase{public:void Test(int iTest = 1) const { cout
2010-04-07 14:32:00
477
转载 图文例解C++类的多重继承与虚拟继承
http://pcedu.pconline.com.cn/empolder/gj/c/0503/579115.html 在过去的学习中,我们始终接触的单个类的继承,但是在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。 举个例子,交通工具类可以派生出汽车和船连
2010-04-07 14:21:00
570
转载 c++中的explicit关键字
http://www.azure.com.cn/article.asp?id=335 c++中的explicit关键字用来修饰类的构造函数,表明该构造函数是显式的,既然有"显式"那么必然就有"隐式",那么什么是显示而什么又是隐式的呢?如果c++类的构造函数有一个参数,那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class
2010-04-07 10:18:00
482
转载 Const,Const函数,Const变量,函数后面的Const
http://www.cnblogs.com/fancyboy2004/archive/2008/12/23/1360810.html 看到const 关键字,C++程序员首先想到的可能是const 常量。这可不是良好的条件反射。如果只知道用const 定义常量,那么相当于把火药仅用于制作鞭炮。const 更大的魅力是它可以修饰函数的参数、返回值,甚至函数的定义体。const 是con
2010-03-19 11:00:00
477
转载 STL中map的成员函数insert的返回值
http://hi.baidu.com/tiger_tnt/blog/item/3e6be9b5609ddcca36d3caa9.html map在进行插入的时候是不允许有重复的键值的,如果新插入的键值与原有的键值重复则插入无效,可以通过insert的返回值来判断是否成功插入。下面是insert的函数原型: pair insert(const value_type&
2010-03-18 09:48:00
12835
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人