<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>河马的天空</title>
	<atom:link href="http://blog.donews.com/miman/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.donews.com/miman</link>
	<description>自然，水，那蔚蓝的天空</description>
	<lastBuildDate>Wed, 30 Nov 2011 05:30:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>命令:利用openssl进行BASE64编码解码、md5/sha1摘要、AES/DES3加密解密</title>
		<link>http://blog.donews.com/miman/archive/2011/11/30/1565901.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/11/30/1565901.aspx#comments</comments>
		<pubDate>Wed, 30 Nov 2011 05:29:43 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565901</guid>
		<description><![CDATA[openssl命令 BASE64编码解码 md5/sha1摘要 AES/DES3加密解密]]></description>
			<content:encoded><![CDATA[<p>一. 利用openssl命令进行BASE64编码解码（base64 encode/decode） <br />
    1. BASE64编码命令<br />
       对字符串‘abc’进行base64编码：<br />
           # echo abc | openssl base64<br />
           YWJjCg==  （编码结果）<br />
 <br />
       如果对一个文件进行base64编码（文件名t.txt）：<br />
           # openssl base64 -in t.txt<br />
 <br />
    2. BASE64解码命令<br />
       求base64后的字符串‘YWJjCg==’的原文：<br />
           # echo YWJjCg== | openssl base64 -d<br />
           abc   （解码结果）<br />
 <br />
       如果对一个文件进行base64解码（文件名t.base64）：<br />
           # openssl base64 -d -in t.base64<br />
 <br />
 <br />
二. 利用openssl命令进行md5/sha1摘要（digest） <br />
    1. 对字符串‘abc’进行md5摘要计算：echo abc | openssl md5<br />
       若对某文件进行md5摘要计算：openssl md5 -in t.txt<br />
 <br />
    2. 对字符串‘abc’进行sha1摘要计算：echo abc | openssl sha1<br />
       若对某文件进行sha1摘要计算：openssl sha1 -in t.txt<br />
 <br />
 <br />
三. 利用openssl命令进行AES/DES3加密解密（AES/DES3 encrypt/decrypt）<br />
 <br />
     对字符串‘abc’进行aes加密，使用密钥123，输出结果以base64编码格式给出：<br />
        # echo abc | openssl aes-128-cbc -k 123 -base64<br />
        U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g=   （结果）<br />
 <br />
     对以上结果进行解密处理：<br />
        # echo U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g= | openssl aes-128-cbc -d -k 123 -base64<br />
        abc  （结果）<br />
 <br />
     若要从文件里取原文（密文）进行加密（解密），只要指定 -in 参数指向文件名就可以了。<br />
 <br />
     进行des3加解密，只要把命令中的aes-128-cbc换成des3就可以了。</p>
<p>注：只要利用openssl help就可以看到更多的安全算法了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/11/30/1565901.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ssh的自动登录和rsync的远程目录同步</title>
		<link>http://blog.donews.com/miman/archive/2011/11/04/1565897.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/11/04/1565897.aspx#comments</comments>
		<pubDate>Fri, 04 Nov 2011 02:16:04 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565897</guid>
		<description><![CDATA[ssh-keygen -t rsa
rsync -vzrtopg --rsh=ssh ]]></description>
			<content:encoded><![CDATA[<p>#配置从serverA可以ssh到serverB<br />
ssh-keygen -t rsa<br />
ls /root/.ssh</p>
<p>#追加id_rsa.pub的内容到serverB的authorized_keys<br />
#如果只有一台主机要设置，也可以用如下的命令</p>
<p>scp /root/.ssh/id_rsa.pub serverB:/root/.ssh/authorized_keys<br />
#over！</p>
<p>#执行任务定制<br />
#crontab-e<br />
#增加<br />
#*/1 * * * * sh /opt/tjsync.sh<br />
#<br />
#<br />
rsync -vzrtopg &#8211;rsh=ssh root@192.168.9.107:/home/tj_/home/tj<br />
#<br />
rsync -vzrtopg &#8211;rsh=ssh root@192.168.3.31:/usr/bj_app/news/$(date +%Y%m%d) /opt/news<br />
#</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/11/04/1565897.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>有关OpenSSL使用时资源使用的杂项</title>
		<link>http://blog.donews.com/miman/archive/2011/10/31/1565894.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/10/31/1565894.aspx#comments</comments>
		<pubDate>Mon, 31 Oct 2011 03:04:14 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[未分类]]></category>
		<category><![CDATA[OpenSSL C++ 内存泄漏]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/archive/2011/10/31/1565894.aspx</guid>
		<description><![CDATA[在使用OpenSSL的RSA加解密的时候，发现RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏。网上Baidu、Google之，发现这个相关信息很少（至少中文搜索结果是这样，不知是研究这个的人太少还是这个太基础了。。。），最后终于在某个E文论坛上找到了解决办法。在这里总结了一下，供大家参考。我的OpenSSL版本是0.9.8l。（by 月落上弦）
具体如下：
RSA * rsa = RSA_new();
RSA_free( rsa );
产生内存泄漏：
Debug for memory leaks
Detected memory leaks!
Dumping objects -&#62;
{140} normal block at 0&#215;003B97A0, 12 bytes long.
 Data:  B8 96 3B 00 00 00 00 00 06 00 00 00
{139} normal block at 0&#215;003B9750, 16 bytes long.
 Data:  00 00 00 00 00 00 00 00 00 00 [...]]]></description>
			<content:encoded><![CDATA[<p>在使用OpenSSL的RSA加解密的时候，发现RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏。网上Baidu、Google之，发现这个相关信息很少（至少中文搜索结果是这样，不知是研究这个的人太少还是这个太基础了。。。），最后终于在某个E文论坛上找到了解决办法。在这里总结了一下，供大家参考。我的OpenSSL版本是0.9.8l。（by 月落上弦）</p>
<p>具体如下：<br />
RSA * rsa = RSA_new();<br />
RSA_free( rsa );</p>
<p>产生内存泄漏：</p>
<p>Debug for memory leaks<br />
Detected memory leaks!<br />
Dumping objects -&gt;<br />
{140} normal block at 0&#215;003B97A0, 12 bytes long.<br />
 Data:  B8 96 3B 00 00 00 00 00 06 00 00 00<br />
{139} normal block at 0&#215;003B9750, 16 bytes long.<br />
 Data:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br />
{138} normal block at 0&#215;003B9700, 20 bytes long.<br />
 Data: <P> 00 00 00 00 50 97 3B 00 00 00 00 00 04 00 00 00<br />
{137} normal block at 0&#215;003B96B8, 12 bytes long.<br />
 Data:  06 00 00 00 00 97 3B 00 00 00 00 00<br />
{136} normal block at 0&#215;003B9638, 64 bytes long.<br />
 Data:  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00<br />
{135} normal block at 0&#215;003B9598, 96 bytes long.<br />
 Data:  38 96 3B 00 C0 FD 41 00 B0 FD 41 00 08 00 00 00<br />
Object dump complete.</p>
<p>解决方法很简单：</p>
<p>调用OpenSSL的crypto库，在退出前需要调用API &#8220;CRYPTO_cleanup_all_ex_data&#8221;，清除管理CRYPTO_EX_DATA的全局hash表中的数据，避免内存泄漏。如下：</p>
<p>RSA * rsa = RSA_new();<br />
RSA_free( rsa );<br />
CRYPTO_cleanup_all_ex_data(); </p>
<p>这样就没有内存泄漏了。</p>
<p>需要注意的是，CRYPTO_cleanup_all_ex_data()不能在potential race-conditions条件在调用（不太懂这个术语，我理解的意思是当函数外部存在RSA结构体的时候，在函数内部执行CRYPTO_cleanup_all_ex_data()将导致函数外的RSA结构体也被清理掉），因此最好在程序结束的时候才调用。</p>
<p>关于CRYPTO_cleanup_all_ex_data()的注释说明和代码如下：</p>
<p>/* Release all &#8220;ex_data&#8221; state to prevent memory leaks. This can&#8217;t be made<br />
 * thread-safe without overhauling a lot of stuff, and shouldn&#8217;t really be<br />
 * called under potential race-conditions anyway (it&#8217;s for program shutdown<br />
 * after all). */<br />
void CRYPTO_cleanup_all_ex_data(void)<br />
    {<br />
    IMPL_CHECK<br />
    EX_IMPL(cleanup)();<br />
    }</p>
<p>同样，其他相应的模块也需要在使用后清理：</p>
<p>CONF_modules_unload(1);        //for conf<br />
EVP_cleanup();                 //For EVP<br />
ENGINE_cleanup();              //for engine<br />
CRYPTO_cleanup_all_ex_data();  //generic<br />
ERR_remove_state(0);           //for ERR<br />
ERR_free_strings();            //for ERR</p>
<p>From:  http://www.cnblogs.com/moonset7/archive/2009/12/30/1635770.html 月落上弦</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/10/31/1565894.aspx/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Linux下的异步TCP socket及实例</title>
		<link>http://blog.donews.com/miman/archive/2011/10/10/1565890.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/10/10/1565890.aspx#comments</comments>
		<pubDate>Mon, 10 Oct 2011 03:33:51 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565890</guid>
		<description><![CDATA[在Linux下基于socket的异步通讯可以有多种方式，比较常用的有select方式、epoll方式和异步消息的方式。]]></description>
			<content:encoded><![CDATA[<div id="content" dir="ltr" lang="zh">
<h1 id="Linux.2BTgt2hF8Ca2U-TCP_socket">Linux下的异步TCP socket及实例</h1>
<ul>
<li>同步socket通讯时，程序会阻塞在诸如(connect、accept、recv、recvfrom)等操作上，直到有事件发生时才会继续。</li>
<li>而在异步通讯交互中，两方可以任意发送消息，当有数据要接收时，会收到系统消息提示来接收数据，而不会阻塞。</li>
<li>在Linux下基于socket的异步通讯可以有多种方式，比较常用的有select方式、epoll方式和异步消息的方式。</li>
</ul>
<p> </p>
<h2 id="A.2BTgAwAQ_select.2BZblfD.2F8a-">一、 select方式：</h2>
<ol type="1">
<li>设置放置socket句柄的集合变量</li>
<li>把要判断的socket句柄放到集合</li>
<li>设置超时时间</li>
<li>执行select操作</li>
<li>根据select操作返回值做相应处理（连接、读、写等）</li>
</ol>
<p>例子：</p>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;

#define MYPORT i        1234        // the port users will be connecting to
#define BACKLOG         5           // how many pending connections queue will hold
#define BUF_SIZE        200

int fd_A[BACKLOG];                  // accepted connection fd
int conn_amount;                    // current connection amount

void showclient()
{
    int i;
    printf("client amount: %d\n", conn_amount);
    for (i = 0; i &lt; BACKLOG; i++) {
        printf("[%d]:%d  ", i, fd_A[i]);
    }
    printf("\n\n");
}

int main(void)
{
    int sock_fd, new_fd;    // listen on sock_fd, new connection on new_fd
    struct sockaddr_in server_addr;     // server address information
    struct sockaddr_in client_addr;     // connector's address information
    socklen_t sin_size;
    int yes = 1;
    char buf[BUF_SIZE];
    int ret;
    int i;

    if ((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    if (setsockopt(sock_fd, SOL_SOCKET, SO_REUSEADDR, &amp;yes, sizeof(int)) == -1) {
        perror("setsockopt");
        exit(1);
    }

    server_addr.sin_family = AF_INET;         // host byte order
    server_addr.sin_port = htons(MYPORT);     // short, network byte order
    server_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
    memset(server_addr.sin_zero, '', sizeof(server_addr.sin_zero));
    if (bind(sock_fd, (struct sockaddr *)&amp;server_addr, sizeof(server_addr)) == -1) {
        perror("bind");
        exit(1);
    }

    if (listen(sock_fd, BACKLOG) == -1) {
        perror("listen");
        exit(1);
    }

    printf("listen port %d\n", MYPORT);
    fd_set fdsr;
    int maxsock;
    struct timeval tv;
    conn_amount = 0;
    sin_size = sizeof(client_addr);
    maxsock = sock_fd;
    while (1) {
        // initialize file descriptor set
        FD_ZERO(&amp;fdsr);
        FD_SET(sock_fd, &amp;fdsr);
        // timeout setting
        tv.tv_sec = 30;
        tv.tv_usec = 0;
        // add active connection to fd set
        for (i = 0; i &lt; BACKLOG; i++) {
            if (fd_A[i] != 0) {
                FD_SET(fd_A[i], &amp;fdsr);
            }
        }

        ret = select(maxsock + 1, &amp;fdsr, NULL, NULL, &amp;tv);
        if (ret &lt; 0) {
            perror("select");
            break;
        } else if (ret == 0) {
            printf("timeout\n");
            continue;
        }

        // check every fd in the set
        for (i = 0; i &lt; conn_amount; i++) {
            if (FD_ISSET(fd_A[i], &amp;fdsr)) {
                ret = recv(fd_A[i], buf, sizeof(buf), 0);
                if (ret &lt;= 0) {        // client close
                    printf("client[%d] close\n", i);
                    close(fd_A[i]);
                    FD_CLR(fd_A[i], &amp;fdsr);
                    fd_A[i] = 0;
                }
                else {        // receive data
                    if (ret &lt; BUF_SIZE)
                        memset(&amp;buf[ret], '', 1);
                    printf("client[%d] send:%s\n", i, buf);
                }
            }
        }

        // check whether a new connection comes
        if (FD_ISSET(sock_fd, &amp;fdsr)) {
            new_fd = accept(sock_fd, (struct sockaddr *)&amp;client_addr, &amp;sin_size);
            if (new_fd &lt;= 0) {
                perror("accept");
                continue;
            }

            // add to fd queue
            if (conn_amount &lt; BACKLOG) {
                fd_A[conn_amount++] = new_fd;
                printf("new connection client[%d] %s:%d\n", conn_amount,inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
                if (new_fd &gt; maxsock)
                    maxsock = new_fd;
            }

            else {
                printf("max connections arrive, exit\n");
                send(new_fd, "bye", 4, 0);
                close(new_fd);
                break;
            }
        }
        showclient();
    }

    // close other connections
    for (i = 0; i &lt; BACKLOG; i++) {
        if (fd_A[i] != 0) {
            close(fd_A[i]);
        }
    }
    return 0;
}</pre>
<p> </p>
<h2 id="A.2BTowwAQ_epool.2BZblfDw-">二、 epool方式</h2>
<ol type="1">
<li>用epoll_create建立epool句柄</li>
<li>控制socket行为epoll_ctl</li>
<li>等待socket状态处理epoll_wait</li>
</ol>
<p>例子：</p>
<pre>#include &lt;sys/socket.h&gt;
#include &lt;sys/epoll.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdio.h&gt;
#include &lt;errno.h&gt;
#include &lt;iostream&gt;

using namespace std;

#define MAX_EVENTS 500

struct myevent_s
{
    int fd;
    void (*call_back)(int fd, int events, void *arg);
    int events;
    void *arg;
    int status; // 1: in epoll wait list, 0 not in
    char buff[128]; // recv data buffer
    int len;
    long last_active; // last active time
};

// set event
void EventSet(myevent_s *ev, int fd, void (*call_back)(int, int, void*), void *arg)
{
    ev-&gt;fd = fd;
    ev-&gt;call_back = call_back;
    ev-&gt;events = 0;
    ev-&gt;arg = arg;
    ev-&gt;status = 0;
    ev-&gt;last_active = time(NULL);
}

// add/mod an event to epoll
void EventAdd(int epollFd, int events, myevent_s *ev)
{
    struct epoll_event epv = {0, {0}};
    int op;
    epv.data.ptr = ev;
    epv.events = ev-&gt;events = events;
    if(ev-&gt;status == 1){
        op = EPOLL_CTL_MOD;
    }
    else{
        op = EPOLL_CTL_ADD;
        ev-&gt;status = 1;
    }
    if(epoll_ctl(epollFd, op, ev-&gt;fd, &amp;epv) &lt; 0)
        printf("Event Add failed[fd=%d]\n", ev-&gt;fd);
    else
        printf("Event Add OK[fd=%d]\n", ev-&gt;fd);
}

// delete an event from epoll
void EventDel(int epollFd, myevent_s *ev)
{
    struct epoll_event epv = {0, {0}};
    if(ev-&gt;status != 1) return;
    epv.data.ptr = ev;
    ev-&gt;status = 0;
    epoll_ctl(epollFd, EPOLL_CTL_DEL, ev-&gt;fd, &amp;epv);
}

int g_epollFd;
myevent_s g_Events[MAX_EVENTS+1]; // g_Events[MAX_EVENTS] is used by listen fd
void RecvData(int fd, int events, void *arg);
void SendData(int fd, int events, void *arg);

// accept new connections from clients
void AcceptConn(int fd, int events, void *arg)
{
    struct sockaddr_in sin;
    socklen_t len = sizeof(struct sockaddr_in);
    int nfd, i;
    // accept
    if((nfd = accept(fd, (struct sockaddr*)&amp;sin, &amp;len)) == -1)
    {
        if(errno != EAGAIN &amp;&amp; errno != EINTR)
        {
            printf("%s: bad accept", __func__);
        }
        return;
    }
    do
    {
        for(i = 0; i &lt; MAX_EVENTS; i++)
        {
            if(g_Events[i].status == 0)
            {
                break;
            }
        }
        if(i == MAX_EVENTS)
        {
            printf("%s:max connection limit[%d].", __func__, MAX_EVENTS);
            break;
        }
        // set nonblocking
        if(fcntl(nfd, F_SETFL, O_NONBLOCK) &lt; 0) break;
        // add a read event for receive data
        EventSet(&amp;g_Events[i], nfd, RecvData, &amp;g_Events[i]);
        EventAdd(g_epollFd, EPOLLIN|EPOLLET, &amp;g_Events[i]);
        printf("new conn[%s:%d][time:%d]\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), g_Events[i].last_active);
    }while(0);
}

// receive data
void RecvData(int fd, int events, void *arg)
{
    struct myevent_s *ev = (struct myevent_s*)arg;
    int len;
    // receive data
    len = recv(fd, ev-&gt;buff, sizeof(ev-&gt;buff)-1, 0);
    EventDel(g_epollFd, ev);
    if(len &gt; 0)
    {
        ev-&gt;len = len;
        ev-&gt;buff[len] = '';
        printf("C[%d]:%s\n", fd, ev-&gt;buff);
        // change to send event
        EventSet(ev, fd, SendData, ev);
        EventAdd(g_epollFd, EPOLLOUT|EPOLLET, ev);
    }
    else if(len == 0)
    {
        close(ev-&gt;fd);
        printf("[fd=%d] closed gracefully.\n", fd);
    }
    else
    {
        close(ev-&gt;fd);
        printf("recv[fd=%d] error[%d]:%s\n", fd, errno, strerror(errno));
    }
}

// send data
void SendData(int fd, int events, void *arg)
{
    struct myevent_s *ev = (struct myevent_s*)arg;
    int len;
    // send data
    len = send(fd, ev-&gt;buff, ev-&gt;len, 0);
    ev-&gt;len = 0;
    EventDel(g_epollFd, ev);
    if(len &gt; 0)
    {
        // change to receive event
        EventSet(ev, fd, RecvData, ev);
        EventAdd(g_epollFd, EPOLLIN|EPOLLET, ev);
    }
    else
    {
        close(ev-&gt;fd);
        printf("recv[fd=%d] error[%d]\n", fd, errno);
    }
}

void InitListenSocket(int epollFd, short port)
{
    int listenFd = socket(AF_INET, SOCK_STREAM, 0);
    fcntl(listenFd, F_SETFL, O_NONBLOCK); // set non-blocking
    printf("server listen fd=%d\n", listenFd);
    EventSet(&amp;g_Events[MAX_EVENTS], listenFd, AcceptConn, &amp;g_Events[MAX_EVENTS]);
    // add listen socket
    EventAdd(epollFd, EPOLLIN|EPOLLET, &amp;g_Events[MAX_EVENTS]);
    // bind &amp; listen
    sockaddr_in sin;
    bzero(&amp;sin, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(port);
    bind(listenFd, (const sockaddr*)&amp;sin, sizeof(sin));
    listen(listenFd, 5);
}

int main(int argc, char **argv)
{
    short port = 12345; // default port
    if(argc == 2){
        port = atoi(argv[1]);
    }
    // create epoll
    g_epollFd = epoll_create(MAX_EVENTS);
    if(g_epollFd &lt;= 0) printf("create epoll failed.%d\n", g_epollFd);
    // create &amp; bind listen socket, and add to epoll, set non-blocking
    InitListenSocket(g_epollFd, port);
    // event loop
    struct epoll_event events[MAX_EVENTS];
    printf("server running:port[%d]\n", port);
    int checkPos = 0;
    while(1){
        // a simple timeout check here, every time 100, better to use a mini-heap, and add timer event
        long now = time(NULL);
        for(int i = 0; i &lt; 100; i++, checkPos++) // doesn't check listen fd
        {
            if(checkPos == MAX_EVENTS) checkPos = 0; // recycle
            if(g_Events[checkPos].status != 1) continue;
            long duration = now - g_Events[checkPos].last_active;
            if(duration &gt;= 60) // 60s timeout
            {
                close(g_Events[checkPos].fd);
                printf("[fd=%d] timeout[%d--%d].\n", g_Events[checkPos].fd, g_Events[checkPos].last_active, now);
                EventDel(g_epollFd, &amp;g_Events[checkPos]);
            }
        }
        // wait for events to happen
        int fds = epoll_wait(g_epollFd, events, MAX_EVENTS, 1000);
        if(fds &lt; 0){
            printf("epoll_wait error, exit\n");
            break;
        }
        for(int i = 0; i &lt; fds; i++){
            myevent_s *ev = (struct myevent_s*)events[i].data.ptr;
            if((events[i].events&amp;EPOLLIN)&amp;&amp;(ev-&gt;events&amp;EPOLLIN)) // read event
            {
                ev-&gt;call_back(ev-&gt;fd, events[i].events, ev-&gt;arg);
            }
            if((events[i].events&amp;EPOLLOUT)&amp;&amp;(ev-&gt;events&amp;EPOLLOUT)) // write event
            {
                ev-&gt;call_back(ev-&gt;fd, events[i].events, ev-&gt;arg);
            }
        }
    }
    // free resource
    return 0;
}</pre>
<p> </p>
<h2 id="A.2BTgkwAQ_.2BXwJrZZAad.2BU-">三、 异步通知</h2>
<ol type="1">
<li>定义信号处理函数</li>
<li>设置socket的消息进程id</li>
<li>设置socket消息</li>
<li>信号等待和处理</li>
</ol>
<p>例子：</p>
<pre>#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;unistd.h&gt;
#include &lt;fcntl.h&gt;
#include &lt;errno.h&gt;
#include &lt;string.h&gt;
#include &lt;signal.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;sys/ioctl.h&gt;

#define MAX_LENTH 1500

#define SIG_FIFO_IO SIGRTMIN+1

static char recv_buf[MAX_LENTH] = {0};

int main(int argc, char *argv[])
{
    int sockfd, on = 1;
    struct sigaction action;
    sigset_t newmask, oldmask;
    struct sockaddr_in addr;

    memset(&amp;addr, 0, sizeof(addr));
    addr.sin_family =  AF_INET;
    addr.sin_addr.s_addr = INADDR_ANY;
    addr.sin_port = htons(50001);
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
        perror("Create socket failed");
        exit(-1);
    }
    if (bind(sockfd, (struct sockaddr *)&amp;addr, sizeof(addr)) == -1) {
        perror("Bind socket failed");
        exit(-1);
    }

    if (fcntl(sockfd, F_SETOWN, getpid()) == -1) {
        perror("Fcntl F_SETOWN failed");
        exit(-1);
    }
    if (fcntl(sockfd, F_SETSIG, SIG_FIFO_IO) == -1) {
        perror("Fcntl F_SETSIG failed");
        exit(-1);
    }
    if (ioctl(sockfd, FIOASYNC, &amp;on) == -1) {
        perror("Ioctl FIOASYNC failed");
        exit(-1);
    }

    int rcvd_sig, len;
    siginfo_t info;
    sigemptyset(&amp;newmask);
    sigaddset(&amp;newmask, SIG_FIFO_IO);
    sigprocmask(SIG_BLOCK, &amp;newmask, &amp;oldmask);

    while (1) {
        rcvd_sig = sigwaitinfo(&amp;newmask, &amp;info);//siginfo中的_sigpool{si_band, si_fd},其中si_fd为socket的文件描述符值

        if (rcvd_sig == -1) {
            perror("sigio: sigwaitinfo");
            exit(-1);
        }
        else {
            printf("Signal %d, socket fd %d  received from socket\n",
                    rcvd_sig, info.si_fd);
            len = recv(sockfd, recv_buf, MAX_LENTH, MSG_DONTWAIT);
            if( len&gt;0)
                puts( recv_buf);
            exit(-1);
        }
    }
    exit(0);
}</pre>
<p> </p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/10/10/1565890.aspx/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>中风放血救命法……不信中医的千万不要看</title>
		<link>http://blog.donews.com/miman/archive/2011/09/20/1565888.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/09/20/1565888.aspx#comments</comments>
		<pubDate>Tue, 20 Sep 2011 05:40:34 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[保健养生]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565888</guid>
		<description><![CDATA[为了父母,你需要知道患了中风，脑部的微血管，会慢慢的破裂，遇到这种情形，千万别慌，患者无论在什么地方 (不管是浴室、卧房或客厅），千万不可搬动他。因为，如果移动，会加速微血管的破裂。所以要先原地把患者扶起坐稳以防止再摔倒，这时才开始（放血）。 
]]></description>
			<content:encoded><![CDATA[<p>关心你的父母，就应该好好的看看，事后的补救措施都显得太晚了。了解知识，预防意外，有备无患！<br />
    </p>
<p>    为了父母,你需要知道患了中风，脑部的微血管，会慢慢的破裂，遇到这种情形，千万别慌，患者无论在什么地方 (不管是浴室、卧房或客厅），千万不可搬动他。因为，如果移动，会加速微血管的破裂。所以要先原地把患者扶起坐稳以防止再摔倒，这时才开始（放血）。<br />
    家中如有专为注射用的针，当然最好。如果没有，就拿缝衣用的钢针，就在患者的十个手指头尖儿（没有固定穴道，大约距离手指甲一分之处）刺上去，要刺出血来 (万一血不出来，可用手挤），等十个手指头都流出 血来(每指一滴)，大约几分钟之后，患者就会自然清醒。如果嘴也歪了，就拉他的耳朵，把耳朵拉红，在两耳的耳垂儿的部位，各刺两针，也各流两滴血，几分钟以后，嘴就恢复原状了。 等患者一切恢复正常感觉没有异状时再送医，就一定可以转危为安，否则，若是急着抬上救护车送医，经一路的颠跛震动恐怕还没到医院，他脑部微血管，差不多已经都破裂了。<br />
    放血救命法，是住在新竹的中医师夏伯挺先生说的。且是经自己亲身实验，敢说百分之百有效。大概是民国六十八年一位在台中逢甲学院任教的教师，有天上午正在上课，一位老师跑到他的教室上气不接下气的说∶刘老师快来，主任中风了；他立刻跑到三楼， 看到陈幅添主任，气色不正，语意模糊，嘴也歪了，很明显的是中风了。立即请工读生到校门外的西药房，买来一支注射用的针头，就在陈主任十个手指头上直刺。等十个手指尖儿都见血了（豆粒似的一滴），大约几分钟以后，陈主任的气色就变过来了，两眼也有神了，只有嘴还歪着，他就拉搓陈主任的耳朵，使之充血，等把耳朵拉红，就在左右耳垂之处，各刺两针，待两耳垂都流出两滴血来，奇迹就出现了，大约不到三五分钟，他的嘴形，恢复正常了，说话也清清楚楚了。让陈主任坐一阵子，喝了一杯热茶，才扶他下楼，开车送到惠华医院，打一罐点滴，休息了一夜，第二天就出院回学校上课了。一切照常工作，毫无后遗症。反观一般脑中风患者，都是送医院治疗时，经过一路震荡血管急速破裂，以致多数患者一病不起，所以脑中风，在死因排行榜上高居第二位，其最幸运者，也仅能保住老命，而落得终身残废。这是一个多么可怕的病症。<br />
    如果大家都能记住这（放血救命)的方法，立刻施救，在短短时间它能起死回生，而且保证百分之百的正常。<br />
    这个急救法，希望大家告诉大家。<br />
哪 些 食 物 能 杀 死 体 内 癌 细 胞</p>
<p>1）茄子：“霜打茄子”是好药<br />
     中药许多方剂及民间验方中，时常使用“秋后老茄子”、“霜打茄子”。越来越多证据表明，茄子具有抗癌功能。曾有试验从茄子中提取的一种无毒物质，用于治疗胃癌、子宫颈癌等收到良效。另外，茄子中含有龙葵碱、葫芦素、水苏碱、胆碱、紫苏甙、茄色甙等多种生物碱物质，其中龙葵碱、葫芦素被证实具有抗癌能力，茄花、茄蒂、茄根、茄汁皆为良药，古代就有用茄根治疗肿瘤的记载。<br />
     茄子还含有丰富的营养成分，除维生素A、C偏低外，其他维生素和矿物质几乎跟西红柿差不多，而蛋白质和钙甚至比西红柿高3倍。<br />
2）苦瓜：李时珍称其为“一等瓜”<br />
     苦瓜在民间受到的待遇两极分化严重，不少人很“好”这一口，也有人对其敬而远之。但真正给它“好身份”的却是明代大医学家李时珍，他称其为“一等瓜”，是不可多得的抗癌瓜。<br />
     西医更证明，苦瓜的抗癌功效来自一种类奎宁蛋白，它是一种能激活免疫细胞的活性蛋白，通过免疫细胞做“二传手”，将癌细胞或其他不正常的细胞杀掉。苦瓜种子中含有一种蛋白酶抑制剂，能抑制肿瘤细胞分泌蛋白酶，从而抑制癌细胞的侵袭和转移。</p>
<p>3）海带：可预防乳腺癌和甲状腺肿瘤<br />
     海带中药名为“昆布”，可预防乳腺癌和甲状腺肿瘤。海带富含碘，能防“大脖子”病在中国已经妇孺皆知，实际上，海带还有其他诸多“本领”，它含的海藻酸钠与具致癌作用的锶、镉有很强的结合能力，并将它们排出体外；海带可选择性杀灭或抑制肠道内能够产生致癌物的细菌，所含的纤维还能促进胆汁酸和胆固醇的排出；海带提取物对各种癌细胞有直接抑制作用。</p>
<p>4）地瓜：逐渐被淡忘的抗癌佳品<br />
     小时候冬天捧着香喷喷的烤红薯边暖手边解馋的日子已经淡出不少年轻人的记忆，过去走街串巷的卖烤红薯摊现在几乎无迹可寻，随着经济条件的好转，有调查表明，我国城镇居民不少人已不再食用地瓜。<br />
     地瓜：别名甘薯、红薯、白薯，被认为是祛病延年、减肥保健的绝佳食品。</p>
<p>其实地瓜也有强大的防癌功能。最近科技人员在地瓜中发现了一种去氢表雄酮的物质，它能预防肠癌和乳腺癌的发生。</p>
<p>5）南瓜：被誉为“神瓜”<br />
     在某些国家它被誉为“神瓜”，因为它既可为粮，又可为菜。美国人在感恩节都要吃南瓜，以表示对南瓜的谢意。但是，在我国，现已很少种植。<br />
     南瓜可预防肥胖、糖尿并高血脂和高胆固醇血症，对癌症预防有很好的效果，南瓜维生素A的含量之高，是常人无法想象的。另外含有丰富的维生素C、钙质和纤维素，还含有抑制致癌物色氨酸-P的不明成分。<br />
6）麦麸：最好的防癌食物纤维<br />
     别名麸子，小麦磨粉时脱下的种皮，用作饲料，不食用。用麦麸喂牲口，皮肤红润，毛发油亮，极显健康状，现麦麸日益受到人们的重视，为了健康，西方不少机构号召人们吃全谷食物、全麦食物。全麦食物即把小麦全粒磨成面粉丁再分出麦麸，用这种粉制成的食品。<br />
     麦麸是小麦主要营养成分的“仓库”，B族维生素、硒、镁等矿物质及纤维素几乎都集中在它身上。它能预防并治疗结直肠癌、糖尿并高胆固醇血症、高脂血症、便秘、痔疮等。因此，不少专家认为，麦麸是最好的防癌食物纤维。<br />
7）萝卜：根茎类蔬菜中的“健康保护神”<br />
     萝卜别名莱菔，品种多，皆为抗癌能手，所以有农谚：“冬吃萝卜夏吃姜，一生不用跑药堂”以及“十月萝卜水人参”之说。荷兰人定胡萝卜为“国菜”，日本、美国认为它是根茎类蔬菜中的“健康保护神”。<br />
     萝卜具抗癌、宽胸、化痰、利尿之功能。萝卜中含有多种酶，能消除亚硝胺的致癌作用，其中的本质素能刺激肌体免疫力，提高巨噬细胞的活性，增强其吞噬杀灭癌细胞的能力。萝卜的辣味来自芥子油，它可刺激肠蠕动，促进致癌物的排除，萝卜中还含有许多抑制致突变活性的不明成分。萝卜中维生素C含量比苹果、梨高出8&#8211;10倍。而胡萝卜因含丰富的胡萝卜素，也具有极好的防癌作用。<br />
8）猕猴桃：维生素C含量居水果之冠<br />
     棕色，形似土豆，其内碧绿如翡翠，甘酸可口，本是南方山区野果，现在已移栽到全国各地。其果实富含糖、蛋白质、类脂、维生素、有机酸及多种矿物质。维生素C含量居水果之冠，每100克果子含200毫克，几乎是柑橘的100倍，西红柿的30倍，是名副其实的“天然维生素C片”，另外还含有丰富的具有保护血管功能的维生素P，其营养价值甚高。<br />
高血压单方－效果：永远断根，屡试屡效治疗高血压一方</p>
<p>一患高血压两年之久，高压一百八十四、低压九十左右，无法工作。後食用了一个偏方，谁知吃了一副就好了。</p>
<p>其方是∶精选山里红三斤、生地一两、白糖适量。山里红洗净去子放不锈钢锅内煮烂，放入白糖，煮熟凉後放冰箱储藏。每天不计时食用，就像吃零食。轻者一副重者三副。<br />
高血压秘方</p>
<p>药方:白胡椒7粒,南杏仁4粒,糯米7粒,桃仁2两,枝子1两。</p>
<p>说明（１）将上列五物研成粉末。</p>
<p>（２）用鸡蛋的蛋白混合后，捏成饼状。</p>
<p>（３）晚上睡前贴在脚底心上。男左女右，用纱布包好。</p>
<p>（４）第二天早晨起床后除去。（一副只能用一次）</p>
<p>（５）如脚上发现有青色，乃正常现象。</p>
<p>（６）轻者三服，重者五服，连续使用，不可隔天。</p>
<p>注意：此方忌口服。</p>
<p>效果：永远断根，屡试屡效，患者受益甚多。<br />
降血压奇圣方&#8211;5天降血压&#8211;安全不复发</p>
<p>　配方：取新鲜莲藕2.5斤切碎，生芝麻1斤压碎，加冰糖1斤压碎放锅内蒸熟。取出等晾时分5等份。每天服用一份，一般5天可以降到正常血压。较重者再服5天。安全可靠。</p>
<p>花生全草治疗高血压</p>
<p>花生全草（整棵草）一次５０克，切段煎水．干品一次５０克，鲜品一次１５０克．一它一剂．血压正后可改为不定期服用．巩固疗效．</p>
<p>主治：清热凉血，有降血压，降胆固醇作用，对治疗高血压有较理想的功效！<br />
花生加醋治疗高血压</p>
<p>花生半碗（大碗，带红衣）加上好醋慢一碗．泡上７天，每天早晚各吃１０粒．</p>
<p>等血压降下来后可改为几天服用一次．巩固疗效．</p>
<p>主治：清热活血，用治高血压，对保护血管壁，阻止血栓形成有较好的作用（高血压）</p>
<p>本人系转载的 不知此方效果如何 请你咨询后再用 祝福您健康快乐！</p>
<p>减肥：红绿豆粥 2周减18斤<br />
　　有人只坚持了两个星期，体重就从12月初的54公斤变成了现在的46公斤……</p>
<p>　　材料：红豆100克，绿豆100克，山楂30克，大枣10枚</p>
<p>　　做法：将所有材料共放在锅中，加1000毫升冷水，煎到豆烂即可。</p>
<p>　　(温馨提示：红豆和绿豆煮之前最好用冷水泡一个小时，会比较容易煮烂的)</p>
<p>　　食用方法：做好后，分两等份，一份趁热时，连汤带豆和山楂，枣一起吃下。另外一份就用保鲜膜包好放冰箱中冷藏。</p>
<p>　　温馨提示：具体的克数去买的时候请人家帮你称下，看看100克大概有多少，回来就好办了，有点误差不要紧的</p>
<p>　　注意：要趁热时吃，效果才最好。另外一份吃之前热下就可以了。</p>
<p>　　原理：红豆，绿豆都是排毒圣品，并且有高纤维低脂肪的特点。山楂健脾开胃，消食减脂。红枣调和胃气补血润燥。此方共用，有助各种单品的功效最大限度的发挥。</p>
<p>　　其实，每次食用只是这个半份的量（就是红豆50克，绿豆50克，生山楂15克，大枣5枚），但我自己为了省事，每天晚上煎好，分两等份，一份晚上吃，另外一份留第二天早上吃！</p>
<p>　　为了获得更好的效果，在减肥期间，您的生活要严格遵守如下日程安排：</p>
<p>　　首先：每天早上起床后的第一件事就是喝一杯蜜醋水，就是在250毫升的温开水中加入一汤匙蜂蜜和1/4汤匙的醋(最好是白醋)，搅拌均匀后喝下。蜜醋水可以充分清洗肠胃，加速胃肠的蠕动，将体内的毒素更快更完全的排除。早饭就是上面那个减肥汤。</p>
<p>　　其次：除了这个减肥粥，上下午的时光不吃任何零食。</p>
<p>　　最后：晚上也只是吃上面那个减肥粥，并且保证在7点之前吃完，吃完后睡觉前也绝不吃任何东西。</p>
<p>　　就这样，有人只坚持了两个星期，体重就从12月初的54公斤变成了现在的46公斤。还有一个好消息要告诉JMS，我用这个方减肥成功后，不仅没有因为迅速瘦下来皮肤变得暗淡无光泽，而且肌肤变的比以前好红润清透，青春痘也少了，真是一举多得！</p>
<p>　　最后的温馨提示：很多朋友都对午饭什么都不吃有点打怵。其实饮食控制是任何减肥方都需要，但怎么控制也是有讲究的。如何控制取决于你想要达到的效果，这个可以根据自己的实际情况灵活掌握和安排的，不是绝对的。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/09/20/1565888.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>转帖：白岩松博文&#8211;中石油，卖国贼</title>
		<link>http://blog.donews.com/miman/archive/2011/06/27/1565886.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/06/27/1565886.aspx#comments</comments>
		<pubDate>Mon, 27 Jun 2011 01:22:23 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[记录]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565886</guid>
		<description><![CDATA[为什么中国到处援助别国，却缺少朋友。  中国人都有这样的感慨，为什么我们在国力并不雄厚，人民并不富裕的情况下，宁可自己受穷，倾尽国力去支援一些国家，却并没有得到友谊。中国人勒紧裤带，把最好的物质奉献给我们的朋友，结果往往是反目为仇。......]]></description>
			<content:encoded><![CDATA[<h3>转帖：白岩松博文&#8211;中石油，卖国贼</h3>
<div>中石油，卖国贼？</div>
<div>
白岩松：为什么中国到处援助别国，却缺少朋友。  中国人都有这样的感慨，为什么我们在国力并不雄厚，人民并不富裕的情况下，宁可自己受穷，倾尽国力去支援一些国家，却并没有得到友谊。中国人勒紧裤带，把最好的物质奉献给我们的朋友，结果往往是反目为仇。当年在我们国家粮食非常紧张的时候，我们用宝贵的外汇购买粮食支援阿尔巴尼亚，但最后两国反目为仇；我们无偿支援越南，最后却兵戎相见；我们支援朝鲜石油、粮食，却发现那是个填不满的无底洞；我们支援外蒙古建设，他们却把中国工人关进监狱；我们支持非洲国家建立工厂，他们却责怪中国设备落后。这些受援国家的政府和平民并没有对中国有好感，中国的牺牲和奉献得不到友谊，难道中国人是天底下最大最大的傻瓜？白岩松告诉了我们为什么。白岩松说，他到美国参观了一家报纸博物馆，这里珍藏了世界主要国家的报纸。美国9.11恐怖袭击后，世界几乎所有9月12号的报纸头条都是关于9.11的报道，唯一只有中国的报纸头条是领导人的接见活动。白岩松感慨道，中国与世界脱节最大的是普世价值，中国与世界其他国家没有共同的价值观，所以得不到朋友。   9月22号，温家宝在联合国千年发展目标高级会议讲话时说，2009年底，中国免除了50个穷国的256亿元人民币债务。   温家宝还说：2008年6月底，中国累计免除亚非等49个重债穷国和最不发达国家债务247亿元；提供各类援款2065亿元，其中无偿援助908亿元；对42个最不发达国家的商品给予零关税待遇，税目为736-1115个，占最不发达国家对中国出口贸易额的98％。中国还为非洲培训了15000名各类人才，派遣100名高级农业技术专家，派出医疗队，援建30所医院、100所农村学校，无偿提供防治疟疾药物。2007年底中国为增强非洲的自我发展能力，决定提供23.77亿元的无偿援助和7亿元的无息贷款&#8230;&#8230;  最近几年来，中国灾难频发，汶川地震、冰雪灾害、西南旱灾、玉树地震、泥石流……灾害不断。根据相关数据，玉树地震，国家财政拨款5亿元。西南大旱灾，国家拨款1.26亿元……  2000年10月，在中非合作论坛首届部长级会议上，中国政府首次宣布在两年内减免32个非洲国家总额达100亿人民币的债务。  截至05年底，减免44个发展中国家总计198笔价值约166亿元人民币债务。  2008年6月，向朝鲜捐赠了5000吨航空油和1亿元人民币，共计1500万美元。  2009年3月，提供阿富汗7500万美元贷款全部转为无偿援助。2009年全年，免除了46个国家的400多亿元债务。  2010年2月，中国国务院批准了减免伊拉克欠华债务的80%，约为68亿美元。当月，由于朝鲜货币改革失败，传中国将向朝鲜提供100亿美元援助。  2010年4月，中国政府向委内瑞拉提供200亿美元贷款。  2010年8月，央视新闻联播同时出现两条新闻：一、为支持俄罗斯抗灾，中国将捐赠100万美元现金和价值2000万人民币的物资；二、甘肃舟曲缺乏饮用水和方便面，政府号召大家积极捐款。  评论家夏小强在《如此国际主义为哪般？》的文章中指出：中国的失、辍学儿童人数世界第一；中国是目前世界上唯一还在针对初、中等教育征收高昂学费的大国，而其他大国都免费向她的国民提供；中国九亿农民几乎没有任何医疗社会保障，世界第一。而XX却不顾民众的生活在用大把金钱买他国的欢心。  有不少网友指问：我国是发达国家了吗？中国有钱吗？有没有钱老百姓说了算。什么时候也可以减免一下自己国内穷人的债务呢？  还有网友表示，看来政府还是不缺钱，以后捐款要审慎考虑了。   前几天，中石油给日本捐款3000万，昨天又向日本无偿提供3万吨汽油，真是大手笔！总价已经接近2个亿！日本人感叹了：真是一个不错的慈善家！可四川汶川大地震看看中石油中石化做了什么？ 2005年和2006年，中石化分别获得国家财政补贴100亿元和50亿元，2008年中国石化公告称，公司获得财政补贴123亿元，其中49亿元计入公司2007年补贴收入，74亿元计入2008年第一季度补贴收入。 2007年3月19日中石油昨宣布：去年盈利超1422亿元，再创历史最好水平，中石油在2005年以1333亿元的盈利首次超过汇丰成为亚洲最赚钱公司。中石油集团总经理蒋洁敏在中央企业负责人会议上说：“中石油是亚洲最盈利的公司，不是之一，是第一。” 2007年11月5日中石油在上海证券交易所上市交易，11月19日开始作为权重股计入上证综合指数和沪深300指数。16.7元的网上申购价，48.6元的开盘价，上市开盘价几乎达到发行价的3倍，中石油股的上市，让很多人体验到了幸福的一刻。然而乐极生悲，也正是由于中石油高价开盘套牢了数不清的普通投资者。中石油、中石化，拿了那么多说不通的政府补贴，又圈了那么多股民的钱，外加“亚洲最赚钱的企业”的称号，可谓里子、面子全赚足了。国难当头，汶川地震，中国人有钱的出钱、有力的出力，倾举国之力，共渡难关之时，中石油、中石化，仅仅一家拿出1000万捐款。四川地震，全国人民的慷慨解囊，让世人看到大灾之中的大爱，但中石油、中石化，让我们看到的是什么？如今，一个曾经对我国犯过永远不可饶恕罪行的日本受到灾害，死亡人数仅仅是中国汶川地震人数的十分之一，你就连钱带油捐了两个亿！！！而让国内民众却在用世界上几乎最低的工资加着世界上最昂贵的汽油！你们究竟还是不是中国人？这个企业究竟还是不是中国人的企业？！难道日本人是你们的亲爹？要不你们为何做出如此对敌慈悲对友刁的荒唐事？！只能有一个词可以刻画你们的嘴脸——卖国贼！                                                                    气愤！！！气愤！！！日本人地震后说我们中国不为它们捐款，居然还当场焚烧中国国旗！我对天发誓 如果三个月没有1百万人转的话这表示我们中国人真的败了 是中国人转发顶起来! 让我们铭记这耻辱。是中国人请转发此说说【看了不转不配做中国人】  坚决反对为鬼子捐款！捐款者为新时代汉奸！卖国贼！  不是地震，是南京的三十万野鬼在颤抖；也不是海啸，是东三省流浪的孤魂在咆哮；更不是什么核辐射，是731部队科技发展的后代找到了根！你们祈福什么？他们有靖国神社罩着呢！你们捐什么款？甲午战争的赔款他们还没花完！你们救什么助？钓鱼岛他们都有能力布防  是中国人的有群就转</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/06/27/1565886.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>对“windows下给文件改名为时间串的批处理”的替换程序</title>
		<link>http://blog.donews.com/miman/archive/2011/05/18/1565881.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/05/18/1565881.aspx#comments</comments>
		<pubDate>Wed, 18 May 2011 03:09:04 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565881</guid>
		<description><![CDATA[windows 时间串 文件 改名 批处理 执行程序]]></description>
			<content:encoded><![CDATA[<p>前几天给同事一个文件改名的批处理，用在计划任务上的文件自动改名。用了，发现系统长时间格式设置修改后，带时间串的文件名里出现了空格，导致文件改名失败。郁闷了。</p>
<p>索性用VC写了几行代码，实现了批处理的功能，执行文件是一个命令行下的命令，32位windows系统用，用法是：</p>
<p>mv 旧文件名</p>
<p>例如：执行 &#8220;mv output.log&#8221; ，自动把output.log改名为output_201105181101.log，保留扩展名，在文件名后加上时间串。</p>
<p>下载地址：<a href="http://u.115.com/file/clwpo7g6">http://u.115.com/file/clwpo7g6#mv.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/05/18/1565881.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>windows下给文件改名为时间串的批处理</title>
		<link>http://blog.donews.com/miman/archive/2011/05/16/1565878.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/05/16/1565878.aspx#comments</comments>
		<pubDate>Mon, 16 May 2011 10:51:33 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565878</guid>
		<description><![CDATA[windows 时间串 文件 改名]]></description>
			<content:encoded><![CDATA[<p>帮同事写的，记录下来，文件内容如下：</p>
<p>@echo off<br />
set OLDFILE=aaa.txt<br />
set FILENAME=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%.txt<br />
@echo on<br />
echo %OLDFILE%<br />
echo %FILENAME%<br />
ren %OLDFILE% %FILENAME%</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/05/16/1565878.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>用gdb查看内存</title>
		<link>http://blog.donews.com/miman/archive/2011/05/12/1565876.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/05/12/1565876.aspx#comments</comments>
		<pubDate>Thu, 12 May 2011 03:07:49 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565876</guid>
		<description><![CDATA[格式: x /nfu 
           u表示一个地址单元的长度
        b表示单字节，
        h表示双字节，
        w表示四字节，
        g表示八字节
例： x/3uh 0x54320       x/4xw $sp

]]></description>
			<content:encoded><![CDATA[<table style="width: 767px;height: 529px">
<tbody>
<tr>
<td>
<div id="blog_text">
<p>格式: x /nfu &lt;addr&gt;</p>
<p>说明<br />
        x 是 examine 的缩写</p>
<p>        n表示要显示的内存单元的个数</p>
<p>        f表示显示方式, 可取如下值<br />
        x 按十六进制格式显示变量。</p>
<p>        d 按十进制格式显示变量。<br />
        u 按十进制格式显示无符号整型。<br />
        o 按八进制格式显示变量。<br />
        t 按二进制格式显示变量。<br />
        a 按十六进制格式显示变量。<br />
        i 指令地址格式<br />
        c 按字符格式显示变量。<br />
        f 按浮点数格式显示变量。</p>
<p>        u表示一个地址单元的长度<br />
        b表示单字节，<br />
        h表示双字节，<br />
        w表示四字节，<br />
        g表示八字节</p>
<p>举例<br />
        x/3uh 0&#215;54320 <br />
          表示从内存地址0&#215;54320读取内容，<br />
          h表示以双字节为一个单位，<br />
          3表示三个单位，<br />
          u表示按十六进制显示</p>
<p>        x/4xw $sp<br />
          表示按16进制打印4个WORD，地址从堆指针$sp开始<br />
          <br />
           </p>
</div>
</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/05/12/1565876.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gdb core 调试(转)</title>
		<link>http://blog.donews.com/miman/archive/2011/04/28/1565872.aspx</link>
		<comments>http://blog.donews.com/miman/archive/2011/04/28/1565872.aspx#comments</comments>
		<pubDate>Thu, 28 Apr 2011 10:35:01 +0000</pubDate>
		<dc:creator>河马</dc:creator>
				<category><![CDATA[学习]]></category>

		<guid isPermaLink="false">http://blog.donews.com/miman/?p=1565872</guid>
		<description><![CDATA[3. ulimit:
如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:
#设置core大小为无限
ulimit -c unlimited
#设置文件大小为无限
ulimit unlimited

这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限.

]]></description>
			<content:encoded><![CDATA[<table>
<tbody>
<tr>
<td>
<div id="blog_text"><a href="http://blog.csdn.net/taina2008/archive/2007/08/09/1733464.aspx">http://blog.csdn.net/taina2008/archive/2007/08/09/1733464.aspx</a></div>
<p>1. 前言:<br />
有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的.<br />
但这不像编译错误一样会提示到文件-&gt;行, 而是没有任何信息, 使得我们的调试变得困难起来.</p>
<p>2. gdb:<br />
有一种办法是, 我们用gdb的step, 一步一步寻找.<br />
这放在短小的代码中是可行的, 但要让你step一个上万行的代码, 我想你会从此厌恶程序员这个名字, 而把他叫做调试员.<br />
我们还有更好的办法, 这就是core file.</p>
<p>3. ulimit:<br />
如果想让系统在信号中断造成的错误时产生core文件, 我们需要在shell中按如下设置:<br />
#设置core大小为无限<br />
ulimit -c unlimited<br />
#设置文件大小为无限<br />
ulimit unlimited</p>
<p>这些需要有root权限, 在ubuntu下每次重新打开中断都需要重新输入上面的第一条命令, 来设置core大小为无限.</p>
<p>4. 用gdb查看core文件:<br />
下面我们可以在发生运行时信号引起的错误时发生core dump了.<br />
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.<br />
gdb [exec file] [core file]<br />
如:<br />
gdb ./test test.core<br />
在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件-&gt;行.</p>
<p>5. 用gdb实时观察某进程crash信息<br />
启动进程<br />
gdb -p PID<br />
c<br />
运行进程至crash<br />
gdb会显示crash信息<br />
bt</p>
<p>简而言之,产生段错误就是访问了错误的内存段，一般是你没有权限，或者根本就不存在对应的物理内存,尤其常见的是访问0地址.</p>
<p>一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间，通常这个值是由gdtr来保存的，他是一个48位的寄存器，其中的32位是保存由它 指向的 gdt表，后13位保存相应于gdt的下标，最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表， 在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界 访问，cpu就会产生相应的异常保护，于是segmentation fault就出现了.</p>
<p>在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的</p>
<p>1)访问系统数据区，尤其是往 系统保护的内存地址写数据<br />
最常见就是给一个指针以0地址<br />
2)内存越界(数组越界，变量类型不一致等) 访问到不属于你的内存区域</p>
<p>解决方法</p>
<p>我 们在用C/C++语言写程序的时侯，内存管理的绝大部分工作都是需要我们来做的。实际上，内存管理是一个比较繁琐的工作，无论你多高明，经验多 丰富，难免会在此处犯些小错误，而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”（debug），往往是效率低下且让人厌烦的，本文将就&#8221;段错 误&#8221;这个内存访问越界的错误谈谈如何快速定位这些&#8221;段错误&#8221;的语句。<br />
下面将就以下的一个存在段错误的程序介绍几种调试方法：<br />
1 dummy_function (void)<br />
2 {<br />
3 unsigned char *ptr = 0&#215;00;<br />
4 *ptr = 0&#215;00;<br />
5 }<br />
6<br />
7 int main (void)<br />
8 {<br />
9 dummy_function ();<br />
10<br />
11 return 0;<br />
12 }<br />
作为一个熟练的C/C++程序员，以上代码的bug应该是很清楚的，因为它尝试操作地址为0的内存区域，而这个内存区域通常是不可访问的禁区，当然就会出错了。我们尝试编译运行它:<br />
xiaosuo@gentux test $ ./a.out<br />
段错误<br />
果然不出所料，它出错并退出了。<br />
1.利用gdb逐步查找段错误:<br />
这种方法也是被大众所熟知并广泛采用的方法，首先我们需要一个带有调试信息的可执行程序，所以我们加上“-g -rdynamic&#8221;的参数进行编译，然后用gdb调试运行这个新编译的程序,具体步骤如下:<br />
xiaosuo@gentux test $ gcc -g -rdynamic d.c<br />
xiaosuo@gentux test $ gdb ./a.out<br />
GNU gdb 6.5<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
GDB is free software, covered by the GNU General Public License, and you are<br />
welcome to change it and/or distribute copies of it under certain conditions.<br />
Type &#8220;show copying&#8221; to see the conditions.<br />
There is absolutely no warranty for GDB. Type &#8220;show warranty&#8221; for details.<br />
This GDB was configured as &#8220;i686-pc-linux-gnu&#8221;&#8230;Using host libthread_db library &#8220;/lib/libthread_db.so.1&#8243;.</p>
<p>(gdb) r<br />
Starting program: /home/xiaosuo/test/a.out</p>
<p>Program received signal SIGSEGV, Segmentation fault.<br />
0&#215;08048524 in dummy_function () at d.c:4<br />
4 *ptr = 0&#215;00;<br />
(gdb)<br />
哦？！好像不用一步步调试我们就找到了出错位置d.c文件的第4行，其实就是如此的简单。<br />
从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man 7 signal)，我们知道SIGSEGV默认handler的动作是打印”段错误&#8221;的出错信息，并产生Core文件，由此我们又产生了方法二。<br />
2.分析Core文件：<br />
Core文件是什么呢？<br />
The default action of certain signals is to cause a process to terminate and produce a core dump file, a disk file containing an image of the process&#8217;s memory at the time of termination. A list of the signals which cause a process to dump core can be found in signal(7).<br />
以 上资料摘自man page(man 5 core)。不过奇怪了，我的系统上并没有找到core文件。后来，忆起为了渐少系统上的拉圾文件的数量（本人有些洁癖，这也是我喜欢Gentoo的原因 之一），禁止了core文件的生成，查看了以下果真如此，将系统的core文件的大小限制在512K大小，再试:<br />
xiaosuo@gentux test $ ulimit -c<br />
0<br />
xiaosuo@gentux test $ ulimit -c 1000<br />
xiaosuo@gentux test $ ulimit -c<br />
1000<br />
xiaosuo@gentux test $ ./a.out<br />
段错误 (core dumped)<br />
xiaosuo@gentux test $ ls<br />
a.out core d.c f.c g.c pango.c test_iconv.c test_regex.c<br />
core文件终于产生了，用gdb调试一下看看吧:<br />
xiaosuo@gentux test $ gdb ./a.out core<br />
GNU gdb 6.5<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
GDB is free software, covered by the GNU General Public License, and you are<br />
welcome to change it and/or distribute copies of it under certain conditions.<br />
Type &#8220;show copying&#8221; to see the conditions.<br />
There is absolutely no warranty for GDB. Type &#8220;show warranty&#8221; for details.<br />
This GDB was configured as &#8220;i686-pc-linux-gnu&#8221;&#8230;Using host libthread_db library &#8220;/lib/libthread_db.so.1&#8243;.</p>
<p>warning: Can&#8217;t read pathname for load map: 输入/输出错误.<br />
Reading symbols from /lib/libc.so.6&#8230;done.<br />
Loaded symbols for /lib/libc.so.6<br />
Reading symbols from /lib/ld-linux.so.2&#8230;done.<br />
Loaded symbols for /lib/ld-linux.so.2<br />
Core was generated by `./a.out&#8217;.<br />
Program terminated with signal 11, Segmentation fault.<br />
#0 0&#215;08048524 in dummy_function () at d.c:4<br />
4 *ptr = 0&#215;00;<br />
哇，好历害，还是一步就定位到了错误所在地，佩服一下Linux/Unix系统的此类设计。<br />
接着考虑下去，以前用windows系统下的ie的时侯，有时打开某些网页，会出现“运行时错误”，这个时侯如果恰好你的机器上又装有windows的编译器的话，他会弹出来一个对话框，问你是否进行调试，如果你选择是，编译器将被打开，并进入调试状态，开始调试。<br />
Linux下如何做到这些呢？我的大脑飞速地旋转着，有了，让它在SIGSEGV的handler中调用gdb，于是第三个方法又诞生了:<br />
3.段错误时启动调试:<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;signal.h&gt;<br />
#include &lt;string.h&gt;</p>
<p>void dump(int signo)<br />
{<br />
char buf[1024];<br />
char cmd[1024];<br />
FILE *fh;</p>
<p>snprintf(buf, sizeof(buf), &#8220;/proc/%d/cmdline&#8221;, getpid());<br />
if(!(fh = fopen(buf, &#8220;r&#8221;)))<br />
exit(0);<br />
if(!fgets(buf, sizeof(buf), fh))<br />
exit(0);<br />
fclose(fh);<br />
if(buf[strlen(buf) - 1] == &#8216;\n&#8217;)<br />
buf[strlen(buf) - 1] = &#8221;;<br />
snprintf(cmd, sizeof(cmd), &#8220;gdb %s %d&#8221;, buf, getpid());<br />
system(cmd);</p>
<p>exit(0);<br />
}</p>
<p>void<br />
dummy_function (void)<br />
{<br />
unsigned char *ptr = 0&#215;00;<br />
*ptr = 0&#215;00;<br />
}</p>
<p>int<br />
main (void)<br />
{<br />
signal(SIGSEGV, &amp;dump);<br />
dummy_function ();</p>
<p>return 0;<br />
}<br />
编译运行效果如下:<br />
xiaosuo@gentux test $ gcc -g -rdynamic f.c<br />
xiaosuo@gentux test $ ./a.out<br />
GNU gdb 6.5<br />
Copyright (C) 2006 Free Software Foundation, Inc.<br />
GDB is free software, covered by the GNU General Public License, and you are<br />
welcome to change it and/or distribute copies of it under certain conditions.<br />
Type &#8220;show copying&#8221; to see the conditions.<br />
There is absolutely no warranty for GDB. Type &#8220;show warranty&#8221; for details.<br />
This GDB was configured as &#8220;i686-pc-linux-gnu&#8221;&#8230;Using host libthread_db library &#8220;/lib/libthread_db.so.1&#8243;.</p>
<p>Attaching to program: /home/xiaosuo/test/a.out, process 9563<br />
Reading symbols from /lib/libc.so.6&#8230;done.<br />
Loaded symbols for /lib/libc.so.6<br />
Reading symbols from /lib/ld-linux.so.2&#8230;done.<br />
Loaded symbols for /lib/ld-linux.so.2<br />
0xffffe410 in __kernel_vsyscall ()<br />
(gdb) bt<br />
#0 0xffffe410 in __kernel_vsyscall ()<br />
#1 0xb7ee4b53 in waitpid () from /lib/libc.so.6<br />
#2 0xb7e925c9 in strtold_l () from /lib/libc.so.6<br />
#3 0&#215;08048830 in dump (signo=11) at f.c:22<br />
#4 &lt;signal handler called&gt;<br />
#5 0&#215;0804884c in dummy_function () at f.c:31<br />
#6 0&#215;08048886 in main () at f.c:38<br />
怎么样？是不是依旧很酷？<br />
以 上方法都是在系统上有gdb的前提下进行的，如果没有呢？其实glibc为我们提供了此类能够dump栈内容的函数簇，详见 /usr/include/execinfo.h（这些函数都没有提供man page，难怪我们找不到），另外你也可以通过gnu的手册进行学习。<br />
4.利用backtrace和objdump进行分析:<br />
重写的代码如下:<br />
#include &lt;execinfo.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;stdlib.h&gt;<br />
#include &lt;signal.h&gt;</p>
<p>/* A dummy function to make the backtrace more interesting. */<br />
void<br />
dummy_function (void)<br />
{<br />
unsigned char *ptr = 0&#215;00;<br />
*ptr = 0&#215;00;<br />
}</p>
<p>void dump(int signo)<br />
{<br />
void *array[10];<br />
size_t size;<br />
char **strings;<br />
size_t i;</p>
<p>size = backtrace (array, 10);<br />
strings = backtrace_symbols (array, size);</p>
<p>printf (&#8220;Obtained %zd stack frames.\n&#8221;, size);</p>
<p>for (i = 0; i &lt; size; i++)<br />
printf (&#8220;%s\n&#8221;, strings[i]);</p>
<p>free (strings);</p>
<p>exit(0);<br />
}</p>
<p>int<br />
main (void)<br />
{<br />
signal(SIGSEGV, &amp;dump);<br />
dummy_function ();</p>
<p>return 0;<br />
}<br />
编译运行结果如下：<br />
xiaosuo@gentux test $ gcc -g -rdynamic g.c<br />
xiaosuo@gentux test $ ./a.out<br />
Obtained 5 stack frames.<br />
./a.out(dump+0&#215;19) [0x80486c2]<br />
[0xffffe420]<br />
./a.out(main+0&#215;35) [0x804876f]<br />
/lib/libc.so.6(__libc_start_main+0xe6) [0xb7e02866]<br />
./a.out [0x8048601]<br />
这次你可能有些失望,似乎没能给出足够的信息来标示错误,不急,先看看能分析出来什么吧,用objdump反汇编程序,找到地址0&#215;804876f对应的代码位置:<br />
xiaosuo@gentux test $ objdump -d a.out</p>
<p>8048765: e8 02 fe ff ff call 804856c &lt;signal@plt&gt;<br />
804876a: e8 25 ff ff ff call 8048694 &lt;dummy_function&gt;<br />
804876f: b8 00 00 00 00 mov $0&#215;0,%eax<br />
8048774: c9 leave<br />
我们还是找到了在哪个函数(dummy_function)中出错的,信息虽然不是很完整,不过有总比没有好的啊!  </td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/miman/archive/2011/04/28/1565872.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

