﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-古之成大事者，不唯有超世之才，亦唯有坚韧不拔之志也！</title><link>http://www.blogjava.net/mlxlzc/</link><description /><language>zh-cn</language><lastBuildDate>Wed, 06 May 2026 22:58:51 GMT</lastBuildDate><pubDate>Wed, 06 May 2026 22:58:51 GMT</pubDate><ttl>60</ttl><item><title>epoll例子</title><link>http://www.blogjava.net/mlxlzc/articles/369209.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Thu, 02 Feb 2012 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/369209.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/369209.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/369209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/369209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/369209.html</trackback:ping><description><![CDATA[<div><div id="article_content">     <p><strong>名词解释：</strong>man epoll之后，得到如下结果：</p> <p>NAME<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; epoll - I/O event notification facility</p> <p>SYNOPSIS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #include &lt;sys/epoll.h&gt;</p> <p>DESCRIPTION<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; epoll is a variant of poll(2) that can be used either as Edge or Level<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Triggered interface and scales well to large numbers of&nbsp; watched&nbsp; fds.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Three&nbsp; system&nbsp; calls&nbsp; are provided to set up and control an epoll set:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; epoll_create(2), epoll_ctl(2), epoll_wait(2).</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; An epoll set is connected to a file descriptor created&nbsp; by&nbsp; epoll_cre-<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ate(2).&nbsp;&nbsp; Interest for certain file descriptors is then registered via<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; epoll_ctl(2).&nbsp; Finally, the actual wait is started by epoll_wait(2).</p> <p>其实，一切的解释都是多余的，按照我目前的了解，EPOLL模型似乎只有一种格式，所以大家只要参考我下面的代码，就能够对EPOLL有所了解了，代码的解释都已经在注释中：</p> <p>while (TRUE)<br />&nbsp;{<br />&nbsp;&nbsp;int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//等待EPOLL时间的发生，相当于监听，至于相关的端口，需要在初始化EPOLL的时候绑定。<br />&nbsp;&nbsp;if (nfds &lt;= 0)<br />&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;m_bOnTimeChecking = FALSE;<br />&nbsp;&nbsp;G_CurTime = time(NULL);<br />&nbsp;&nbsp;for (int i=0; i&lt;nfds; i++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;try<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if (m_events[i].data.fd == m_listen_http_fd)//如果新监测到一个HTTP用户连接到绑定的HTTP端口，建立新的连接。由于我们新采用了SOCKET连接，所以基本没用。<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnAcceptHttpEpoll ();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else if (m_events[i].data.fd == m_listen_sock_fd)//如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口，建立新的连接。<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnAcceptSockEpoll ();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else if (m_events[i].events &amp; EPOLLIN)//如果是已经连接的用户，并且收到数据，那么进行读入。<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnReadEpoll (i);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;OnWriteEpoll (i);//查看当前的活动连接是否有需要写出的数据。<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;catch (int)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTF ("CATCH捕获错误/n");<br />&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;m_bOnTimeChecking = TRUE;<br />&nbsp;&nbsp;OnTimer ();//进行一些定时的操作，主要就是删除一些短线用户等。<br />&nbsp;}</p> <p>　其实EPOLL的精华，按照我目前的理解，也就是上述的几段短短的代码，看来时代真的不同了，以前如何接受大量用户连接的问题，现在却被如此轻松的搞定，真是让人不得不感叹。</p> <p>今天搞了一天的epoll，想做一个高并发的代理程序。刚开始真是郁闷,一直搞不通，网上也有几篇介绍epoll的文章。但都不深入，没有将一些注意的地方讲明。以至于走了很多弯路，现将自己的一些理解共享给大家,以少走弯路。 <br /><br />epoll用到的所有函数都是在头文件sys/epoll.h中声明，有什么地方不明白或函数忘记了可以去看一下。 <br />epoll和select相比，最大不同在于: <br /><br />1epoll返回时已经明确的知道哪个sokcet fd发生了事件，不用再一个个比对。这样就提高了效率。 <br />2select的FD_SETSIZE是有限止的，而epoll是没有限止的只与系统资源有关。 <br /><br />1、epoll_create函数<br />函数声明：int epoll_create(int size)<br />该 函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间，用来存放你想关注的socket  fd上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket  fd数。随你定好了。只要你有空间。可参见上面与select之不同2. <br /><br />22、epoll_ctl函数 <br />函数声明：int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) <br />该函数用于控制某个epoll文件描述符上的事件，可以注册事件，修改事件，删除事件。 <br />参数： <br />epfd：由 epoll_create 生成的epoll专用的文件描述符； <br />op：要进行的操作例如注册事件，可能的取值EPOLL_CTL_ADD 注册、EPOLL_CTL_MOD 修 改、EPOLL_CTL_DEL 删除 <br /><br />fd：关联的文件描述符； <br />event：指向epoll_event的指针； <br />如果调用成功返回0,不成功返回-1 <br /><br />用到的数据结构 <br />typedef union epoll_data { <br />void *ptr;<br />int fd;<br />__uint32_t u32;<br />__uint64_t u64;<br />} epoll_data_t; <br /><br />struct epoll_event {<br />__uint32_t events; /* Epoll events */<br />epoll_data_t data; /* User data variable */<br />};<br /><br /><br />如： <br />struct epoll_event ev;<br />//设置与要处理的事件相关的文件描述符<br />ev.data.fd=listenfd;<br />//设置要处理的事件类型<br />ev.events=EPOLLIN|EPOLLET;<br />//注册epoll事件<br />epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&amp;ev);<br /><br /><br />常用的事件类型:<br />EPOLLIN ：表示对应的文件描述符可以读；<br />EPOLLOUT：表示对应的文件描述符可以写；<br />EPOLLPRI：表示对应的文件描述符有紧急的数据可读<br />EPOLLERR：表示对应的文件描述符发生错误；<br />EPOLLHUP：表示对应的文件描述符被挂断；<br />EPOLLET：表示对应的文件描述符有事件发生；<br /><br /><br />3、epoll_wait函数<br />函数声明:int epoll_wait(int epfd,struct epoll_event * events,int maxevents,int timeout)<br />该函数用于轮询I/O事件的发生；<br />参数：<br />epfd:由epoll_create 生成的epoll专用的文件描述符；<br />epoll_event:用于回传代处理事件的数组；<br />maxevents:每次能处理的事件数；<br />timeout:等待I/O事件发生的超时值(单位我也不太清楚)；-1相当于阻塞，0相当于非阻塞。一般用-1即可<br />返回发生事件数。<br /><br /></p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>&nbsp;</p> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>#include&nbsp;&lt;stdio.h&gt;&nbsp;&nbsp;</span></li><li>#include&nbsp;&lt;stdlib.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;errno.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;string.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;sys/types.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;netinet/in.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;sys/socket.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;sys/wait.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;unistd.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;arpa/inet.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;openssl/ssl.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;openssl/err.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;fcntl.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;sys/epoll.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;sys/time.h&gt;&nbsp;&nbsp;</li><li>#include&nbsp;&lt;sys/resource.h&gt;&nbsp;&nbsp;</li></ol></div> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>#define&nbsp;MAXBUF&nbsp;1024&nbsp;&nbsp;</span></li><li>#define&nbsp;MAXEPOLLSIZE&nbsp;<span>10000&nbsp;&nbsp;</span></li></ol></div> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>/*&nbsp;</span></li><li><span>setnonblocking&nbsp;-&nbsp;设置句柄为非阻塞方式&nbsp;</span></li><li><span>*/&nbsp;&nbsp;</span></li><li><span>int&nbsp;setnonblocking(int&nbsp;sockfd)&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(fcntl(sockfd,&nbsp;F_SETFL,&nbsp;fcntl(sockfd,&nbsp;F_GETFD,&nbsp;0)|O_NONBLOCK)&nbsp;==&nbsp;-1)&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;-1;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;0;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li></ol></div> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>/*&nbsp;</span></li><li><span>handle_message&nbsp;-&nbsp;处理每个&nbsp;socket&nbsp;上的消息收发&nbsp;</span></li><li><span>*/&nbsp;&nbsp;</span></li><li><span>int&nbsp;handle_message(int&nbsp;new_fd)&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>char&nbsp;buf[MAXBUF&nbsp;+&nbsp;1];&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;len;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;<span>/*&nbsp;开始处理每个新连接上的数据收发&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;bzero(buf,&nbsp;MAXBUF&nbsp;+&nbsp;<span>1);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;<span>/*&nbsp;接收客户端的消息&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;recv(new_fd,&nbsp;buf,&nbsp;MAXBUF,&nbsp;<span>0);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(len&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span>"%d接收消息成功:'%s'，共%d个字节的数据/n",&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_fd,&nbsp;buf,&nbsp;len);&nbsp;&nbsp;</li><li>&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(len&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span>"消息接收失败！错误代码是%d，错误信息是'%s'/n",&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errno,&nbsp;strerror(errno));&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;close(new_fd);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;-1;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/*&nbsp;处理每个新连接上的数据收发结束&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;len;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li><li><span>/************关于本文档********************************************&nbsp;</span></li><li><span>*filename:&nbsp;epoll-server.c&nbsp;</span></li><li><span>*purpose:&nbsp;演示epoll处理海量socket连接的方法&nbsp;</span></li><li><span><span>*wrote&nbsp;by:&nbsp;zhoulifa(&lt;a&nbsp;href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#122;&#104;&#111;&#117;&#108;&#105;&#102;&#97;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;"&amp; gt;zhoulifa@163.com&lt;/a&gt;)&nbsp;周立发(&lt;a&nbsp;href="http: //zhoulifa.bokee.com"&gt;http://zhoulifa.bokee.com&lt;/a&gt;)</span>&nbsp;</span></li><li><span>Linux爱好者&nbsp;Linux知识传播者&nbsp;SOHO族&nbsp;开发者&nbsp;最擅长C语言&nbsp;</span></li><li><span>*date&nbsp;time:2007-01-31&nbsp;21:00&nbsp;</span></li><li><span>*Note:&nbsp;任何人可以任意复制代码并运用这些文档，当然包括你的商业用途&nbsp;</span></li><li><span>*&nbsp;但请遵循GPL&nbsp;</span></li><li><span>*Thanks&nbsp;to:Google&nbsp;</span></li><li><span>*Hope:希望越来越多的人贡献自己的力量，为科学技术发展出力&nbsp;</span></li><li><span>*&nbsp;科技站在巨人的肩膀上进步更快！感谢有开源前辈的贡献！&nbsp;</span></li><li><span>*********************************************************************/&nbsp;&nbsp;</span></li><li><span>int&nbsp;main(int&nbsp;argc,&nbsp;char&nbsp;**argv)&nbsp;&nbsp;</span></li><li>{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;listener,&nbsp;new_fd,&nbsp;kdpfd,&nbsp;nfds,&nbsp;n,&nbsp;ret,&nbsp;curfds;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;socklen_t&nbsp;len;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sockaddr_in&nbsp;my_addr,&nbsp;their_addr;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;<span>int&nbsp;myport,&nbsp;lisnum;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;epoll_event&nbsp;ev;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;epoll_event&nbsp;events[MAXEPOLLSIZE];&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;rlimit&nbsp;rt;&nbsp;&nbsp;</li><li>&nbsp;myport&nbsp;=&nbsp;<span>5000;&nbsp;&nbsp;</span></li><li>&nbsp;lisnum&nbsp;=&nbsp;<span>2;&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;<span>/*&nbsp;设置每个进程允许打开的最大文件数&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;rt.rlim_max&nbsp;=&nbsp;rt.rlim_cur&nbsp;=&nbsp;MAXEPOLLSIZE;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(setrlimit(RLIMIT_NOFILE,&nbsp;&amp;rt)&nbsp;==&nbsp;-1)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(<span>"setrlimit");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<span>1);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span>"设置系统资源参数成功！/n");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li></ol></div> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;开启&nbsp;socket&nbsp;监听&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;((listener&nbsp;=&nbsp;socket(PF_INET,&nbsp;SOCK_STREAM,&nbsp;0))&nbsp;==&nbsp;-1)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(<span>"socket");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<span>1);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span>"socket&nbsp;创建成功！/n");&nbsp;&nbsp;</span></li><li>&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;setnonblocking(listener);&nbsp;&nbsp;</li></ol></div> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>&nbsp;&nbsp;&nbsp;&nbsp;bzero(&amp;my_addr,&nbsp;sizeof(my_addr));&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;my_addr.sin_family&nbsp;=&nbsp;PF_INET;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;my_addr.sin_port&nbsp;=&nbsp;htons(myport);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;my_addr.sin_addr.s_addr&nbsp;=&nbsp;INADDR_ANY;&nbsp;&nbsp;</li></ol></div> <div bg_java=""><div><div><strong>[java]</strong> <a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="view plain">view plain</a><a href="http://blog.csdn.net/haoahua/article/details/2037704#" title="copy">copy</a></div></div><ol start="1"><li><span>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bind(listener,&nbsp;(struct&nbsp;sockaddr&nbsp;*)&nbsp;&amp;my_addr,&nbsp;sizeof(struct&nbsp;sockaddr))&nbsp;==&nbsp;-1)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(<span>"bind");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<span>1);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span>"IP&nbsp;地址和端口绑定成功/n");&nbsp;&nbsp;</span></li><li>&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(listen(listener,&nbsp;lisnum)&nbsp;==&nbsp;-1)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(<span>"listen");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(<span>1);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span>"开启服务成功！/n");&nbsp;&nbsp;</span></li><li>&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;<span>/*&nbsp;创建&nbsp;epoll&nbsp;句柄，把监听&nbsp;socket&nbsp;加入到&nbsp;epoll&nbsp;集合里&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;kdpfd&nbsp;=&nbsp;epoll_create(MAXEPOLLSIZE);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;sizeof(struct&nbsp;sockaddr_in);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;ev.events&nbsp;=&nbsp;EPOLLIN&nbsp;|&nbsp;EPOLLET;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd&nbsp;=&nbsp;listener;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(epoll_ctl(kdpfd,&nbsp;EPOLL_CTL_ADD,&nbsp;listener,&nbsp;&amp;ev)&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;<span>"epoll&nbsp;set&nbsp;insertion&nbsp;error:&nbsp;fd=%d/n",&nbsp;listener);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;-1;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;printf(<span>"监听&nbsp;socket&nbsp;加入&nbsp;epoll&nbsp;成功！/n");&nbsp;&nbsp;</span></li><li>&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;curfds&nbsp;=&nbsp;<span>1;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>while&nbsp;(1)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>/*&nbsp;等待有事件发生&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nfds&nbsp;=&nbsp;epoll_wait(kdpfd,&nbsp;events,&nbsp;curfds,&nbsp;-<span>1);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(nfds&nbsp;==&nbsp;-1)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(<span>"epoll_wait");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>break;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>/*&nbsp;处理所有事件&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>for&nbsp;(n&nbsp;=&nbsp;0;&nbsp;n&nbsp;&lt;&nbsp;nfds;&nbsp;++n)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(events[n].data.fd&nbsp;==&nbsp;listener)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_fd&nbsp;=&nbsp;accept(listener,&nbsp;(struct&nbsp;sockaddr&nbsp;*)&nbsp;&amp;their_addr,&amp;len);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(new_fd&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(<span>"accept");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>continue;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(<span>"有连接来自于：&nbsp;%d:%d，&nbsp;分配的&nbsp;socket&nbsp;为:%d/n",&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inet_ntoa(their_addr.sin_addr),&nbsp;ntohs(their_addr.sin_port),&nbsp;new_fd);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setnonblocking(new_fd);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.events&nbsp;=&nbsp;EPOLLIN&nbsp;|&nbsp;EPOLLET;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ev.data.fd&nbsp;=&nbsp;new_fd;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(epoll_ctl(kdpfd,&nbsp;EPOLL_CTL_ADD,&nbsp;new_fd,&nbsp;&amp;ev)&nbsp;&lt;&nbsp;0)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;<span>"把&nbsp;socket&nbsp;'%d'&nbsp;加入&nbsp;epoll&nbsp;失败！%s/n",&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_fd,&nbsp;strerror(errno));&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;-1;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curfds++;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;<span>else&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;handle_message(events[n].data.fd);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(ret&nbsp;&lt;&nbsp;1&nbsp;&amp;&amp;&nbsp;errno&nbsp;!=&nbsp;11)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;epoll_ctl(kdpfd,&nbsp;EPOLL_CTL_DEL,&nbsp;events[n].data.fd,&amp;ev);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curfds--;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;close(listener);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;0;&nbsp;&nbsp;</span></li><li>}&nbsp;&nbsp;</li></ol></div> <div> <p align="left">&nbsp;epoll_wait 运行的原理是 等侍注册在epfd上的socket fd的事件的发生，如果发生则将发生的sokct fd和事件类型放入到events数组中。  并且将注册在epfd上的socket fd的事件类型给清空，所以如果下一个循环你还要关注这个socket  fd的话，则需要用epoll_ctl(epfd,EPOLL_CTL_MOD,listenfd,&amp;ev)来重新设置socket  fd的事件类型。这时不用EPOLL_CTL_ADD,因为socket fd并未清空，只是事件类型清空。这一步非常重要。&nbsp; </p> </div> </div></div><img src ="http://www.blogjava.net/mlxlzc/aggbug/369209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2012-02-02 09:10 <a href="http://www.blogjava.net/mlxlzc/articles/369209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下可以替换运行中的程序么</title><link>http://www.blogjava.net/mlxlzc/articles/365359.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 02 Dec 2011 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/365359.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/365359.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/365359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/365359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/365359.html</trackback:ping><description><![CDATA[<div>  <div><div id="article_content">     <p>转：   </p><div>http://blog.csdn.net/zhangxinrun/article/details/5591246</div>   <br />    <p>今天被朋友问及&#8220;Linux下可以替换运行中的程序么？&#8221;，以前依稀记得Linux下是可以的（而Windows就不让），于是随口答道&#8220;OK&#8221;。结果朋友发来一个执行结果：（test正在运行中）</p>  <pre># cp test2 test<br />cp: cannot create regular file `test': Text file busy</pre> <p>看起来是程序被占用，无法覆盖。于是自己又再做了几个实验：</p> <p>（1）先rm删除正在运行的test，然后cp test2 test就没有错误了。<br />（2）先mv改名正在运行的test，然后cp test2 test也没有问题。</p> <p>查了查资料并动手分析了一下，找到了比较满意的解释。cp并不改变目标文件的inode，事实上它的实现是这样的：</p> <pre># strace cp test2 test&nbsp; 2&gt;&amp;1 | grep open.*test<br />open("test2", O_RDONLY|O_LARGEFILE)&nbsp;&nbsp;&nbsp;&nbsp; = 3<br />open("test", O_WRONLY|O_TRUNC|O_LARGEFILE) = 4</pre> <p>我原以为cp的实现是&#8220;rm + open(O_CREAT)&#8221;，不过现在想想上面的实现方式才是最可靠的（保证了时序安全和目标文件的属性）。这也可以解释为什么cp的目标文件会继承被覆盖文件的属性而非源文件。</p> <p><span style="font-size: medium;"><span style="color: #3366ff;"><strong><em><span style="text-decoration: underline;">Linux  由于Demand   Paging机制的关系，必须确保正在运行中的程序镜像（注意，并非文件本身）不被意外修改，因此内核在启动程序后会锁定这个程序镜像的inode。这就   是为什么cp在用&#8220;O_WRONLY|O_TRUNC&#8221;模式open目标文件时会失败。而先rm再cp的话，新文件的inode其实已经改变了，原   inode并没有被真正删除，直到内核释放对它的引用。同理，mv只是改变了文件名，其inode不变，新文件使用了新的inode。</span></em></strong></span></span></p> <p>问题到这里已经水落石出，不过刨根究底的个性驱使我再做了以下一组实验，没想到结果完全出乎我意料之外！</p> <p>写了一个简单的测试程序：</p> <pre>#include &lt;stdio.h&gt;<br /><br />int main(int argc, char * argv[])<br />{<br />    foo();&nbsp; // An export function by libtest.so.<br />    sleep(1000);<br />    return 0;<br />}</pre> <p>foo()是另一个测试动态库libtest.so的导出接口，只打印一行提示就返回。接下来我把上面对执行文件的测试用例对动态库又做了一遍：</p> <p>（1）cp libtest2.so libtest.so可以直接覆盖已加载的动态库。<br />（2）先rm删除已加载的libtest.so，然后cp libtest2.so libtest.so成功。<br />（3）先mv改名已加载的libtest.so，然后cp libtest2.so libtest.so成功。</p> <p>除了第一个用例外，结果相同。这样看来，动态库被加载时难道ld并没有锁定inode？不过想想也可以宽恕，毕竟ld也是用户态程序，没有权利去锁定inode，也不应与内核的文件系统底层实现耦合。</p> <p>到这里都还算在情理之中，看起来Linux也都处理的很好。不过还剩下一个问题：动态库被以cp的方式覆盖后难道不会和Demand Paging机制产生冲突？</p> <p>在思考这个问题的过程中，我意识到前面这个测试程序的一个致命漏洞，稍作修改如下：</p> <pre>#include &lt;stdio.h&gt;<br /><br />int main(int argc, char * argv[])<br />{<br />loop:<br />    foo();&nbsp; // An export function by libtest.so.<br />    sleep(1);<br />    goto loop;<br />    return 0;<br />}</pre> <p>这 次，再执行上面的三个用例后发现，&#8220;cp libtest2.so   libtest.so&#8221;虽然仍可直接覆盖已加载的动态库，但是测试程序马上出现了&#8220;Segmentation   fault&#8221;。而后两个用例结果不变。由此可见，想要安全的替换已加载的动态库，还是用&#8220;笨拙&#8221;的&#8220;rm +   cp&#8221;吧，看似捷径的&#8220;cp覆盖&#8221;会直接葬送掉你的程序&#8230;&#8230;</p> <p>看来，我再一次低估了Linux的健壮性，看似符合逻辑的流程也可能会带来灾 难性的后果；&#8220;rm &amp;   cp&#8221;与&#8220;cp覆盖&#8221;背后所隐藏的底层差异却可以成为你的救星。Linux用得越久越是让人觉得这是一块充满了荆棘和陷阱的原始丛林，只有步步为营实踏前   行才能走的更远。</p> <p>注：以上实验基于SuSE Linux Enterprise Server 9 SP1（Linux 2.6.5 &amp; glibc 2.3.3）。</p> </div></div> <br /> </div><img src ="http://www.blogjava.net/mlxlzc/aggbug/365359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2011-12-02 11:08 <a href="http://www.blogjava.net/mlxlzc/articles/365359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux telnet慢问题解决</title><link>http://www.blogjava.net/mlxlzc/archive/2011/12/01/365264.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Thu, 01 Dec 2011 02:02:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/archive/2011/12/01/365264.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/365264.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/archive/2011/12/01/365264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/365264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/365264.html</trackback:ping><description><![CDATA[<div><span id="zoom"><p style="text-indent: 2em">更改/etc/resolv.conf文件 </p><p style="text-indent: 2em">如果你的linux主机只是在局域网内工作，请将nameserver地址改为网卡本身的地址。 </p><p style="text-indent: 2em">例： </p><p style="text-indent: 2em">suselinux:~ # more /etc/resolv.conf </p><p style="text-indent: 2em">nameserver 192.168.0.160 </p><p style="text-indent: 2em">search site </p><p style="text-indent: 2em">然后重启网卡 </p><p style="text-indent: 2em">suselinux:~ # ifconfig eth0 down </p><p style="text-indent: 2em">suselinux:~ # ifconfig eth0 up </p></span></div><img src ="http://www.blogjava.net/mlxlzc/aggbug/365264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2011-12-01 10:02 <a href="http://www.blogjava.net/mlxlzc/archive/2011/12/01/365264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql++ 安装篇</title><link>http://www.blogjava.net/mlxlzc/archive/2011/11/03/362632.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Thu, 03 Nov 2011 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/archive/2011/11/03/362632.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/362632.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/archive/2011/11/03/362632.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/362632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/362632.html</trackback:ping><description><![CDATA[1：需要安装数据库的各种头文件以及动态库如：<br />&nbsp;&nbsp;&nbsp;&nbsp; <div>&nbsp;&nbsp;&nbsp; MySQL-server-community-5.1.58-1.rhel4.i386.rpm</div><div>&nbsp;&nbsp;&nbsp; MySQL-client-community-5.1.58-1.rhel4.i386.rpm</div><div>&nbsp;&nbsp;&nbsp; MySQL-devel-community-5.1.58-1.rhel4.i386.rpm</div><div>&nbsp;&nbsp;&nbsp; MySQL-shared-compat-5.1.58-1.rhel4.i386.rpm&nbsp; （否则安装mysql++会报错，说链接客户端失败）<br /><br />2：安装mysql++<br />&nbsp;&nbsp;&nbsp; <div>&nbsp;&nbsp;&nbsp;&nbsp; ./configure -&gt; make -&gt; make install<br /><br />3：编译测试程序<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">[zhichen@localhost&nbsp;src]$&nbsp;vi&nbsp;test.cpp<br />&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">mysql++.h</span><span style="color: #000000; ">"</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;mysqlpp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">using</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">namespace</span><span style="color: #000000; ">&nbsp;std;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">构造一个Connection类的对象</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con(</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;db&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">mysql</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">server&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">127.0.0.1</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">user&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pos</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">pass&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pos</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(con.connect(db,&nbsp;server,&nbsp;user,&nbsp;pass))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">success</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">string</span><span style="color: #000000; ">&nbsp;sql&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">select&nbsp;*&nbsp;from&nbsp;users</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;query&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;con.query(sql);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(StoreQueryResult&nbsp;rs&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;query.store())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StoreQueryResult::const_iterator&nbsp;it;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(it&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;rs.begin();&nbsp;it&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;rs.end();&nbsp;</span><span style="color: #000000; ">++</span><span style="color: #000000; ">it)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Row&nbsp;row&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">it;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/t</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;row[</span><span style="color: #000000; ">0</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/t</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;row[</span><span style="color: #000000; ">1</span><span style="color: #000000; ">]&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cerr&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Failed&nbsp;to&nbsp;get&nbsp;item&nbsp;list:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Failed&nbsp;to&nbsp;connect&nbsp;DB</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;con.error()&nbsp;</span><span style="color: #000000; ">&lt;&lt;</span><span style="color: #000000; ">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div><br /><br /><div>g++ -o test test.cpp -I/usr/include/mysql -I/usr/local/include/mysql++/ -L/usr/local/lib -lmysqlpp -lmysqlclient</div><br /><br />4：执行./test <br />如果报错说<div>./test: error while loading shared libraries: libmysqlpp.so.3: cannot open shared object file: No such file or directory</div><br /><div>&nbsp;man ldconfig</div><div>vi /etc/ld.so.conf</div>把mysq++动态库 /usr/local/lib的路径加进去<br /><br />5：再次执行测试程序<br /></div></div><img src ="http://www.blogjava.net/mlxlzc/aggbug/362632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2011-11-03 20:32 <a href="http://www.blogjava.net/mlxlzc/archive/2011/11/03/362632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>查询端口对应的进程信息</title><link>http://www.blogjava.net/mlxlzc/archive/2011/10/10/360356.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Mon, 10 Oct 2011 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/archive/2011/10/10/360356.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/360356.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/archive/2011/10/10/360356.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/360356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/360356.html</trackback:ping><description><![CDATA[<div>[root@localhost ~]# lsof -i:36097&nbsp; 查看端口对应的进程信息<br />COMMAND&nbsp;&nbsp; PID USER&nbsp;&nbsp; FD&nbsp;&nbsp; TYPE DEVICE SIZE NODE NAME<br />.csyslog 3709 root&nbsp;&nbsp;&nbsp; 3u&nbsp; IPv4&nbsp; 59474&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TCP 172.18.215.28:36097-&gt;216.83.44.226:81 (ESTABLISHED)<br /><br />&nbsp;netstat -anp | grep 35236&nbsp; 查看端口对应的程序<br /><br /><br />ulimit 查看系统资源限制<br /><br />查询进程占用资源情况，如打开文件句柄<br />lsof -p 进程号<br /><br />strace -p 进程号<br /></div><img src ="http://www.blogjava.net/mlxlzc/aggbug/360356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2011-10-10 10:21 <a href="http://www.blogjava.net/mlxlzc/archive/2011/10/10/360356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>疲倦想放弃时看看（转）</title><link>http://www.blogjava.net/mlxlzc/articles/327399.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Thu, 29 Jul 2010 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/327399.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/327399.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/327399.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/327399.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/327399.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">这篇东西转自一位有思想的研究生！她看到这篇漫画，觉得很不错，我看后也觉得值得我们思考，尤其是当我们抱怨时！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/f5614a4c35e9d207a8904e5f06c2d8de.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">第一幅漫画中，每个人都背负着一个沉重的十字架，在缓慢而艰难地前行！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/4dc8c2048a19cd9f88885b04fdcdf76e.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">途中，有一个人忽然停了下来。他在想着什么！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/bf7232fb5a01eb9939501177d12d6683.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">他想，上帝啊，这个十字架太沉重了，我可以把十字架砍掉一块！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/93717b8fd266960b1ae4479bb26005fd.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">于是他动手砍了起来！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/bbbec33260ae09d5fd89d16c8fed4b96.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">砍掉之后走起来，的确是轻松了很多，他的步伐也不由得加快了。</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/9c990c4b9c73b10dc6f6b75c94d7c1b3.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">就这样走啊走啊！走着走着，他觉得肩上的十字架还是很沉，很重！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/688312fdaa42fb6d95ea573934414e56.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">他祈求道，上帝啊，请你让我再砍掉一截吧，我会走得更轻松！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/ad29d6516c6a0b9efe196b8e54e06b29.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">于是，他又砍掉了一截！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/726b99cf579011c185fa5d8c103ef809.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">感谢上帝，这样一来，他感到轻松多了！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/8fd2f4b2db4207a1d4cfbbd1ed2251dc.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">如此，他毫不费力地就走到了队伍的最前面。当其他人在吃力地负重前行时，他却轻松地哼起了小曲！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/c96e0a5b2a50f6b43609456387b439eb.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">啊哈!谁料，前边忽然出现了一个又深又宽的沟壑！沟上没有桥，周围也没有路。也没有蜘蛛侠或者超人出来解救他&#8230;</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/35c0b13c0ae586207b46f48214d071f2.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">后面的人都慢慢地赶上来了，他们用自己背负的十字架搭在沟上，做成桥，从容不迫地跨越了沟壑。</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/e9c1a5b5989d5dbe3bc701b1d7012819.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">他也想如法炮制。只可惜啊，他的十字架之前已经被砍掉了长长的一大截，根本无法做成桥帮助他跨越沟壑！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;"><img style="border: 1px solid rgb(221, 221, 221); margin: 0px; padding: 5px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: rgb(255, 255, 255);" src="http://dulei.si/files/1bfd8543d9f8012f6a04e242047bee70.jpg" alt="" /></p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">于是，当其他人都在朝着目标继续前进时，他却只能停在原地，垂头丧气，追悔莫及&#8230;&#8230;</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">人
生的路上我们每个人都背负着各种各样的十字架在艰难前行。它也许是我们的学习，也许是我们的工作，也许是我们的感情。但是，正是这些责任和义务，构成了我
们在这个世界上存在着的理由和价值。所以，请不要埋怨学习的繁重，工作的劳苦，感情的负担，因为真正的快乐，是奋战后的结果，没有经历深刻的痛苦，我们也
就体会不到酣畅淋漓的快乐！</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">每个人都背负着属于自己的十字架，的确是这样，漫画中的每个人，都是背负着属于自己的十字架，而当沟壑出现时，他们也只能利用自己背负的十字架去跨越沟壑，继续前进。</p>
<p style="margin: 0px 0px 20px; padding: 0px; font-weight: inherit; font-style: inherit; font-size: 13px; font-family: inherit; vertical-align: baseline; background-color: transparent;">所以：在人生的道路上，有些黑暗，只能自己穿越；有些痛苦，只能自己体验；有些孤独，也只能自己品尝&#8230;&#8230;人生是没有捷径的！</p>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/327399.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2010-07-29 10:00 <a href="http://www.blogjava.net/mlxlzc/articles/327399.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux ftp限制登陆后切换目录</title><link>http://www.blogjava.net/mlxlzc/articles/313905.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Thu, 25 Feb 2010 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/313905.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/313905.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/313905.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/313905.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/313905.html</trackback:ping><description><![CDATA[2) 启动
<br />
#service vsftpd start 启动
<br />
<br />
#service vsftpd stop 停止
<br />
<br />
#service vsftpd restart 重启
<br />
3) 配置
<br />
<br />
&nbsp;&nbsp; 主配置文件 /etc/vsftpd/vsftpd.conf
<br />
<br />
用户控制文件 /etc/vsftpd.ftpusers
<br />
<br />
<br />
实验一、设置Chroot——用户不能切换目录
<br />
<br />
因为默认情况下是可以切换目录的，所以是很不安全的。。
<br />
<br />
1、限制所有用户不能切换目录
<br />
<br />
chroot_local_user=YES
<br />
<span style="background-color: yellow;"><br />
<strong>2、设置指定的用户不能切换目录
</strong><br />
</span><br />
chroot_local_user=NO
<br />
<br />
chroot_list_enable=YES
<br />
<br />
chroot_list_file=/etc/vsftpd.chroot_list
<br />
<br />
实验二、用Vsftp.user_list访问控制
<br />
<br />
利用/etc/vsftpd.user_list
<br />
<br />
A、设置在/etc/vsftpd.user_list文件中用户不能访问，其它用户可以访问
<br />
<br />
userlist_enable=YES
<br />
<br />
userlist_deny=YES
<br />
<br />
<br />
userlist_file=/etc/vsftpd.user_list
<br />
<br />
B、设置在/etc/vsftpd.user_list文件中的用户能访问国，其它用户不可以访问。
<br />
<br />
userlist_enable=YES
<br />
<br />
userlist_deny=NO
<br />
<br />
userlist_file=/etc/vsftpd.user_list
<br />
<br />
<strong>防止用户用ssh telnet等登陆</strong><br />
<br />
vi /etc/passwd<br />
ydzf:x:501:501::/home/ydzf:/bin/false<br />
<br />
再修改/etc/shells文件，将/bin/false这个文件加进去
<img src ="http://www.blogjava.net/mlxlzc/aggbug/313905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2010-02-25 16:46 <a href="http://www.blogjava.net/mlxlzc/articles/313905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE查看数据库的SQL</title><link>http://www.blogjava.net/mlxlzc/articles/290506.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Mon, 10 Aug 2009 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/290506.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/290506.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/290506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/290506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/290506.html</trackback:ping><description><![CDATA[<p>1、查看表空间的名称及大小</p>
<p>　　select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size<br />
from dba_tablespaces t, dba_data_files d<br />
where t.tablespace_name = d.tablespace_name<br />
group by t.tablespace_name;</p>
<p>　　2、查看表空间物理文件的名称及大小</p>
<p>　　select tablespace_name, file_id, file_name,<br />
round(bytes/(1024*1024),0) total_space<br />
from dba_data_files<br />
order by tablespace_name;</p>
<p>　　3、查看回滚段名称及大小</p>
<p>　　select segment_name, tablespace_name, r.status, <br />
(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent, <br />
max_extents, v.curext CurExtent<br />
From dba_rollback_segs r, v$rollstat v<br />
Where r.segment_id = v.usn(+)<br />
order by segment_name ;</p>
<p>　　4、查看控制文件</p>
<p>　　select name from v$controlfile;</p>
<p>　　5、查看日志文件</p>
<p>　　select member from v$logfile;</p>
<p>　　6、查看表空间的使用情况</p>
<p>　　select sum(bytes)/(1024*1024) as free_space,tablespace_name <br />
from dba_free_space<br />
group by tablespace_name;</p>
<p>　　SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,<br />
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"<br />
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C<br />
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;</p>
<p>　　7、查看数据库库对象</p>
<p>　　select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;</p>
<p>　　8、查看数据库的版本　</p>
<p>　　Select version FROM Product_component_version <br />
Where SUBSTR(PRODUCT,1,6)='Oracle';</p>
<p>　　9、查看数据库的创建日期和归档方式</p>
<p>　　Select Created, Log_Mode, Log_Mode From V$Database;</p>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/290506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2009-08-10 11:23 <a href="http://www.blogjava.net/mlxlzc/articles/290506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>又大了一岁了</title><link>http://www.blogjava.net/mlxlzc/articles/283245.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 19 Jun 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/283245.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/283245.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/283245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/283245.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/283245.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
又大了一岁了<br />
<br />
人懒了<br />
<br />
现实了<br />
<br />
当年的理想斗志么了<br />
<br />
我怎么了<br />
<br />
定位也没了<br />
<br />
我该走向何方<br />
<br />
<img src ="http://www.blogjava.net/mlxlzc/aggbug/283245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2009-06-19 16:24 <a href="http://www.blogjava.net/mlxlzc/articles/283245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主机路由表和静态路由</title><link>http://www.blogjava.net/mlxlzc/articles/263655.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 03 Apr 2009 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/263655.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/263655.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/263655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/263655.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/263655.html</trackback:ping><description><![CDATA[<h1><a name="路由表和静态路由" id="路由表和静态路由">路由表和静态路由</a></h1>
<div>
<div left="" round="" style="width: 60%;">
<div>
<p>内容提要</p>
<div>
<ol>
    <li>
    <div> 查看 Linux 内核路由表</div>
    </li>
    <li>
    <div> 使用 route 命令设置静态路由</div>
    </li>
    <li>
    <div> 设置包转发</div>
    </li>
</ol>
</div>
</div>
</div>
</div>
<h2><a name="linux_内核路由表" id="linux_内核路由表">Linux 内核路由表</a></h2>
<h3><a name="查看_linux_内核路由表" id="查看_linux_内核路由表">查看 Linux 内核路由表</a></h3>
<div>
<p>
使用下面的 route 命令可以查看 Linux 内核路由表。
</p>
<pre># route</pre>
<pre>Destination     Gateway         Genmask         Flags Metric Ref    Use Iface<br />
192.168.0.0     *               255.255.255.0   U     0      0        0 eth0<br />
169.254.0.0     *               255.255.0.0     U     0      0        0 eth0<br />
default         192.168.0.1     0.0.0.0         UG    0      0        0 eth0</pre>
<p>
route 命令的输出项说明
</p>
<table>
    <tbody>
        <tr>
            <th centeralign="">  输出项  </th><th centeralign="">  说明  </th>
        </tr>
        <tr>
            <td> Destination </td>
            <td> 目标网段或者主机 </td>
        </tr>
        <tr>
            <td> Gateway </td>
            <td> 网关地址，&#8221;*&#8221; 表示目标是本主机所属的网络，不需要路由 </td>
        </tr>
        <tr>
            <td> Genmask </td>
            <td> 网络掩码 </td>
        </tr>
        <tr>
            <td> Flags </td>
            <td> 标记。一些可能的标记如下： </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> U — 路由是活动的 </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> H — 目标是一个主机 </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> G — 路由指向网关 </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> R — 恢复动态路由产生的表项 </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> D — 由路由的后台程序动态地安装 </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> M — 由路由的后台程序修改 </td>
        </tr>
        <tr>
            <td> <br />
            </td>
            <td> ! — 拒绝路由 </td>
        </tr>
        <tr>
            <td> Metric </td>
            <td> 路由距离，到达指定网络所需的中转数（linux 内核中没有使用） </td>
        </tr>
        <tr>
            <td> Ref </td>
            <td> 路由项引用次数（linux 内核中没有使用） </td>
        </tr>
        <tr>
            <td> Use </td>
            <td> 此路由项被路由软件查找的次数 </td>
        </tr>
        <tr>
            <td> Iface </td>
            <td> 该路由表项对应的输出接口 </td>
        </tr>
    </tbody>
</table>
</div>
<h3><a name="种路由类型" id="种路由类型">3 种路由类型</a></h3>
<h4><a name="主机路由" id="主机路由">主机路由</a></h4>
<div>
<p>
主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如，在下面的示例中，本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。
</p>
<pre>Destination    Gateway       Genmask        Flags     Metric    Ref    Use    Iface<br />
-----------    -------     -------            -----     ------    ---    ---    -----<br />
10.0.0.10     192.168.1.1    255.255.255.255   UH       0    0      0    eth0</pre>
</div>
<h4><a name="网络路由" id="网络路由">网络路由</a></h4>
<div>
<p>
网络路由是代表主机可以到达的网络。网络路由的Flags字段为N。例如，在下面的示例中，本地主机将发送到网络192.19.12的数据包转发到IP地址为192.168.1.1的路由器。
</p>
<pre>Destination    Gateway       Genmask      Flags    Metric    Ref     Use    Iface<br />
-----------    -------     -------         -----    -----   ---    ---    -----<br />
192.19.12     192.168.1.1    255.255.255.0      UN      0       0     0    eth0</pre>
</div>
<h4><a name="默认路由" id="默认路由">默认路由</a></h4>
<div>
<p>
当主机不能在路由表中查找到目标主机的IP地址或网络路由时，数据包就被发送到默认路由（默认网关）上。默认路由的Flags字段为G。例如，在下面的示例中，默认路由是IP地址为192.168.1.1的路由器。
</p>
<pre>Destination    Gateway       Genmask    Flags     Metric    Ref    Use    Iface<br />
-----------    -------     ------- -----      ------    ---    ---    -----<br />
default       192.168.1.1     0.0.0.0    UG       0        0     0    eth0</pre>
</div>
<h2><a name="配置静态路由" id="配置静态路由">配置静态路由</a></h2>
<h3><a name="route_命令" id="route_命令">route 命令</a></h3>
<div>
<p>
设置和查看路由表都可以用 route 命令，设置内核路由表的命令格式是：
</p>
<pre># route  [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]</pre>
<p>
其中：
</p>
<ul>
    <li>
    <div> add : 添加一条路由规则</div>
    </li>
    <li>
    <div> del : 删除一条路由规则</div>
    </li>
    <li>
    <div> -net : 目的地址是一个网络</div>
    </li>
    <li>
    <div> -host : 目的地址是一个主机</div>
    </li>
    <li>
    <div> target : 目的网络或主机</div>
    </li>
    <li>
    <div> netmask : 目的地址的网络掩码</div>
    </li>
    <li>
    <div> gw : 路由数据包通过的网关</div>
    </li>
    <li>
    <div> dev : 为路由指定的网络接口</div>
    </li>
</ul>
</div>
<h3><a name="route_命令使用举例" id="route_命令使用举例">route 命令使用举例</a></h3>
<div>
<p>
添加到主机的路由
</p>
<pre># route add -host 192.168.1.2 dev eth0:0<br />
# route add -host 10.20.30.148 gw 10.20.30.40</pre>
<p>
添加到网络的路由
</p>
<pre># route add -net 10.20.30.40 netmask 255.255.255.248 eth0<br />
# route add -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41<br />
# route add -net 192.168.1.0/24 eth1</pre>
<p>
添加默认路由
</p>
<pre># route add default gw 192.168.1.1</pre>
<p>
删除路由
</p>
<pre># route del -host 192.168.1.2 dev eth0:0<br />
# route del -host 10.20.30.148 gw 10.20.30.40<br />
# route del -net 10.20.30.40 netmask 255.255.255.248 eth0<br />
# route del -net 10.20.30.48 netmask 255.255.255.248 gw 10.20.30.41<br />
# route del -net 192.168.1.0/24 eth1<br />
# route del default gw 192.168.1.1</pre>
</div>
<h3><a name="设置包转发" id="设置包转发">设置包转发</a></h3>
<div>
<p>
在 CentOS 中默认的内核配置已经包含了路由功能，但默认并没有在系统启动时启用此功能。开启 Linux
的路由功能可以通过调整内核的网络参数来实现。要配置和调整内核参数可以使用 sysctl 命令。例如：要开启 Linux
内核的数据包转发功能可以使用如下的命令。
</p>
<pre># sysctl -w net.ipv4.ip_forward=1</pre>
<p>
这样设置之后，当前系统就能实现包转发，但下次启动计算机时将失效。为了使在下次启动计算机时仍然有效，需要将下面的行写入配置文件/etc/sysctl.conf。
</p>
<pre># vi /etc/sysctl.conf</pre>
<pre>net.ipv4.ip_forward = 1</pre>
<p>
用户还可以使用如下的命令查看当前系统是否支持包转发。
</p>
<pre># sysctl  net.ipv4.ip_forward</pre>
</div>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/263655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlxlzc/" target="_blank">goto</a> 2009-04-03 08:52 <a href="http://www.blogjava.net/mlxlzc/articles/263655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>