摘要:#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
阅读全文
摘要: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
阅读全文
摘要:解决方法:一. 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"第二行即是默认的中文字符编码。注:可以通过这里修改默认的中文编码字符,
阅读全文
摘要:EIP,EBP,ESP都是系统的寄存器,里面存的都是些地址。为什么要说这三个指针,是因为我们系统中栈的实现上离不开他们三个。我们DC上讲过栈的数据结构,主要有以下特点:后进先处。其实它还有以下两个作用:1.栈是用来存储临时变量,函数传递的中间结果。2.操作系统维护的,对于程序员是透明的。我们可能只强调了它的后进先出的特点,至于栈实现的原理,没怎么讲?下面我们就通过一个小例子说说栈的原理。先写个小程序:void fun(void){ printf("hello world");}voidmain(void){ fun() printf("函数调用结束");
阅读全文
摘要:在编写shell scripts时,经常会用到括号,各种括号,各种用法。一、括号、圆括号() 1、单小括号。 ①命令组。括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用。括号中多个命令之间用分号隔开,最后一个命令可以没有分号,各命令和括号之间不必有空格。 ②命令替换。等同于`cmd`,shell扫描一遍命令行,发现了$(cmd)结构,便将$(cmd)中的cmd执行一次,得到其标准输出,再将此输出放到原来命令。有些shell不支持,如tcsh。 ③用于初始化数组。如:array=(a b c d) 2、双小括号。 ①整数扩展。这种扩展计算是整数型的...
阅读全文
摘要:在unix中,相应的头文件为<stdarg.h>【函数参数在堆栈中的分步】 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后...
阅读全文
摘要:要查找查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
阅读全文
摘要:echo billing.application|sed 's/\(.*\.\)\(.*\)/\1/'| sed 's/.$//'billing解释: \( \) 括起来的,后面可以通过 \1 来指定第一个括起来的,\2指定第2个括起来的&保存发现模式,以便重新调用它echo "hello"|sed 's/he/ab&/' abhello&就表示 之前配置到的he
阅读全文
摘要: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...
阅读全文
摘要:在无边浩渺的宇宙中,银河系只是一个普通的旋涡。它坐拥2000多亿颗恒星,如按1/5的恒星带有行星计算,我们可以想象有无数天寒地冻或者炽热的星球。如果它们从未产生过生命,大千世界的景象从未被映射入心灵,如果世界从未被自我意识所发现,被倒影在大脑皮层之上,那么宇宙的存在又有谁知道呢?从这个角度来讲生命才是宇宙的核心。大约38亿年前,在一颗蔚蓝色的星球上,有机大分子在原始海洋里聚集,生命从一次雷电交汇的偶然催化后形成,从此开始了进化飞跃。细胞不断增加,组织发生分工,脊索开始出现,鳃演化成了肺,鳍演变成四肢,冷血成为热血,大脑的容量越来越大,进化—进化—进化!生命从海洋出发,占领了陆地和天空,一往无前
阅读全文
摘要:#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
阅读全文
摘要: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,
阅读全文
摘要: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; /* 本次定时设置值 *
阅读全文
摘要: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 清...
阅读全文
摘要: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个参数需创建一个临时对象。但是这个临时对象却没有
阅读全文
摘要:Traits技术可以用来获得一个 类型 的相关信息的。 首先假如有以下一个泛型的迭代器类,其中类型参数 T 为迭代器所指向的类型:template <typename T>class myIterator{...};当我们使用myIterator时,怎样才能获知它所指向的元素的类型呢?我们可以为这个类加入一个内嵌类型,像这样:template <typename T>class myIterator{ typedef T value_type;...};这样当我们使用myIterator类型时,可以通过 myIterator::value_type来获得相应的myIte
阅读全文
摘要:一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放5、程序
阅读全文
摘要:在unix中,相应的头文件为<stdarg.h>【函数参数在堆栈中的分步】 在进程中,堆栈地址是从高到低分配的.当执行一个函数的时候,将参数列表入栈,压入堆栈的高地址部分,然后入栈函数的返回地址,接着入栈函数的执行代码,这个入栈过程,堆栈地址不断递减,一些黑客就是在堆栈中修改函数返回地址,执行自己的代码来达到执行自己插入的代码段的目的. 总之,函数在堆栈中的分布情况是:地址从高到低,依次是:函数参数列表,函数返回地址,函数执行代码段. 堆栈中,各个函数的分布情况是倒序的.即最后一个参数在列表中地址最高部分,第一个参数在列表地址的最低部分.参数在堆栈中的分布情况如下: 最后...
阅读全文
摘要:指向类成员函数的指针并非指针参考<<C++必知必会>>的相关章节"指向类成员函数的指针",这个术语中包含了"类成员函数"的术语,但是严格的说,这里的成员函数只是指非静态成员函数,这个术语中还包含了"指针"这个术语,但是严格的说,它即不包含地址,行为也不象指针,说得干脆点,那就是"指向类成员函数的指针"并非指针.尽管这个术语有很大的迷惑性,但是就其含义来说,可以把一组同类型的函数抽象为一个"指向函数的指针",同样的道理,可以把一组类中同类型的类成员函数抽象为一个"
阅读全文
摘要:#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
阅读全文
摘要:关于C语言中的结构体对齐。 (1)什么是字节对齐 一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个。 (2)为什么要字节对齐 内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的CPU为了提高访问内存的速度,就规定了对于某些类型的数据只能从特定的起始位置开始访问。这样就决定了各种数据类型只能按照相应的规则在内存空间中存放,而不能一个接一个的顺序排列。 举个例子,比如有些平台访问内存地址都从偶数地址开始,对于一个int型(...
阅读全文
摘要: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
阅读全文
摘要: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...
阅读全文
摘要:在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)/**
阅读全文
摘要: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
阅读全文
摘要:介绍使用脚本判断内存泄漏的简便方法Document #: 2811995H29001Body:[标题]介绍使用脚本判断内存泄漏的简便方法内容提要:本文份四个部分介绍如何使用提供的脚本定位分析应用内存泄漏一,前言二,内存使用介绍三,脚本使用介绍四,示例分析五,总结说明:介绍使用脚本判断内存泄漏的简便方法一,前言应用内存泄漏是UNIX 系统中比较常见的一种现象,如何定位并确定内存泄漏的应用是一个相对复杂的过程。本文将探讨内存泄漏的产生,及在AIX 系统中如何利用提供的脚本,在系统级层面判断内存泄漏的进程。二,内存使用介绍C 语言中,应用使用malloc() 函数从进程的堆栈中申请内存,而在C++
阅读全文
摘要:【概述】 为什么需要hash_map用过map吧?map提供一个很常用的功能,那就是提供key-value的存储和查找功能。例如,我要记录一个人名和相应的存储,而且随时增加,要快速查找和修改:岳不群-华山派掌门人,人称君子剑张三丰-武当掌门人,太极拳创始人东方不败-第一高手,葵花宝典...这些信息如果保存下来并不复杂,但是找起来比较麻烦。例如我要找"张三丰"的信息,最傻的方法就是取得所有的记录,然后按照名字一个一个比较。如果要速度快,就需要把这些记录按照字母顺序排列,然后按照二分法查找。但是增加记录的时候同时需要保持记录有序,因此需要插入排序。考虑到效率,这就需要用到二叉树
阅读全文
摘要:关联式容器都有一个键值,键值要求必须支持<比较操作。Map或set或multimap或multiset在存储数据时,根据键值的<顺序顺序存储。对于set,因为在插入时需要比较键值是否相等,在此,它对于是否相等的确认方法是:如果 a<b为false 并且 b<a为false,则相等。但是,在定义关联式容器时,可以指定自己的比较函数,见如下map类定义:template<class _Kty, class _Ty, class _Pr = less<_Kty>, class _Alloc = allocator<pair<const _Kty,
阅读全文
摘要:函数对象是重载了“()”操作符的普通类对象。因此从语法上讲,函数对象与普通的函数行为类似。用函数对象代替函数指针有几个优点:1)首先,因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。在使用普通函数时需要将先前调用的结果存储在全程或者本地静态变量中,但是全程或者本地静态变量有某些我们不愿意看到的缺陷。2)其次,在函数对象中编译器能实现内联调用,从而更进一步增强了性能。这在函数指针中几乎是不可能实现的。3)函数对象属于类对象,可以把函数设计为模板函数。如#define LENGTH(s) (sizeof(s)/sizeof(s[0]
阅读全文
摘要:模板必须在使用它的时候才实例化,因此模板不能单独编译。如果把模板声明放在.h文件,把模板函数的定义放在.cpp里。在使用到模板的地方,由于只include了头文件,当然就找不到函数定义的代码。因此,简单的办法就是把模板函数的定义和声明都放在.h头文件里。 但是这就出现了一个问题。a.cpp使用了模板,因此就定义了一个该模板类型的实例。如果b.cpp也使用了与a.cpp相同的模板实例,则编译器又在b.o定义了一个相同的模板实例。这样在最终的可执行程式或库中有重复的模板实例。 为了解决这个问题,可以在编译和链接的时候 加上 -qtempinc选项。编译期在遇到这个选项时,会将模板的实例化代...
阅读全文
摘要:STL有大量用来处理容器的算法。这些算法可以分为如下几类:排序和搜索、数值处理、集合运算、拷贝等。1、reversetemplate<class BidirectionalIterator>void reverse( BidrectionalIterator it1,BidrectionalIterator it2);需要注意的是,reverse的两个参数均为双向迭代器类型。2、generateeg. Generate(v.begin(),v.end(),rand);3、replace_ifbool odd(int i){return i%2!=0;}replace_if( v.b
阅读全文
摘要:非类型模板形参模板形参不必都是类型。Template<classT,size_tN>voidarray_init(T(&parm)[N]){For(size_ti=0;i!=N;i++){Parm[i]=0;}}例2:template<inthi,intwid>classScreen{public:Screen():screen(hi*wid,'#'),cursor(0),height(hi),width(wid){}voiddump(){std::cout<<screen;}private:std::stringscreen;std
阅读全文
摘要:【内存使用率】floatCHWMSchedule::GetMemUsedRate(){unsignedlonglongullFreePhyMem=0;unsignedlonglongullUsedPhyMem=0;unsignedlonglongullTotalPhyMem=0;perfstat_memory_total_tminfo;if(perfstat_memory_total(NULL,&minfo,sizeof(perfstat_memory_total_t),1)!=1){printf("GetSystemMemoryFail");return0.0;}
阅读全文
摘要:#include<stdio.h>#include<term.h>intmain(){intnrows,ncolumns;setupterm(NULL,fileno(stdout),(int*)0);nrows=tigetnum("lines");ncolumns=tigetnum("cols");printf("Thisterminalhas%dcolumnsand%drows\n",ncolumns,nrows);return0;}
阅读全文
摘要:template<classForwardIterator,classT>ForwardIteratorremove(ForwardIteratorfirst,ForwardIteratorlast,constT&value);<algorithm>RemovevaluefromrangeRemovesfromtherange[first,last)theelementswithavalueequaltovalueandreturnsaniteratortothenewendoftherange,whichnowincludesonlythevaluesnote
阅读全文
摘要:voidprint(char(*arr)[10],intlen){inti;for(i=0;i<len;i++){printf("%s",arr[i]);}printf("\n");}intmain(){chararr[][10]={"bac","bca","abc","acb","cba","cab"};char*key="bca";char*ptr=NULL;printf("beforeqsort
阅读全文
摘要:intIBC_InfoIndb::read_file_from_dir(constchar*path,charfilename[][256],intmax_size,int*file_cnt){DIR*dir=NULL;structdirent*entry;cout<<"readdir:"<<path<<endl;dir=opendir(path);if(!dir){fprintf(stderr,"opendir%sfail!\n",path);return-1;}*file_cnt=0;readdir(dir);re
阅读全文
摘要:#include"apue.h"staticvolatilesig_atomic_tsigflag;/*setnonzerobysighandler*/staticsigset_tnewmask,oldmask,zeromask;staticvoidsig_usr(intsigno)/*onesignalhandlerforSIGUSR1andSIGUSR2*/{sigflag=1;}voidTELL_WAIT(void){if(signal(SIGUSR1,sig_usr)==SIG_ERR)err_sys("signal(SIGUSR1)error"
阅读全文
摘要:intbase_class::getWriteLock(string&filename){intfd=open(filename.c_str(),O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);if(fd<0){cerr<<"open"<<filename<<"fail!"<<endl;return-1;}structflockfl;fl.l_type=F_WRLCK;fl.l_start=0;fl.l_whence=SEEK_SET;fl.l_
阅读全文
摘要:#include<stdio.h>#include<stdlib.h>#include<stdarg.h>/***COPYRIGHTNOTICE*Copyright(c)2010,ffcs(版权声明)*Allrightsreserved.*@fileDebug.h*@brief按DEBUG_ZONE输出调试消息**当宏DEBUG被打开时,根据设置的DEBUG_ZONE输出相应的消息。DEBUG_ZONE可以通过*修改g_debug_setting的zone_mask修改。**@versionv1.0*@author*@date2010/11/09**修订说明
阅读全文
摘要:char*getCurrFileName(){FILE*stream;charfullname[1024];stream=popen("pwd","r");fread(fullname,sizeof(char),sizeof(fullname),stream);{inti;for(i=0;i<strlen(fullname);i++){if(fullname[i]=='\n'){fullname[i]=0;break;}}}sprintf(fullname,"%s/%s",fullname,__FILE__);p
阅读全文
摘要:#include<sys/sem.h>#include<stdio.h>#include<signal.h>#include<unistd.h>#include<stdarg.h>#include<string.h>sigset_toldset;typedefstruct__sig_mask{sigset_tsig_newset,sig_oldset;intset_flag;/*当调用完mask_procmask后,置1,否则,为0*/int(*mask_addsig)(struct__sig_mask*pSigMask,
阅读全文
摘要:我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微妙。struct timeval{ long tv_sec; /*秒*/ long tv_usec; /*微秒*/};而直接存储年月日的是一个结构:struct tm{ int tm_sec...
阅读全文
摘要:#include"stdio.h"intdays[2][13]={365,31,28,31,30,31,30,31,31,30,31,30,31,366,31,29,31,30,31,30,31,31,30,31,30,31};intLeap(intyear)//判断是否为闰年{return((year%400==0)||(year%4==0&&year%100!=0));}intDeal(intdat0,intdat1){inti,temp,sum0,sum;intyear0,month0,day0,year1,month1,day1;sum0=sum=0
阅读全文
摘要:/*str_tok.h*/#ifndef_H_STR_TOK#define_H_STR_TOK#include<string.h>#include<stdio.h>#include"FPL_types.h"typedefstruct__NODE{char*pch;struct__NODE*next;}_NODE;typedefstruct__STRCK_TOK{int_MAXLEN;char*pStr;_NODE*phead;void(*setMaxLen)(struct__STRCK_TOK*,int);int(*getMaxLen)(struct
阅读全文
摘要:#include"stdafx.h"#include<stdarg.h>#include<stdio.h>#include<string.h>#include<stdlib.h>#ifndefDEBUG#defineDEBUG1#endif/*enumbool{false=0,true};typedefenumboolbool;*/boolmatch(char*name2,char*pre2);char*FPF_StrSpilit(constchar*str,char*token,constchar*delimit){char
阅读全文