博文

Linux:让内存不再泄漏(转)(2012-02-10 10:21:00)

摘要:  作者:秋冰

  本文将介绍内存泄漏的检测方法以及现在可以使用的工具。针对内存泄漏的问题,本文提供足够的信息,使我们能够在不同的工具中做出选择。

  内存泄漏

  在此,谈论的是程序设计中内存泄漏和错误的问题,不过,并不是所有的程序都有这一问题。首先,泄漏等一些内存方面的问题在有的程序语言中是不容易发生的。这些程序语言一般都认为内存管理太重要了,所以不能由程序员来处理,最好还是由程序语言设计者来处理这些问题,这样的语言有Perl、Java等等。

  然而,在一些语言(最典型的就是C和C++)中,程序语言的设计者也认为内存管理太重要,但必需由开发人员自己来处理。内存泄漏指的是程序员动态分配了内存,但是在使用完成后却忘了将其释放。除了内存泄漏以外,在开发人员自己管理内存的开发中,缓冲溢出、悬摆指针等其它一些内存的问题也时有发生。

  问题缘何产生

  为了让程序能够处理在编译时无法预知的数据占用内存的大小,所以程序必需要从操作系统实时地申请内存,这就是所谓的动态内存。这时候,就会出现程序申请到内存块并且使用完成后,没有将其归还给操作系统的错误。更糟的情况是所获取的内存块的地址丢失,从而系统无法继续识别、定位该内存块。还有其它的问题,比如试图访问已经释放的指针(悬摆指针),再如访问已经被使用了的内存(内存溢出)的问题。

  后果不容忽视

  对于那些不常驻内存的程序来说,由于执行过程很短,所以即使有漏洞可能也不会导致特别严重的后果。不过对于一些常驻内存的程序(比如Web服务器Apache)来说,如果出现这样的问题,后果将非常严重。因为有问题的程序会不断地向系统申请内存,并且不释放内存,最终可能导致系统内存耗尽而导致系统崩溃。此外,存在内存泄漏问题的程序除了会占用更多的内存外,还会使程序的性能急剧下降。对于服务器而言,如果出现这种情况,即使系统不崩溃,也会严重影响使用。

  悬摆指针会导致一些潜在的隐患,并且这些隐患不容易暴发。它非常不明显,因此很难被发现。在这三种存在的问题形式中,缓冲溢出可能是最危险的。......

阅读全文(2488) | 评论:0

Linux2.6内核epoll介绍(转)(2012-01-29 10:07:00)

摘要:http://blog.csdn.net/rstevens/archive/2007/10/30/1858067.aspx http://hi.baidu.com/jmlover/blog/item/24c28b131e6b48d7f7039ee6.html
http://hi.baidu.com/jmlover/blog/item/e64df724f12926348744f91b.html



名词解释:man epoll之后,得到如下结果:

NAME
epoll - I/O event notification facility

SYNOPSIS
#include <sys/epoll.h>

DEscrīptION
epoll is a variant of poll(2) that can be used either as Edge or Level
Triggered interface and scales well to large numbers of watched fds.
Three system calls are provided to set up and control an epoll set:
epoll_create(2), epoll_ctl(2), epoll_wait(2).

阅读全文(3356) | 评论:0

eth0 设备的 MAC 地址与预想的不符(转)(2012-01-19 17:32:00)

摘要:  今天打开虚拟机要做测试,改了IP地址重起network发现报“eth0设备的MAC地址与预想的不符,忽略”错误,上网一查说是因为以前网卡的信息与当前网卡信息记录不符造成,于是按照网上说法进行修改。 vi /etc/sysconfig/network-scripts/ifcfg-eth0后把最后一项的MAC改成当前的MAC信息,重起就好了。 问题很容易解决不过我反复弄了好几次才搞好,有一个这样的疑惑一直不解: 第一次改ifcfg-eth0中的MAC信息前,我是ifconfig命令查看的eth0信息: 察看后把原来的ifcfg-eth0中的MAC信息改好后,service network restart后发现依然报“eth0设备的MAC地址与预想的不符,忽略”错误,于是: 第二次改ifcfg-eth0中的MAC信息,我是ip address show命令查看的eth0信息: 这次改完ifcfg-eth0的MAC信息重起后OK,看来我的MAC是小写的才对,所以第二次没有继续报错。疑惑阿!为什么不同命令看到的MAC信息会有大小写之分内?大牛有知道原因请告知小弟阿。
......

阅读全文(4697) | 评论:0

GCC 提供的原子操作(2012-01-05 10:50:00)

摘要:gcc从4.1.2提供了__sync_*系列的built-in函数,用于提供加减和逻辑运算的原子操作。

其声明如下:

type __sync_fetch_and_add (type *ptr, type value, ...)
type __sync_fetch_and_sub (type *ptr, type value, ...)
type __sync_fetch_and_or (type *ptr, type value, ...)
type __sync_fetch_and_and (type *ptr, type value, ...)
type __sync_fetch_and_xor (type *ptr, type value, ...)
type __sync_fetch_and_nand (type *ptr, type value, ...)


type __sync_add_and_fetch (type *ptr, type value, ...)
type __sync_sub_and_fetch (type *ptr, type value, ...)
type __sync_or_and_fetch (type *ptr, type value, ...)
type __sync_and_and_fetch (type *ptr, type&nbs......

阅读全文(2924) | 评论:0

linux 套接字选项定义(2012-01-05 10:49:00)

摘要:1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket:
BOOL bReuseaddr=TRUE;
setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuseaddr,sizeof(BOOL));
2. 如果要已经处于连接状态的soket在调用closesocket后强制关闭,不经历
TIME_WAIT的过程:
BOOL bDontLinger = FALSE;
setsockopt(s,SOL_SOCKET,SO_DONTLINGER,(const char*)&bDontLinger,sizeof(BOOL));
3.在send(),recv()过程中有时由于网络状况等原因,发收不能预期进行,而设置收发时限:
int nNetTimeout=1000;//1秒
//发送时限
setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//接收时限
setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
4.在send()的时候,返回的是实际发送出去的字节(同步)或发送到socket缓冲区的字节
(异步);系统默认的状态发送和接收一次为8688字节(约为8.5K);在实际的过程中发送数据
和接收数据量比较大,可以设置socket缓冲区,而避免了send(),recv()不断的循环收发:
//接收缓冲区
int nRecvBuf=32*1024;//设置为32K
setsockopt(s,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int));
//发送缓冲区
int nSen......

阅读全文(2501) | 评论:0

placement new(2012-01-05 10:36:00)

摘要:有关placement new
                                             hzh512
&#61656;    placement new的含义
placement new 是重载operator new 的一个标准、全局的版本,它不能够被自定义的版本代替(不像普通版本的operator new 和 operator delete能够被替换)。

void *operator new( size_t, void *p ) throw()     { return p; }

placement new的执行忽略了size_t参数,只返还第二个参数。其结果是允许用户把一个对象放到一个特定的地方,达到调用构造函数的效果。

和其他普通的new不同的是,它在括号里多了另外一个参数。比如:
Widget * p = new Widget; - - - - - - - - - //ordinary new 
pi = new (ptr)&......

阅读全文(1809) | 评论:0

bat命令(2011-12-13 14:35:00)

摘要:在Unix环境下,命令行或者shell中sleep和kill是常见的动作,在Windows的.bat文件中处理类似的任务就不那么直接了,备忘如下:

[sleep]
ping 127.0.0.1 -n 需要的秒数+1 -w 1000 > nul

[kill]
taskkill /f /im "进程名(如notepad.exe)"
taskkill /f /fi "WINDOWTITLE eq notepad*"

其中/f表示强制,/im表示image镜像名(可执行文件名),/fi表示filter,后面跟表达式,比如这里的"窗体标题等于notepad*",支持wildcast通配符。
......

阅读全文(1802) | 评论:0

CentOS SVN服务器的安装与配置(转)(2011-12-12 22:03:00)

摘要: 一般centOS上已经有工具svn了 可以选择安装 查看是否安装了svn工具使用如下指令: rpm -qa | grep subversion 如果已经安装了,则不需要下载包之类的安装了 直接使用就是 如果没有,则从头看起以下这篇转载的文章 安装了一下SVN服务器,本文没有与Apache整合,过程如下: 一,下载相关软件: [root@youxia201 test]# wget http://subversion.tigris.org/downloads/subversion-1.6.1.tar.gz [root@youxia201 test]# wget http://subversion.tigris.org/downloads/subversion-deps-1.6.1.tar.gz 二,安装及配置: 1,解压,要在同一个目录下: [root@youxia201 opt]# tar -zxvf subversion-1.6.1.tar.gz [root@youxia201 opt]# tar -zxvf subversion-deps-1.6.1.tar.gz 2,编译及安装: [root@youxia201 subversion-1.6.1]# ./configure --prefix=/usr/local/svn/ [root@youxia201 subversion-1.6.1]# make && make install 3,把svn相关的命令添加到环境变量中: [root@youxia201 subversion-1.6.1]# echo "export PATH=$PATH:/usr/local/svn/bin/" >> /etc/profile [root@youxia201 subversion-1.6.1]# source /etc/profile [root@youxia201 subversion-1.6.1]# svn svn svnadmin svndumpfilter svnlook svnserve svnsync svnversion 三,建立测试仓库: 1 ,建立 SVN 的根目录,研发中心有多个项目部: [roo......

阅读全文(3266) | 评论:0

C/C++ 宏带来的奇技淫巧(转)(2011-12-05 19:04:00)

摘要:众多C++书籍都忠告我们C语言宏是万恶之首,但事情总不如我们想象的那么坏,就如同goto一样。宏有
一个很大的作用,就是自动为我们产生代码。如果说模板可以为我们产生各种型别的代码(型别替换),
那么宏其实可以为我们在符号上产生新的代码(即符号替换、增加)。 关于宏的一些语法问题,可以在google上找到。相信我,你对于宏的了解绝对没你想象的那么多。如果你
还不知道#和##,也不知道prescan,那么你肯定对宏的了解不够。 我稍微讲解下宏的一些语法问题(说语法问题似乎不妥,macro只与preprocessor有关,跟语义分析又无关): 1. 宏可以像函数一样被定义,例如:
   #define min(x,y) (x<y?x:y) //事实上这个宏存在BUG
   但是在实际使用时,只有当写上min(),必须加括号,min才会被作为宏展开,否则不做任何处理。
  
2. 如果宏需要参数,你可以不传,编译器会给你警告(宏参数不够),但是这会导致错误。如C++书籍中所描
   述的,编译器(预处理器)对宏的语法检查不够,所以更多的检查性工作得你自己来做。 3. 很多程序员不知道的#和##
   #符号把一个符号直接转换为字符串,例如:
   #define STRING(x) #x
   const char *str = STRING( test_string ); str的内容就是"test_string",也就是说#会把其后的符号
   直接加上双引号。
   ##符号会连接两个符号,从而产生新的符号(词法层次),例如:
   #define SIGN( x ) INT_##x
   int SIGN( 1 ); 宏被展开后将成为:int INT_1; 4. 变参宏,这个比较酷,它使得你可以定义类似的宏:
......

阅读全文(2486) | 评论:1

C++特化模板静态成员变量初始化(2011-12-05 15:20:00)

摘要:template<typename T>
struct TFSS
{
    static const char* FMT;
};
template<typename T>
const char* TFSS<T>::FMT = "%s"; template<>
struct TFSS<char>
{
    static const char* FMT;
};
template<>
const char* TFSS<char>::FMT = "%hu"; template<>
struct TFSS<unsigned char>
{
    static const char* FMT;
};
template<>
const char* TFSS<unsigned char>::FMT = "%hd";   代码编译出错 error C2998: “const char *TFSS<char>::FMT”: 不能是模板定义
error C2998: “const char *TFSS<unsigned char>::FMT”: 不能是模板定义 修改成如下代码 template<typename T>
struct TFSS
{
    static const char* FMT;
};
template<typename T>
const char* TFSS<T>::FMT = "%s"; template<>
struct TFSS<char><......

阅读全文(3602) | 评论:0