2012年9月9日

摘要: 前几天,遇到一个在hpux机器上,一个程序链接时既使用了动态库,又使用了静态库,而且把静态库放在动态库的前面。链接时报找不到符号的错误。而该符号已经在静态库中定义了。 今天恰好在 《C专家编程》中找到答案,如下: 在动态链接和镜头链接的语义上有一个巨大差别,archive(静态库)与共享对象(动态库)的动作不同。在动态链接中,所有的库符号进入输出文件的虚拟地址空间中,所有的符号对于链接在一起的所有文件都是可见的。相反,对于静态链接,在处理archive时,它只是在archive中查找载入器当时所知道的未定义符号。因此,使用静态链接的过程中,引入静态链接库的顺序是很重要的。如果相同的符号在... 阅读全文
posted @ 2012-09-09 22:30 山本二十八 阅读(2124) 评论(0) 推荐(0) 编辑

2012年9月3日

摘要: 书中列出三种编译期断言的实现方式,一一列出:CompileTimeAssertion.h//第一个版本使用不能建立空数组的性质#defineSTATIC_CHECK1(expr)\{\charunnamed[(expr)?1:0];\}//第二个版本使用模板的非类形参,使用为定义类是违法的template<bool>structCompileTimeError;//声明一个模板template<>structCompileTimeError<true>{};//仅仅对模板参数为true的特化实现#defineSTATIC_CHECK2(expr)\(Comp 阅读全文
posted @ 2012-09-03 08:16 山本二十八 阅读(337) 评论(0) 推荐(0) 编辑

2012年9月1日

摘要: 标准库定义了两个绑定器适配器:bind1st和bind2nd。每个绑定器接受一个函数对象和一个值。bind1st将给定值绑定到二元函数对象的第一个实参,bind2nd将给定值绑定到二元函数对象的第二个实参。例如,为了计算一个容器中所有小于或等于10的元素的个数,可以这样给count_if传递值: count_if (vec.begin(), vec.end(), bind2nd(less_equal<int>(), 10));详细代码可查看 boost源码或者 vc源码 (functional) 阅读全文
posted @ 2012-09-01 10:14 山本二十八 阅读(283) 评论(0) 推荐(0) 编辑
摘要: 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同?template<class T> class Widget; // uses "class"template<typename T> class Widget; // uses "typename" 答案:没什么不同。在声明一个 template type parameter(模板类型参数)的时候,class 和 typename 意味着完全相同的东西。一些程序员更喜欢在所有的时间都用 class,因为它更容易 阅读全文
posted @ 2012-09-01 09:57 山本二十八 阅读(173) 评论(0) 推荐(0) 编辑

2012年8月29日

摘要: #pragma pack(n) : 以n字节对齐#pragma pack() : 恢复默认对齐方式 IBM:IBM可以通过-qalign编译选项指定对齐方式 ,但是#pragma pack覆盖掉它#pragma pack(pop) 等同于 $pragma pack()。每次#pragma pack的设置会进栈,pop就相关于把最近一次的出栈xlc有一套 #pragma options align 也可以指定对齐方式,如#pragma options align=packed :相关于#pragma pack(1)#pragma options align=reset:恢复到前一个#pragma 阅读全文
posted @ 2012-08-29 10:08 山本二十八 阅读(233) 评论(0) 推荐(0) 编辑

2012年8月28日

摘要: C代码:int fun(int para){ int a=0; return 0;}void main(){ fun(1);}汇编代码:1:2:3: int fun(int para)4: {0040B810 push ebp ;保护寄存器ebp0040B811 mov ebp,esp ;此时ebp=esp;此后ebp一般不变0040B813 sub esp,44h ;44即为40Bytes间隔空间+fun内部变量占有空间,此时fun仅定义一int型变量a,故为4Bytes0040B816 push ebx ;保护ebx0040B817 push esi ;保护esi0040B818 push 阅读全文
posted @ 2012-08-28 17:08 山本二十八 阅读(825) 评论(0) 推荐(0) 编辑

2012年8月20日

摘要: 解决方法:一. Ubuntu默认的中文字符编码Ubuntu默认的中文字符编码为zh_CN.UTF-8,这个可以在/etc/environment中看到:sudo gedit/etc/environment可以看到如下内容:PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games"LANG="zh_CN.UTF-8"LANGUAGE="zh_CN:zh:en_US:en"第二行即是默认的中文字符编码。注:可以通过这里修改默认的中文编码字符, 阅读全文
posted @ 2012-08-20 23:54 山本二十八 阅读(375) 评论(0) 推荐(0) 编辑
摘要: EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址。为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。我们DC上讲过栈的数据结构,主要有以下特点:后进先处。其实它还有以下两个作用:1.栈是用来存储临时变量,函数传递的中间结果。2.操作系统维护的,对于程序员是透明的。我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说说栈的原理。先写个小程序:void fun(void){ printf("hello world");}voidmain(void){ fun() printf("函数调用结束"); 阅读全文
posted @ 2012-08-20 16:20 山本二十八 阅读(628) 评论(0) 推荐(0) 编辑

2012年8月14日

摘要: 在编写shell scripts时,经常会用到括号,各种括号,各种用法。一、括号、圆括号() 1、单小括号。 ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。 ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。 ③用于初始化数组。如:array=(a b c d) 2、双小括号。 ①整数扩展。这种扩展计算是整数型的... 阅读全文
posted @ 2012-08-14 22:25 山本二十八 阅读(4543) 评论(1) 推荐(0) 编辑
摘要: 在unix中,相应的头文件为<stdarg.h>【函数参数在堆栈中的分步】 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后... 阅读全文
posted @ 2012-08-14 19:22 山本二十八 阅读(342) 评论(0) 推荐(0) 编辑

2012年8月13日

摘要: 要查找查log文件带有“Capabilities-Exchange”字符串的行,并打印它的前5行和后5行awk '{a[NR%5]=$0}/Capabilities-Exchange/{print "******************************************************";\for(i=NR-4;i<=NR;i++ ) if(i>0) print a[i%5];i=0;while(i<5 && getline){print;i++ }}' ./test.log 阅读全文
posted @ 2012-08-13 15:28 山本二十八 阅读(188) 评论(0) 推荐(0) 编辑

2012年8月9日

摘要: echo billing.application|sed 's/\(.*\.\)\(.*\)/\1/'| sed 's/.$//'billing解释: \( \) 括起来的,后面可以通过 \1 来指定第一个括起来的,\2指定第2个括起来的&保存发现模式,以便重新调用它echo "hello"|sed 's/he/ab&/' abhello&就表示 之前配置到的he 阅读全文
posted @ 2012-08-09 14:14 山本二十八 阅读(172) 评论(0) 推荐(0) 编辑

2012年8月8日

摘要: 1、查看test.cpp包含了哪些头文件 1.1 AIX xlC -M test.cpp编译选项。编译完后后生成一个.u文件。 2.2 HP-UX aCC -H test.cpp 2.3 Linux g++ -M test.cpp2、对test. cpp进行宏替换 cpp(The C Preprocessor)是unix编译器用来进行宏替换的工具。在编译的时候 ,有时遇到因宏替换而出现的问题,可以调用cpp 输出宏替换后的结果,这样就容易查问题了。 1.1 AIX cpp test.cpp xlC -E -c test.cpp 1.2 HP-UX hpux的cpp工具在/lib... 阅读全文
posted @ 2012-08-08 15:23 山本二十八 阅读(249) 评论(0) 推荐(0) 编辑

2012年8月7日

摘要: 在无边浩渺的宇宙中,银河系只是一个普通的旋涡。它坐拥2000多亿颗恒星,如按1/5的恒星带有行星计算,我们可以想象有无数天寒地冻或者炽热的星球。如果它们从未产生过生命,大千世界的景象从未被映射入心灵,如果世界从未被自我意识所发现,被倒影在大脑皮层之上,那么宇宙的存在又有谁知道呢?从这个角度来讲生命才是宇宙的核心。大约38亿年前,在一颗蔚蓝色的星球上,有机大分子在原始海洋里聚集,生命从一次雷电交汇的偶然催化后形成,从此开始了进化飞跃。细胞不断增加,组织发生分工,脊索开始出现,鳃演化成了肺,鳍演变成四肢,冷血成为热血,大脑的容量越来越大,进化—进化—进化!生命从海洋出发,占领了陆地和天空,一往无前 阅读全文
posted @ 2012-08-07 21:16 山本二十八 阅读(322) 评论(0) 推荐(0) 编辑
摘要: #include<stdlib.h>#include<stdio.h>#include<errno.h>#include<pthread.h>//externinterrnop;//externinterrno;extern_text;extern_etext;extern_data;extern_edata;//externchar*environ[];inti_initialized=1;/*initializedglobalvariable.*/longl_uninitialized;/*uninitializedglobalvariabl 阅读全文
posted @ 2012-08-07 17:59 山本二十八 阅读(172) 评论(0) 推荐(0) 编辑
摘要: gdb跟踪进程时,可以用 info frame查看当前栈桢信息,可以用 frame 、up、down 改变当前栈桢(gdb) info frameStack level 0, frame at 0x9fffffffbf6af1c0: ==>当前栈地址ip = 0xc0000000003db5f0:0 in __doprnt_main; saved ip 0xc0000000003d5990:0 ==》代码段地址called by frame at 0x9fffffffbf6af1c0 ==》调用它的栈地址Size of frame is 96, Size of locals is 88, 阅读全文
posted @ 2012-08-07 17:58 山本二十八 阅读(2515) 评论(0) 推荐(0) 编辑
摘要: include <sys/select.h>#include <sys/itimer.h>int getitimer(int which, struct itimerval *value);int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);结构itimerval描述了定时器的组成:struct itimerval{ struct tim. it_interval; /* 下次定时取值 */ struct tim. it_value; /* 本次定时设置值 * 阅读全文
posted @ 2012-08-07 17:57 山本二十八 阅读(193) 评论(0) 推荐(0) 编辑
摘要: ANSI/3.64控制码标准:ANSI控制码均以 Esc[ 作为控制码的开始标志,其中,Esc 的ansi码为 27-十进制,33-八进制,所以在c中,可以使用 \033 表示。具体如下:\33[0m 关闭所有属性\33[1m 设置高亮度\33[4m 下划线\33[5m 闪烁\33[7m 反显\33[8m 消隐\33[30m -- \33[37m 设置前景色\33[40m -- \33[47m 设置背景色\33[nA 光标上移n行\33[nB 光标下移n行\33[nC 光标右移n行\33[nD 光标左移n行\33[y;xH设置光标位置(现已很少使用) \33[2J 清... 阅读全文
posted @ 2012-08-07 17:56 山本二十八 阅读(3742) 评论(0) 推荐(0) 编辑
摘要: template <typename T> struct Type2Type{ typedef T OriginalType;};【用途】比如说template <class T,class U>T* Create(const U& arg,T/*虚拟*/){ return new T(arg);};本模板函数用于使用U类型创建T类型。为了实例化时可以识别T,只能为函数增加一个T。但问题是,实例化的时候string* pstr=Create("hello world!",string());第2个参数需创建一个临时对象。但是这个临时对象却没有 阅读全文
posted @ 2012-08-07 17:55 山本二十八 阅读(311) 评论(0) 推荐(0) 编辑
摘要: Traits技术可以用来获得一个 类型 的相关信息的。 首先假如有以下一个泛型的迭代器类,其中类型参数 T 为迭代器所指向的类型:template <typename T>class myIterator{...};当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:template <typename T>class myIterator{ typedef T value_type;...};这样当我们使用myIterator类型时,可以通过 myIterator::value_type来获得相应的myIte 阅读全文
posted @ 2012-08-07 17:55 山本二十八 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放5、程序 阅读全文
posted @ 2012-08-07 17:54 山本二十八 阅读(169) 评论(0) 推荐(0) 编辑
摘要: 指向类成员函数的指针并非指针参考<<C++必知必会>>的相关章节"指向类成员函数的指针",这个术语中包含了"类成员函数"的术语,但是严格的说,这里的成员函数只是指非静态成员函数,这个术语中还包含了"指针"这个术语,但是严格的说,它即不包含地址,行为也不象指针,说得干脆点,那就是"指向类成员函数的指针"并非指针.尽管这个术语有很大的迷惑性,但是就其含义来说,可以把一组同类型的函数抽象为一个"指向函数的指针",同样的道理,可以把一组类中同类型的类成员函数抽象为一个" 阅读全文
posted @ 2012-08-07 17:53 山本二十八 阅读(3727) 评论(0) 推荐(0) 编辑
摘要: 在unix中,相应的头文件为<stdarg.h>【函数参数在堆栈中的分步】 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后... 阅读全文
posted @ 2012-08-07 17:53 山本二十八 阅读(242) 评论(0) 推荐(0) 编辑
摘要: #ifndef__LIBNET_TYPES_H__#define__LIBNET_TYPES_H__#include<sys/types.h>#if!defined(__cplusplus)typedefunsignedcharbool;#definefalse0#definetrue(!0)#endif/*可以通过cpp来查看系统预定义宏,执行:touchfoo.h;cpp-dMfoo.h*/#ifdefined(_AIX)#elifdefined(__linux)#elifdefined(__hpux)#include<arpa/nameser_compat.h>t 阅读全文
posted @ 2012-08-07 17:52 山本二十八 阅读(266) 评论(0) 推荐(0) 编辑
摘要: 关于C语言中的结构体对齐。 (1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个。 (2)为什么要字节对齐 内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的CPU为了提高访问内存的速度,就规定了对于某些类型的数据只能从特定的起始位置开始访问。这样就决定了各种数据类型只能按照相应的规则在内存空间中存放,而不能一个接一个的顺序排列。 举个例子,比如有些平台访问内存地址都从偶数地址开始,对于一个int型(... 阅读全文
posted @ 2012-08-07 17:50 山本二十八 阅读(989) 评论(0) 推荐(0) 编辑
摘要: Today I had a little chat with Michiel on #gnome-nl regarding the use of C++ classes in C code (he started learning C again ;-)).I was fascinated (well, sort of) by this, and tried to get something working. Here's the result:* First we need a C++ class, using one header file (Test.hh)class Test 阅读全文
posted @ 2012-08-07 17:49 山本二十八 阅读(354) 评论(0) 推荐(0) 编辑
摘要: 1) -AA 全面支持C++(HPUX PA上编译C++时的必须选项)2) -V 查看版本3) +DD64 编译64位程序4) +DAportable 跨版本编译5) -lpthread 支持POSIX线程6) -lrt 支持POSIX消息队列7) -D_REENTRANT 支持localtime_r,time_r,asctime_r (要想errno支持多线程安全,也需加这个)8) -D_INCLUDE__STDC_A1_SOURCE 支持Unicode(wprintf)9) -D_INCLUDE_LONGLONG 支持long long类型10) -D_RWSTD_MULTI... 阅读全文
posted @ 2012-08-07 17:48 山本二十八 阅读(2434) 评论(0) 推荐(0) 编辑
摘要: 在UNIX的多线程下用到errno的时候,要留意下了,否则无法得到正确的errno。在AIX下,编译的时候需要加入-D_THREAD_SAFE在solaris下,编译的时候需要加入 -D_REENTRANT在hp-ux下,编译的时候 需要加入 -D_REENTRANT在linux下,不存在任何问题,可以放心大胆的使用通过这个问题,还学到一招,查看include头文件,我想在某些时候会起到些作用。比如,查看AIX下的/usr/include/errno.h文件,会发现这样的声明:#if defined(_THREAD_SAFE) || defined(_THREAD_SAFE_ERRNO)/** 阅读全文
posted @ 2012-08-07 17:47 山本二十八 阅读(242) 评论(0) 推荐(0) 编辑
摘要: popen在popen中调用下面的语句:df . | awk '{print $4}' | sed -n '2p'popen使用FIFO管道执行外部程序。#include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream);popen 通过type是r还是w确定command的输入/输出方向,r和w是相对command的管道而言的。r表示command从管道中读入,w表示 command通过管道输出到它的stdout,popen返回F 阅读全文
posted @ 2012-08-07 14:14 山本二十八 阅读(295) 评论(0) 推荐(0) 编辑
摘要: 介绍使用脚本判断内存泄漏的简便方法Document #: 2811995H29001Body:[标题]介绍使用脚本判断内存泄漏的简便方法内容提要:本文份四个部分介绍如何使用提供的脚本定位分析应用内存泄漏一,前言二,内存使用介绍三,脚本使用介绍四,示例分析五,总结说明:介绍使用脚本判断内存泄漏的简便方法一,前言应用内存泄漏是UNIX 系统中比较常见的一种现象,如何定位并确定内存泄漏的应用是一个相对复杂的过程。本文将探讨内存泄漏的产生,及在AIX 系统中如何利用提供的脚本,在系统级层面判断内存泄漏的进程。二,内存使用介绍C 语言中,应用使用malloc() 函数从进程的堆栈中申请内存,而在C++ 阅读全文
posted @ 2012-08-07 14:13 山本二十八 阅读(4238) 评论(0) 推荐(0) 编辑

导航