﻿<?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-古之成大事者，不唯有超世之才，亦唯有坚韧不拔之志也！-文章分类-LINUX &amp; UNIX</title><link>http://www.blogjava.net/mlxlzc/category/31533.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 27 Feb 2012 09:51:34 GMT</lastBuildDate><pubDate>Mon, 27 Feb 2012 09:51:34 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 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>linux下必学的60个命令(转)</title><link>http://www.blogjava.net/mlxlzc/articles/237035.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Tue, 28 Oct 2008 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/237035.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/237035.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/237035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/237035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/237035.html</trackback:ping><description><![CDATA[inux必学的60个命令<br />
Linux提供了大量的命令，利用它可以有效地完成大量的工<br />
作，如磁盘操作、文件存取、目录操作、进程管理、文件权限设定等。所以，在Linux系统上工作离不开使用系统提供的命令。要想真正理解Linux系统，<br />
就必须从Linux命令学起，通过基础的命令学习可以进一步理解Linux系统。<br />
<span style="color: #000080;">不同Linux发行版的命令数量不一样，但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令，按照它们在系统中的作用分成下面六个部分一一介绍。</span><br />
<span style="color: #0000ff;">◆ 安装和登录命令：</span>login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last；<br />
<span style="color: #0000ff;">◆ 文件处理命令：</span>file、mkdir、grep、dd、find、mv、ls、diff、cat、ln；<br />
<span style="color: #0000ff;">◆ 系统管理相关命令：</span>df、top、free、quota、at、lp、adduser、groupadd、kill、crontab；<br />
<span style="color: #0000ff;">◆ 网络操作命令：</span>ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、 nslookup；<br />
<span style="color: #0000ff;">◆ 系统安全相关命令：</span>passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who；<br />
<span style="color: #0000ff;">◆ 其它命令：</span>tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。<br />
<span style="color: #000880;">本文以Mandrake Linux 9.1(Kenrel 2.4.21)为例，介绍Linux下的安装和登录命令。</span><br />
<span style="color: #00f600;"><strong>immortality按：</strong></span><span style="color: #00f600;">请用ctrl+f在本页中查找某一部分的内容或某一命令的用法。</span><br />
<span style="color: #00f000;"><strong>Linux必学的60个命令(1)-安装与登陆命令</strong></span><br />
<span style="color: #0000ff;">login</span><br />
1.作用<br />
login的作用是登录系统，它的使用权限是所有用户。<br />
2.格式<br />
login [name][－p ][－h 主机名称]<br />
3.主要参数<br />
－p:通知login保持现在的环境参数。<br />
－h:用来向远程登录的之间传输用户名。<br />
如果选择用命令行模式登录Linux的话，那么看到的第一个Linux命令就是login：。<br />
一般界面是这样的：<br />
Manddrake Linux release 9.1(Bamboo) for i586<br />
renrel 2.4.21－0.13mdk on i686 / tty1<br />
localhost login:root<br />
password:<br />
上面代码中，第一行是Linux发行版本号，第二行是内核版本号和登录的虚拟控制台，我们在第三行输入登录名，按&#8220;Enter&#8221;键在Password后输入账户密码，即可登录系统。出于安全考虑，输入账户密码时字符不会在屏幕上回显，光标也不移动。<br />
登录后会看到下面这个界面（以超级用户为例）：<br />
[root@localhost root]#<br />
last login:Tue ,Nov 18 10:00:55 on vc/1<br />
上面显示的是登录星期、月、日、时间和使用的虚拟控制台。<br />
4.应用技巧<br />
Linux<br />
是一个真正的多用户操作系统，可以同时接受多个用户登录，还允许一个用户进行多次登录。这是因为Linux和许多版本的Unix一样，提供了虚拟控制台的<br />
访问方式，允许用户在同一时间从控制台（系统的控制台是与系统直接相连的监视器和键盘）进行多次登录。每个虚拟控制台可以看作是一个独立的工作站，工作台<br />
之间可以切换。虚拟控制台的切换可以通过按下Alt键和一个功能键来实现，通常使用F1-F6 。<br />
例如，用户登录后，按一下&#8220;Alt+<br />
F2&#8221;键，用户就可以看到上面出现的&#8220;login:&#8221;提示符，说明用户看到了第二个虚拟控制台。然后只需按&#8220;Alt+<br />
F1&#8221;键，就可以回到第一个虚拟控制台。一个新安装的Linux系统允许用户使用&#8220;Alt+F1&#8221;到&#8220;Alt+F6&#8221;键来访问前六个虚拟控制台。虚拟控制<br />
台最有用的是，当一个程序出错造成系统死锁时，可以切换到其它虚拟控制台工作，关闭这个程序。<br />
<span style="color: #0000ff;">shutdown</span><br />
1.作用<br />
shutdown命令的作用是关闭计算机，它的使用权限是超级用户。<br />
2.格式<br />
shutdown [－h][－i][－k][－m][－t]<br />
3.重要参数<br />
－t：在改变到其它运行级别之前，告诉init程序多久以后关机。<br />
－k：并不真正关机，只是送警告信号给每位登录者。<br />
－h：关机后关闭电源。<br />
－c：cancel current process取消目前正在执行的关机程序。所以这个选项当然没有时间参数，但是可以输入一个用来解释的讯息，而这信息将会送到每位使用者。<br />
－F：在重启计算机时强迫fsck。<br />
－time：设定关机前的时间。<br />
－m: 将系统改为单用户模式。<br />
－i：关机时显示系统信息。<br />
4.命令说明<br />
shutdown<br />
命令可以安全地将系统关机。有些用户会使用直接断掉电源的方式来关闭Linux系统，这是十分危险的。因为Linux与Windows不同，其后台运行着<br />
许多进程，所以强制关机可能会导致进程的数据丢失，使系统处于不稳定的状态，甚至在有的系统中会损坏硬件设备（硬盘）。在系统关机前使用<br />
shutdown命令，系统管理员会通知所有登录的用户系统将要关闭，并且login指令会被冻结，即新的用户不能再登录。<br />
<span style="color: #0000ff;">halt</span><br />
1.作用<br />
halt命令的作用是关闭系统，它的使用权限是超级用户。<br />
2.格式<br />
halt [－n] [－w] [－d] [－f] [－i] [－p]<br />
3.主要参数说明<br />
－n：防止sync系统调用，它用在用fsck修补根分区之后，以阻止内核用老版本的超级块覆盖修补过的超级块。<br />
－w：并不是真正的重启或关机,只是写wtmp（/var/log/wtmp）纪录。<br />
－f：没有调用shutdown，而强制关机或重启。<br />
－i：关机（或重启）前，关掉所有的网络接口。<br />
－f：强迫关机，不呼叫shutdown这个指令。<br />
－p: 当关机的时候顺便做关闭电源的动作。<br />
－d：关闭系统，但不留下纪录。　<br />
4.命令说明<br />
halt<br />
就是调用shutdown<br />
－h。halt执行时，杀死应用进程，执行sync(将存于buffer中的资料强制写入硬盘中)系统调用，文件系统写操作完成后就会停止内核。若系统的<br />
运行级别为0或6，则关闭系统；否则以shutdown指令（加上－h参数）来取代。　<br />
<span style="color: #0000ff;">reboot</span><br />
1.作用<br />
reboot命令的作用是重新启动计算机，它的使用权限是系统管理者。<br />
2.格式<br />
reboot [－n] [－w] [－d] [－f] [－i]<br />
3.主要参数<br />
－n: 在重开机前不做将记忆体资料写回硬盘的动作。<br />
－w: 并不会真的重开机，只是把记录写到/var/log/wtmp文件里。<br />
－d: 不把记录写到/var/log/wtmp文件里（－n这个参数包含了－d）。<br />
－i: 在重开机之前先把所有与网络相关的装置停止。<br />
<span style="color: #0000ff;">install</span><br />
1.作用<br />
install命令的作用是安装或升级软件或备份数据，它的使用权限是所有用户。<br />
2.格式<br />
(1)install [选项]... 来源 目的地<br />
(2)install [选项]... 来源... 目录<br />
(3)install －d [选项]... 目录...<br />
在<br />
前两种格式中，会将复制至或将多个文件复制至已存在的，同时设定权<br />
限模式及所有者/所属组。在第三种格式中，会创建所有指定的目录及它们的主目录。长选项必须用的参数在使用短选项时也是必须的。<br />
3.主要参数<br />
－－backup[=CONTROL]：为每个已存在的目的地文件进行备份。<br />
－b：类似 －－backup，但不接受任何参数。<br />
－c：(此选项不作处理)。<br />
－d，－－directory：所有参数都作为目录处理，而且会创建指定目录的所有主目录。<br />
－D：创建前的所有主目录，然后将复制至 ；在第一种使用格式中有用。<br />
－g，－－group=组：自行设定所属组，而不是进程目前的所属组。<br />
－m，－－mode=模式：自行设定权限模式 (像chmod)，而不是rwxr－xr－x。<br />
－o，－－owner=所有者：自行设定所有者 (只适用于超级用户)。<br />
－p，－－preserve－timestamps：以文件的访问/修改时间作为相应的目的地文件的时间属性。<br />
－s，－－strip：用strip命令删除symbol table，只适用于第一及第二种使用格式。<br />
－S，－－suffix=后缀：自行指定备份文件的。<br />
－v，－－verbose：处理每个文件/目录时印出名称。<br />
－－help：显示此帮助信息并离开。<br />
－－version：显示版本信息并离开。<br />
<span style="color: #0000ff;">mount</span><br />
1.作用<br />
mount命令的作用是加载文件系统，它的用权限是超级用户或/etc/fstab中允许的使用者。<br />
2.格式<br />
mount －a [－fv] [－t vfstype] [－n] [－rw] [－F] device dir<br />
3.主要参数<br />
－h：显示辅助信息。<br />
－v：显示信息，通常和－f用来除错。<br />
－a：将/etc/fstab中定义的所有文件系统挂上。<br />
－F：这个命令通常和－a一起使用，它会为每一个mount的动作产生一个行程负责执行。在系统需要挂上大量NFS文件系统时可以加快加载的速度。<br />
－f：通常用于除错。它会使mount不执行实际挂上的动作，而是模拟整个挂上的过程，通常会和－v一起使用。<br />
－t vfstype：显示被加载文件系统的类型。<br />
－n：一般而言，mount挂上后会在/etc/mtab中写入一笔资料，在系统中没有可写入文件系统的情况下，可以用这个选项取消这个动作。<br />
4.应用技巧<br />
在Linux<br />
和Unix系统上，所有文件都是作为一个大型树（以/为根）的一部分访问的。要访问CD-ROM上的文件，需要将CD-ROM设备挂装在文件树中的某个挂<br />
装点。如果发行版安装了自动挂装包，那么这个步骤可自动进行。在Linux中，如果要使用硬盘、光驱等储存设备，就得先将它加载，当储存设备挂上了之后，<br />
就可以把它当成一个目录来访问。挂上一个设备使用mount命令。在使用mount这个指令时，至少要先知道下列三种信息：要加载对象的文件系统类型、要<br />
加载对象的设备名称及要将设备加载到哪个目录下。<br />
（1）Linux可以识别的文件系统<br />
◆ Windows 95/98常用的FAT 32文件系统：vfat ；<br />
◆ Win NT/2000 的文件系统：ntfs ；<br />
◆ OS/2用的文件系统：hpfs；<br />
◆ Linux用的文件系统：ext2、ext3；<br />
◆ CD-ROM光盘用的文件系统：iso9660。<br />
虽然vfat是指FAT 32系统，但事实上它也兼容FAT 16的文件系统类型。<br />
（2）确定设备的名称<br />
在Linux<br />
中，设备名称通常都存在/dev里。这些设备名称的命名都是有规则的，可以用&#8220;推理&#8221;的方式把设备名称找出来。例如，/dev/hda1这个<br />
IDE设备，hd是Hard Disk(硬盘)的，sd是SCSI Device，fd是Floppy Device(或是Floppy<br />
Disk?)。a代表第一个设备，通常IDE接口可以接上4个IDE设备(比如4块硬盘)。所以要识别IDE硬盘的方法分别就是hda、hdb、hdc、<br />
hdd。hda1中的&#8220;1&#8221;代表hda的第一个硬盘分区<br />
(partition)，hda2代表hda的第二主分区，第一个逻辑分区从hda5开始，依此类推。此外，可以直接检查<br />
/var/log/messages文件，在该文件中可以找到计算机开机后系统已辨认出来的设备代号。<br />
（3）查找挂接点<br />
在决<br />
定将设备挂接之前，先要查看一下计算机是不是有个/mnt的空目录，该目录就是专门用来当作挂载点(Mount<br />
Point)的目录。建议在/mnt里建几个/mnt/cdrom、/mnt/floppy、/mnt/mo等目录，当作目录的专用挂载点。举例而言，如<br />
要挂载下列5个设备，其执行指令可能如下 (假设都是Linux的ext2系统，如果是Windows XX请将ext2改成vfat)：<br />
软盘 ===&gt;mount －t ext2 /dev/fd0 /mnt/floppy<br />
cdrom ===&gt;mount －t iso9660 /dev/hdc /mnt/cdrom<br />
SCSI cdrom ===&gt;mount －t iso9660 /dev/sdb /mnt/scdrom<br />
SCSI cdr ===&gt;mount －t iso9660 /dev/sdc /mnt/scdr<br />
不过目前大多数较新的Linux发行版本（包括红旗 Linux、中软Linux、Mandrake Linux等）都可以自动挂装文件系统，但Red Hat Linux除外。<br />
<span style="color: #0000ff;">umount</span><br />
1.作用<br />
umount命令的作用是卸载一个文件系统，它的使用权限是超级用户或/etc/fstab中允许的使用者。<br />
2.格式<br />
unmount －a [－fFnrsvw] [－t vfstype] [－n] [－rw] [－F] device dir<br />
3.使用说明<br />
umount<br />
命令是mount命令的逆操作，它的参数和使用方法和mount命令是一样的。Linux挂装CD-ROM后，会锁定CD—ROM，这样就不能用CD-<br />
ROM面板上的Eject按钮弹出它。但是，当不再需要光盘时，如果已将/cdrom作为符号链接，请使用umount/cdrom来卸装它。仅当无用户<br />
正在使用光盘时，该命令才会成功。该命令包括了将带有当前工作目录当作该光盘中的目录的终端窗口。<br />
<span style="color: #0000ff;">chsh</span><br />
1.作用<br />
chsh命令的作用是更改使用者shell设定，它的使用权限是所有使用者。<br />
2.格式<br />
chsh [ －s ] [ －list] [ －－help ] [ －v ] [ username ]<br />
3.主要参数<br />
－l：显示系统所有Shell类型。<br />
－v：显示Shell版本号。<br />
4.应用技巧<br />
前面介绍了Linux下有多种Shell，一般缺省的是Bash，如果想更换Shell类型可以使用chsh命令。先输入账户密码，然后输入新Shell类型，如果操作正确系统会显示&#8220;Shell change&#8221;。其界面一般如下：<br />
Changing fihanging shell for cao<br />
Password:<br />
New shell [/bin/bash]: /bin/tcsh<br />
上面代码中，[ ]内是目前使用的Shell。普通用户只能修改自己的Shell，超级用户可以修改全体用户的Shell。要想查询系统提供哪些Shell，可以使用chsh -l 命令，见图1所示。<br />
图1 系统可以使用的Shell类型<br />
从图1中可以看到，笔者系统中可以使用的Shell有bash（缺省）、csh、sh、tcsh四种。<br />
<span style="color: #0000ff;">exit</span><br />
1.作用<br />
exit命令的作用是退出系统，它的使用权限是所有用户。<br />
2.格式<br />
exit<br />
3.参数<br />
exit命令没有参数，运行后退出系统进入登录界面。<br />
<span style="color: #0000ff;">last</span><br />
1.作用<br />
last命令的作用是显示近期用户或终端的登录情况，它的使用权限是所有用户。通过last命令查看该程序的log，管理员可以获知谁曾经或企图连接系统。<br />
2.格式<br />
1ast[—n][－f file][－t tty] [—h 节点][－I —IP][—1][－y][1D]<br />
3.主要参数<br />
－n：指定输出记录的条数。<br />
－f file：指定用文件file作为查询用的log文件。<br />
－t tty：只显示指定的虚拟控制台上登录情况。<br />
－h 节点：只显示指定的节点上的登录情况。<br />
－i IP：只显示指定的IP上登录的情况。<br />
－1：用IP来显示远端地址。<br />
－y：显示记录的年、月、日。<br />
－ID：知道查询的用户名。<br />
－x:显示系统关闭、用户登录和退出的历史。<br />
动手练习<br />
上面介绍了Linux安装和登录命令，下面介绍几个实例，动手练习一下刚才讲过的命令。<br />
1.一次运行多个命令<br />
在一个命令行中可以执行多个命令，用分号将各个命令隔开即可，例如：<br />
＃last －x；halt<br />
上面代码表示在显示系统关闭、用户登录和退出的历史后关闭计算机。<br />
2.利用mount挂装文件系统访问Windows系统<br />
许多Linux发行版本现在都可以自动加载Vfat分区来访问Windows系统，而Red Hat各个版本都没有自动加载Vfat分区，因此还需要进行手工操作。<br />
mount<br />
可以将Windows分区作为Linux的一个&#8220;文件&#8221;挂接到Linux的一个空文件夹下，从而将Windows的分区和/mnt这个目录联系起来。因<br />
此，只要访问这个文件夹就相当于访问该分区了。首先要在/mnt下建立winc文件夹，在命令提示符下输入下面命令：<br />
＃mount -t vfat /dev/hda1 /mnt/winc<br />
即<br />
表示将Windows的C分区挂到Liunx的/mnt/winc目录下。这时，在/mnt/winc目录下就可以看到Windows中C盘的内容了。使<br />
用类似的方法可以访问Windows系统的D、E盘。在Linux系统显示Windows的分区一般顺序这样的：hda1为C盘、hda5为D盘、<br />
hda6为E盘&#8230;&#8230;以此类推。上述方法可以查看Windows系统有一个很大的问题，就是Windows中的所有中文文件名或文件夹名全部显示为问号<br />
&#8220;？&#8221;，而英文却可以正常显示。我们可以通过加入一些参数让它显示中文。还以上面的操作为例，此时输入命令：<br />
＃mount -t vfat -o iocharset=cp936 /dev/hda1 /mnt/winc<br />
现在它就可以正常显示中文了。<br />
3.使用mount加挂闪盘上的文件系统<br />
在Linux下使用闪盘非常简单。Linux对USB设备有很好的支持，当插入闪盘后，闪盘被识别为一个SCSI盘，通常输入以下命令：<br />
＃ mount /dev/sda1 /usb<br />
就能够加挂闪盘上的文件系统。<br />
小知识<br />
Linux命令与Shell<br />
所<br />
谓Shell，就是命令解释程序，它提供了程序设计接口，可以使用程序来编程。学习Shell对于Linux初学者理解Linux系统是非常重要的。<br />
Linux系统的Shell作为操作系统的外壳，为用户提供了使用操作系统的接口。Shell是命令语言、命令解释程序及程序设计语言的统称，是用户和<br />
Linux内核之间的接口程序。如果把Linux内核想象成一个球体的中心，Shell就是围绕内核的外层。当从Shell或其它程序向Linux传递命<br />
令时，内核会做出相应的反应。Shell在Linux系统的作用和MS DOS下的COMMAND.COM和Windows 95/98 的<br />
explorer.exe相似。Shell虽然不是系统核心的一部分，只是系统核心的一个外延，但它能够调用系统内核的大部分功能。因此，可以说<br />
Shell是Unux/Linux最重要的实用程序。<br />
Linux中的Shell有多种类型，其中最常用的是Bourne<br />
Shell(sh)、C Shell(csh)和Korn Shell(ksh)。大多数Linux发行版本缺省的Shell是Bourne<br />
Again Shell，它是Bourne Shell的扩展，简称bash，与Bourne Shell完全向后兼容，并且在Bourne<br />
Shell的基础上增加了很多特性。bash放在/bin/bash中，可以提供如命令补全、命令编辑和命令历史表等功能。它还包含了很多C<br />
Shell和Korn<br />
Shell中的优点，有灵活和强大的编程接口，同时又有很友好的用户界面。Linux系统中200多个命令中有40个是bash的内部命令，主要包括<br />
exit、less、lp、kill、 cd、pwd、fc、fg等。<br />
<br />
<br />
<span style="color: #00f000;"><strong>Linux必学的60个命令(2)-文件处理命令</strong></span><br />
Linux<br />
系统信息存放在文件里，文件与普通的公务文件类似。每个文件都有自己的名字、内容、存放地址及其它一些管理信息，如文件的用户、文件的大小等。文件可以是<br />
一封信、一个通讯录，或者是程序的源语句、程序的数据，甚至可以包括可执行的程序和其它非正文内容。<br />
Linux文件系统具有良好的结构，系统提供了很多文件处理程序。这里主要介绍常用的文件处理命令。<br />
<span style="color: #0000ff;">file</span><br />
1.作用 件内容判断文件类型，使用权限是所有用户。<br />
2.格式<br />
file通过探测文<br />
file [options] 文件名<br />
3.[options]主要参数<br />
-v：在标准输出后显示版本信息，并且退出。<br />
-z：探测压缩过的文件类型。<br />
-L：允许符合连接。<br />
-f name：从文件namefile中读取要分析的文件名列表。<br />
4.简单说明<br />
使用file命令可以知道某个文件究竟是二进制（ELF格式）的可执行文件, 还是Shell Script文件，或者是其它的什么格式。file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。<br />
5.应用实例<br />
如果我们看到一个没有后缀的文件grap，可以使用下面命令：<br />
$ file grap<br />
grap： English text<br />
此时系统显示这是一个英文文本文件。需要说明的是，file命令不能探测包括图形、音频、视频等多媒体文件类型。<br />
<span style="color: #0000ff;">mkdir</span><br />
1.作用<br />
mkdir命令的作用是建立名称为dirname的子目录，与MS DOS下的md命令类似，它的使用权限是所有用户。<br />
2.格式<br />
mkdir [options] 目录名<br />
3.[options]主要参数<br />
－m, －－mode=模式：设定权限，与chmod类似。<br />
－p, －－parents：需要时创建上层目录；如果目录早已存在，则不当作错误。<br />
－v, －－verbose：每次创建新目录都显示信息。<br />
－－version：显示版本信息后离开。<br />
4.应用实例<br />
在进行目录创建时可以设置目录的权限，此时使用的参数是&#8220;－m&#8221;。假设要创建的目录名是&#8220;tsk&#8221;，让所有用户都有rwx(即读、写、执行的权限)，那么可以使用以下命令：<br />
$ mkdir －m 777 tsk<br />
<span style="color: #0000ff;">grep</span><br />
1.作用<br />
grep命令可以指定文件中搜索特定的内容，并将含有这些内容的行标准输出。grep全称是Global Regular Expression Print，表示全局正则表达式版本，它的使用权限是所有用户。<br />
2.格式<br />
grep [options]<br />
3.主要参数<br />
[options]主要参数：<br />
－c：只输出匹配行的计数。<br />
－I：不区分大小写（只适用于单字符）。<br />
－h：查询多文件时不显示文件名。<br />
－l：查询多文件时只输出包含匹配字符的文件名。<br />
－n：显示匹配行及行号。<br />
－s：不显示不存在或无匹配文本的错误信息。<br />
－v：显示不包含匹配文本的所有行。<br />
pattern正则表达式主要参数：<br />
\：忽略正则表达式中特殊字符的原有含义。<br />
^：匹配正则表达式的开始行。<br />
$: 匹配正则表达式的结束行。<br />
\：到匹配正则表达式的行结束。<br />
[ ]：单个字符，如[A]即A符合要求 。<br />
[ - ]：范围，如[A-Z]，即A、B、C一直到Z都符合要求 。<br />
。：所有的单个字符。<br />
* ：有字符，长度可以为0。<br />
正<br />
则表达式是Linux/Unix系统中非常重要的概念。正则表达式（也称为&#8220;regex&#8221;或&#8220;regexp&#8221;）是一个可以描述一类字符串的模式<br />
（Pattern）。如果一个字符串可以用某个正则表达式来描述，我们就说这个字符和该正则表达式匹配（Match）。这和DOS中用户可以使用通配符<br />
&#8220;*&#8221;代表任意字符类似。在Linux系统上，正则表达式通常被用来查找文本的模式，以及对文本执行&#8220;搜索－替换&#8221;操作和其它功能。<br />
4.应用实例<br />
查<br />
询DNS服务是日常工作之一，这意味着要维护覆盖不同网络的大量IP地址。有时IP地址会超过2000个。如果要查看nnn.nnn网络地址，但是却忘了<br />
第二部分中的其余部分，只知到有两个句点，例如nnn nn..。要抽取其中所有nnn.nnn IP地址，使用[0－9 ]\{3<br />
\}\.[0－0\{3\}\。含义是任意数字出现3次，后跟句点，接着是任意数字出现3次，后跟句点。<br />
$grep '[0－9 ]\{3 \}\.[0－0\{3\}\' ipfile<br />
补充说明，grep家族还包括fgrep和egrep。fgrep是fix grep，允许查找字符串而不是一个模式；egrep是扩展grep，支持基本及扩展的正则表达式，但不支持\q模式范围的应用及与之相对应的一些更加规范的模式。<br />
<span style="color: #0000ff;">dd</span><br />
1.作用<br />
dd命令用来复制文件，并根据参数将数据转换和格式化。<br />
2.格式<br />
dd [options]<br />
3.[opitions]主要参数<br />
bs=字节：强迫 ibs=及obs=。<br />
cbs=字节：每次转换指定的。<br />
conv=关键字：根据以逗号分隔的关键字表示的方式来转换文件。<br />
count=块数目：只复制指定的输入数据。<br />
ibs=字节：每次读取指定的。<br />
if=文件：读取内容，而非标准输入的数据。<br />
obs=字节：每次写入指定的。<br />
of=文件：将数据写入，而不在标准输出显示。<br />
seek=块数目：先略过以obs为单位的指定的输出数据。<br />
skip=块数目：先略过以ibs为单位的指定的输入数据。<br />
4.应用实例<br />
dd命令常常用来制作Linux启动盘。先找一个可引导内核，令它的根设备指向正确的根分区，然后使用dd命令将其写入软盘：<br />
$ rdev vmlinuz /dev/hda<br />
$dd if＝vmlinuz of＝/dev/fd0<br />
上面代码说明，使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda，请把&#8220;hda&#8221;换成自己的根分区，接下来用dd命令将该内核写入软盘。<br />
<span style="color: #0000ff;">find</span><br />
1.作用<br />
find命令的作用是在目录中搜索文件，它的使用权限是所有用户。<br />
2.格式<br />
find [path][options][expression]<br />
path指定目录路径，系统从这里开始沿着目录树向下查找文件。它是一个路径列表，相互用空格分离，如果不写path，那么默认为当前目录。<br />
3.主要参数<br />
[options]参数：<br />
－depth：使用深度级别的查找过程方式，在某层指定目录中优先查找文件内容。<br />
－maxdepth levels：表示至多查找到开始目录的第level层子目录。level是一个非负数，如果level是0的话表示仅在当前目录中查找。<br />
－mindepth levels：表示至少查找到开始目录的第level层子目录。<br />
－mount：不在其它文件系统（如Msdos、Vfat等）的目录和文件中查找。<br />
－version：打印版本。<br />
[expression]是匹配表达式，是find命令接受的表达式，find命令的所有操作都是针对表达式的。它的参数非常多，这里只介绍一些常用的参数。<br />
—name：支持统配符*和?。<br />
－atime n：搜索在过去n天读取过的文件。<br />
－ctime n：搜索在过去n天修改过的文件。<br />
－group grpoupname：搜索所有组为grpoupname的文件。<br />
－user 用户名：搜索所有文件属主为用户名（ID或名称）的文件。<br />
－size n：搜索文件大小是n个block的文件。<br />
－print：输出搜索结果，并且打印。<br />
4.应用技巧<br />
find命令查找文件的几种方法：<br />
（1）根据文件名查找<br />
例如，我们想要查找一个文件名是lilo.conf的文件，可以使用如下命令：<br />
find / －name lilo.conf<br />
find命令后的&#8220;/&#8221;表示搜索整个硬盘。<br />
（2）快速查找文件<br />
根<br />
据文件名查找文件会遇到一个实际问题，就是要花费相当长的一段时间，特别是大型Linux文件系统和大容量硬盘文件放在很深的子目录中时。如果我们知道了<br />
这个文件存放在某个目录中，那么只要在这个目录中往下寻找就能节省很多时间。比如smb.conf文件，从它的文件后缀&#8220;.conf&#8221;可以判断这是一个配<br />
置文件，那么它应该在/etc目录内，此时可以使用下面命令：<br />
find /etc －name smb.conf<br />
这样，使用&#8220;快速查找文件&#8221;方式可以缩短时间。<br />
（3）根据部分文件名查找方法<br />
有时我们知道只某个文件包含有abvd这4个字，那么要查找系统中所有包含有这4个字符的文件可以输入下面命令：<br />
find / －name '*abvd*'<br />
输入这个命令以后，Linux系统会将在/目录中查找所有的包含有abvd这4个字符的文件（其中*是通配符），比如abvdrmyz等符合条件的文件都能显示出来。<br />
(4) 使用混合查找方式查找文件<br />
find命令可以使用混合查找的方法，例如，我们想在/etc目录中查找大于500000字节，并且在24小时内修改的某个文件，则可以使用-and (与)把两个查找参数链接起来组合成一个混合的查找方式。<br />
find /etc -size +500000c -and -mtime +1<br />
<span style="color: #0000ff;">mv</span><br />
1.作用<br />
mv命令用来为文件或目录改名，或者将文件由一个目录移入另一个目录中，它的使用权限是所有用户。该命令如同DOS命令中的ren和move的组合。<br />
2.格式<br />
mv[options] 源文件或目录 目标文件或目录<br />
3.[options]主要参数<br />
－i：交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖，此时系统询问是否重写，要求用户回答&#8220;y&#8221;或&#8220;n&#8221;，这样可以避免误覆盖文件。<br />
－f：禁止交互操作。mv操作要覆盖某个已有的目标文件时不给任何指示，指定此参数后i参数将不再起作用。<br />
4.应用实例<br />
（1）将/usr/cbu中的所有文件移到当前目录（用&#8220;.&#8221;表示）中：<br />
$ mv /usr/cbu/ * .<br />
（2）将文件cjh.txt重命名为wjz.txt：<br />
$ mv cjh.txt wjz.txt　<br />
<span style="color: #0000ff;">ls</span><br />
1.作用<br />
ls命令用于显示目录内容，类似DOS下的dir命令，它的使用权限是所有用户。<br />
2.格式<br />
ls [options][filename]<br />
3.options主要参数<br />
－a, －－all：不隐藏任何以&#8220;.&#8221; 字符开始的项目。<br />
－A, －－almost－all：列出除了&#8220; . &#8221;及 &#8220;.. &#8221;以外的任何项目。<br />
－－author：印出每个文件著作者。<br />
－b, －－escape：以八进制溢出序列表示不可打印的字符。<br />
－－block－size=大小：块以指定的字节为单位。<br />
－B, －－ignore－backups：不列出任何以 ~ 字符结束的项目。<br />
－f：不进行排序，－aU参数生效，－lst参数失效。<br />
－F, －－classify：加上文件类型的指示符号 (*/=@| 其中一个)。<br />
－g：like －l, but do not list owner。<br />
－G, －－no－group：inhibit display of group information。<br />
－i, －－inode：列出每个文件的inode号。<br />
－I, －－ignore=样式：不印出任何符合Shell万用字符的项目。<br />
－k：即－－block－size=1K。<br />
－l：使用较长格式列出信息。<br />
－L, －－dereference：当显示符号链接的文件信息时，显示符号链接所指示的对象，而并非符号链接本身的信息。<br />
－m：所有项目以逗号分隔，并填满整行行宽。<br />
－n, －－numeric－uid－gid：类似－l，但列出UID及GID号。<br />
－N, －－literal：列出未经处理的项目名称，例如不特别处理控制字符。<br />
－p, －－file－type：加上文件类型的指示符号 (/=@| 其中一个)。<br />
－Q, －－quote－name：将项目名称括上双引号。<br />
－r, －－reverse：依相反次序排列。<br />
－R, －－recursive：同时列出所有子目录层。<br />
－s, －－size：以块大小为序。<br />
4.应用举例<br />
ls<br />
命令是Linux系统使用频率最多的命令，它的参数也是Linux命令中最多的。使用ls命令时会有几种不同的颜色，其中蓝色表示是目录，绿色表示是可执<br />
行文件，红色表示是压缩文件，浅蓝色表示是链接文件，加粗的黑色表示符号链接，灰色表示是其它格式文件。ls最常使用的是ls- l，见图1所示。<br />
图1 使用ls-l命令<br />
文<br />
件类型开头是由10个字符构成的字符串。其中第一个字符表示文件类型，它可以是下述类型之一：－（普通文件）、d（目录）、l（符号链接）、b（块设备文<br />
件）、c（字符设备文件）。后面的9个字符表示文件的访问权限，分为3组，每组3位。第一组表示文件属主的权限，第二组表示同组用户的权限，第三组表示其<br />
他用户的权限。每一组的三个字符分别表示对文件的读（r）、写（w）和执行权限（x）。对于目录，表示进入权限。s表示当文件被执行时，把该文件的UID<br />
或GID赋予执行进程的UID（用户ID）或GID（组<br />
ID）。t表示设置标志位（留在内存，不被换出）。如果该文件是目录，那么在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文<br />
件，那么在该文件执行后，指向其正文段的指针仍留在内存。这样再次执行它时，系统就能更快地装入该文件。接着显示的是文件大小、生成时间、文件或命令名<br />
称。<br />
<span style="color: #0000ff;">diff</span><br />
1.作用<br />
diff命令用于两个文件之间的比较，并指出两者的不同，它的使用权限是所有用户。<br />
2.格式<br />
diff [options] 源文件 目标文件<br />
3.[options]主要参数<br />
-a：将所有文件当作文本文件来处理。<br />
-b：忽略空格造成的不同。<br />
-B：忽略空行造成的不同。<br />
-c：使用纲要输出格式。<br />
-H：利用试探法加速对大文件的搜索。<br />
-I：忽略大小写的变化。<br />
-n --rcs：输出RCS格式。<br />
<span style="color: #0000ff;">cmp</span><br />
1.作用<br />
cmp（&#8220;compare&#8221;的缩写）命令用来简要指出两个文件是否存在差异，它的使用权限是所有用户。<br />
2.格式<br />
cmp[options] 文件名<br />
3.[options]主要参数<br />
-l: 将字节以十进制的方式输出，并方便将两个文件中不同的以八进制的方式输出。<br />
<span style="color: #0000ff;">cat</span><br />
1.作用<br />
cat（&#8220;concatenate&#8221;的缩写）命令用于连接并显示指定的一个和多个文件的有关信息，它的使用权限是所有用户。<br />
2.格式<br />
cat [options] 文件1 文件2&#8230;&#8230;<br />
3.[options]主要参数<br />
－n：由第一行开始对所有输出的行数编号。<br />
－b：和－n相似，只不过对于空白行不编号。<br />
－s：当遇到有连续两行以上的空白行时，就代换为一行的空白行。<br />
4.应用举例<br />
（1）cat命令一个最简单的用处是显示文本文件的内容。例如，我们想在命令行看一下README文件的内容，可以使用命令：<br />
$ cat README　<br />
（2）<br />
有时需要将几个文件处理成一个文件，并将这种处理的结果保存到一个单独的输出文件。cat命令在其输入上接受一个或多个文件，并将它们作为一个单独的文件<br />
打印到它的输出。例如，把README和INSTALL的文件内容加上行号（空白行不加）之后，将内容附加到一个新文本文件File1 中：<br />
$ cat README INSTALL File1<br />
（3）cat还有一个重要的功能就是可以对行进行编号，见图2所示。这种功能对于程序文档的编制，以及法律和科学文档的编制很方便，打印在左边的行号使得参考文档的某一部分变得容易，这些在编程、科学研究、业务报告甚至是立法工作中都是非常重要的。<br />
图2 使用cat命令/etc/named.conf文件进行编号<br />
对行进行编号功能有-b（只能对非空白行进行编号）和-n（可以对所有行进行编号）两个参数：<br />
$ cat -b /etc/named.conf<br />
<span style="color: #0000ff;">ln</span><br />
1.作用<br />
ln命令用来在文件之间创建链接，它的使用权限是所有用户。<br />
2.格式<br />
ln [options] 源文件 [链接名]<br />
3.参数<br />
－f：链结时先将源文件删除。<br />
－d：允许系统管理者硬链结自己的目录。<br />
－s：进行软链结(Symbolic Link)。<br />
－b：将在链结时会被覆盖或删除的文件进行备份。<br />
链接有两种，一种被称为硬链接（Hard Link），另一种被称为符号链接（Symbolic Link）。默认情况下，ln命令产生硬链接。<br />
硬<br />
连接指通过索引节点来进行的连接。在Linux的文件系统中，保存在磁盘分区中的文件不管是什么类型都给它分配一个编号，称为索引节点号(Inode<br />
Index)。在Linux中，多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名，这样用户<br />
就可以建立硬连接到重要文件，以防止&#8220;误删&#8221;的功能。其原因如上所述，因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和<br />
其它的连接，只有当最后一个连接被删除后，文件的数据块及目录的连接才会被释放。也就是说，文件才会被真正删除。<br />
与硬连接相对应，Lnux系统中还存在另一种连接，称为符号连接（Symbilc Link），也叫软连接。软链接文件有点类似于Windows的快捷方式。它实际上是特殊文件的一种。在符号连接中，文件实际上是一个文本文件，其中包含的有另一文件的位置信息。<br />
动手练习<br />
上面我们介绍了Linux文件处理命令，下面介绍几个实例，大家可以动手练习一下刚才讲过的命令。<br />
1.利用符号链接快速访问关键目录<br />
符<br />
号链接是一个非常实用的功能。假设有一些目录或文件需要频繁使用，但由于Linux的文件和目录结构等原因，这个文件或目录在很深的子目录中。比如，<br />
Apache<br />
Web服务器文档位于系统的/usr/local/httpd/htdocs中，并且不想每次都要从主目录进入这样一个长的路径之中(实际上，这个路径也<br />
非常不容易记忆)。<br />
为了解决这个问题，可以在主目录中创建一个符号链接，这样在需要进入该目录时，只需进入这个链接即可。<br />
为了能方便地进入Web服务器(/usr/local/httpd/htdocs)文档所在的目录，在主目录下可以使用以下命令：<br />
$ ln -s /usr/local/httpd/htdocs gg<br />
这样每次进入gg目录就可访问Web服务器的文档，以后如果不再访问Web服务器的文档时，删除gg即可，而真正的Web服务器的文档并没有删除。<br />
2.使用dd命令将init.rd格式的root.ram内容导入内存<br />
dd if=/dev/fd0 of=floppy.fd<br />
dd if=root.ram of=/dev/ram0 #<br />
3.grep命令系统调用<br />
grep是Linux/Unix中使用最广泛的命令之一，许多Linux系统内部都可以调用它。<br />
(1)如果要查询目录列表中的目录，方法如下：<br />
$ ls -l | grep '∧d'<br />
(2)如果在一个目录中查询不包含目录的所有文件，方法如下：<br />
$ ls -l | grep '∧[∧d]'<br />
(3)用find命令调用grep，如所有C源代码中的&#8220;Chinput&#8221;，方法如下：<br />
$find /ZhXwin -name *.c -exec grep -q -s Chinput {} \;-print<br />
<span style="color: #00f000;"><strong>Linux必学的60个命令(3)-系统管理命令</strong></span><br />
Linux必学的系统管理命令<br />
对于Linux系统来说，无论是中央处理器、内存、磁盘驱动器、键盘、鼠标，还是用户等都是文件，Linux系统管理的命令是它正常运行的核心。熟悉了Linux常用的文件处理命令以后，这一讲介绍对系统和用户进行管理的命令。<br />
<span style="color: #0000ff;">df</span><br />
1.作用<br />
df命令用来检查文件系统的磁盘空间占用情况，使用权限是所有用户。<br />
2.格式<br />
df [options]<br />
3.主要参数<br />
－s：对每个Names参数只给出占用的数据块总数。<br />
－a：递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定－s，也不指定－a，则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。<br />
－k：以1024字节为单位列出磁盘空间使用情况。<br />
－x：跳过在不同文件系统上的目录不予统计。<br />
－l：计算所有的文件大小，对硬链接文件则计算多次。<br />
－i：显示inode信息而非块使用量。<br />
－h：以容易理解的格式印出文件系统大小，例如136KB、254MB、21GB。<br />
－P：使用POSIX输出格式。<br />
－T：显示文件系统类型。<br />
4.说明<br />
df命令被广泛地用来生成文件系统的使用统计数据，它能显示系统中所有的文件系统的信息，包括总容量、可用的空闲空间、目前的安装点等。<br />
超<br />
级权限用户使用df命令时会发现这样的情况：某个分区的容量超过了100％。这是因为Linux系统为超级用户保留了10％的空间，由其单独支配。也就是<br />
说，对于超级用户而言，他所见到的硬盘容量将是110％。这样的安排对于系统管理而言是有好处的，当硬盘被使用的容量接近100％时系统管理员还可以正常<br />
工作。<br />
5.应用实例<br />
Linux支持的文件系统非常多，包括JFS、ReiserFS、ext、ext2、ext3、ISO9660、XFS、Minx、vfat、MSDOS等。使用df -T命令查看磁盘空间时还可以得到文件系统的信息：<br />
＃df －T<br />
文件系统 类型 容量 已用 可用 已用% 挂载点<br />
/dev/hda7 reiserfs 5.2G 1.6G 3.7G 30% /<br />
/dev/hda1 vfat 2.4G 1.6G 827M 66% /windows/C<br />
/dev/hda5 vfat 3.0G 1.7G 1.3G 57% /windows/D<br />
/dev/hda9 vfat 3.0G 2.4G 566M 82% /windows/E<br />
/dev/hda10 NTFS 3.2G 573M 2.6G 18% /windows/F<br />
/dev/hda11 vfat 1.6G 1.5G 23M 99% /windows/G<br />
从上面除了可以看到磁盘空间的容量、使用情况外，分区的文件系统类型、挂载点等信息也一览无遗。<br />
<span style="color: #0000ff;">top</span><br />
1.作用<br />
top命令用来显示执行中的程序进程，使用权限是所有用户。<br />
2.格式<br />
top [－] [d delay] [q] [c] [S] [s] <em>[n]<br />
3.主要参数<br />
d：指定更新的间隔，以秒计算。<br />
q：没有任何延迟的更新。如果使用者有超级用户，则top命令将会以最高的优先序执行。<br />
c：显示进程完整的路径与名称。<br />
S：累积模式，会将己完成或消失的子行程的CPU时间累积起来。<br />
s：安全模式。<br />
i：不显示任何闲置(Idle)或无用(Zombie)的行程。<br />
n：显示更新的次数，完成后将会退出top。<br />
4.说明<br />
top命令是Linux系统管理的一个主要命令，通过它可以获得许多信息。这里我们结合图1来说明它给出的信息。<br />
图1 top命令的显示<br />
在<br />
图1中，第一行表示的项目依次为当前时间、系统启动时间、当前系统登录用户数目、平均负载。第二行显示的是所有启动的进程、目前运行的、挂起<br />
(Sleeping)的和无用(Zombie)的进程。第三行显示的是目前CPU的使用情况，包括系统占用的比例、用户使用比例、闲置(Idle)比例。<br />
第四行显示物理内存的使用情况，包括总的可以使用的内存、已用内存、空闲内存、缓冲区占用的内存。第五行显示交换分区使用情况，包括总的交换分区、使用<br />
的、空闲的和用于高速缓存的大小。第六行显示的项目最多，下面列出了详细解释。<br />
PID（Process ID）：进程标示号。<br />
USER：进程所有者的用户名。<br />
PR：进程的优先级别。<br />
NI：进程的优先级别数值。<br />
VIRT：进程占用的虚拟内存值。<br />
RES：进程占用的物理内存值。<br />
SHR：进程使用的共享内存值。<br />
S：进程的状态，其中S表示休眠，R表示正在运行，Z表示僵死状态，N表示该进程优先值是负数。<br />
%CPU：该进程占用的CPU使用率。<br />
%MEM：该进程占用的物理内存和总内存的百分比。<br />
TIME＋：该进程启动后占用的总的CPU时间。<br />
Command：进程启动的启动命令名称，如果这一行显示不下，进程会有一个完整的命令行。<br />
top命令使用过程中，还可以使用一些交互的命令来完成其它参数的功能。这些命令是通过快捷键启动的。<br />
：立刻刷新。<br />
P：根据CPU使用大小进行排序。<br />
T：根据时间、累计时间排序。<br />
q：退出top命令。<br />
m：切换显示内存信息。<br />
t：切换显示进程和CPU状态信息。<br />
c：切换显示命令名称和完整命令行。<br />
M：根据使用内存大小进行排序。<br />
W：将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。<br />
可以看到，top命令是一个功能十分强大的监控系统的工具，对于系统管理员而言尤其重要。但是，它的缺点是会消耗很多系统资源。<br />
5.应用实例<br />
使用top命令可以监视指定用户，缺省情况是监视所有用户的进程。如果想查看指定用户的情况，在终端中按&#8220;U&#8221;键，然后输入用户名，系统就会切换为指定用户的进程运行界面，见图2所示。<br />
图2 使用top命令监视指定用户<br />
<span style="color: #0000ff;">free</span><br />
1.作用<br />
free命令用来显示内存的使用情况，使用权限是所有用户。<br />
2.格式<br />
free [－b|－k|－m] [－o] [－s delay] [－t] [－V]<br />
3.主要参数<br />
－b －k －m：分别以字节（KB、MB）为单位显示内存使用情况。<br />
－s delay：显示每隔多少秒数来显示一次内存使用情况。<br />
－t：显示内存总和列。<br />
－o：不显示缓冲区调节列。<br />
4.应用实例<br />
free命令是用来查看内存使用情况的主要命令。和top命令相比，它的优点是使用简单，并且只占用很少的系统资源。通过－S参数可以使用free命令不间断地监视有多少内存在使用，这样可以把它当作一个方便实时监控器。<br />
＃free －b －s5<br />
使用这个命令后终端会连续不断地报告内存使用情况（以字节为单位），每5秒更新一次。<br />
<span style="color: #0000ff;">quota</span><br />
1.作用<br />
quota命令用来显示磁盘使用情况和限制情况，使用权限超级用户。<br />
2.格式<br />
quota [－g][－u][－v][－p] 用户名 组名<br />
3.参数<br />
－g：显示用户所在组的磁盘使用限制。<br />
－u：显示用户的磁盘使用限制。<br />
－v：显示没有分配空间的文件系统的分配情况。<br />
－p：显示简化信息。<br />
4.应用实例<br />
在企业应用中磁盘配额非常重要，普通用户要学会看懂自己的磁盘使用情况。要查询自己的磁盘配额可以使用下面命令（下例中用户账号是caojh)：<br />
＃quota caojh<br />
Disk quotas for user caojh(uid 502):<br />
Filesystem blocks quota limit grace files quota limit grace<br />
/dev/hda3 58 200000 400000 41 500 1000<br />
以上显示ID号为502的caojh账号，文件个数设置为500～1000个，硬盘空间限制设置为200MB～400MB。一旦磁盘配额要用完时，就需要删除一些垃圾文件或向系统管理员请求追加配额。<br />
<span style="color: #0000ff;">at</span><br />
1.作用<br />
at命令用来在指定时刻执行指定的命令序列。<br />
2.格式<br />
at [－V] [－q x] [－f file] [－m] time<br />
3.主要参数<br />
－V：显示标准错误输出。<br />
－q：许多队列输出。<br />
－f：从文件中读取作业。<br />
－m：执行完作业后发送电子邮件到用户。<br />
time：设定作业执行的时间。time格式有严格的要求，由小时、分钟、日期和时间的偏移量组成，其中日期的格式为MM.DD.YY，MM是分钟，DD是日期，YY是指年份。偏移量的格式为时间＋偏移量，单位是minutes、hours和days。<br />
4.应用实例<br />
＃at －f data 15:30 +2 days<br />
上面命令表示让系统在两天后的17：30执行文件data中指明的作业。<br />
<span style="color: #0000ff;">lp</span><br />
1.作用<br />
lp是打印文件的命令，使用权限是所有用户。<br />
2.格式<br />
lp [－c][－d][－m][－number][－title][-p]<br />
3.主要参数<br />
－c：先拷贝文件再打印。<br />
－d：打印队列文件。<br />
－m：打印结束后发送电子邮件到用户。<br />
－number：打印份数。<br />
－title：打印标题。<br />
－p：设定打印的优先级别，最高为100。<br />
4.应用实例<br />
（1）使用lp命令打印多个文件<br />
＃lp 2 3 4<br />
request id is 11 (3 file(s))<br />
其中2、3、4分别是文件名；&#8220;request id is 11 (3 file(s)) &#8221;表示这是第11个打印命令，依次打印这三个文件。<br />
（2）设定打印优先级别<br />
＃lp lp -d LaserJet -p 90 /etc/aliases<br />
通过添加&#8220;-p 90&#8221;，规定了打印作业的优先级为90。它将在优先级低于90的打印作业之前打印，包括没有设置优先级的作业，缺省优先级是50<br />
<span style="color: #0000ff;">useradd</span><br />
1.作用<br />
useradd命令用来建立用户帐号和创建用户的起始目录，使用权限是超级用户。<br />
2.格式<br />
useradd [－d home] [－s shell] [－c comment] [－m [－k template]] [－f inactive] [－e expire ] [－p passwd] [－r] name<br />
3.主要参数<br />
－c：加上备注文字，备注文字保存在passwd的备注栏中。　<br />
－d：指定用户登入时的启始目录。<br />
－D：变更预设值。<br />
－e：指定账号的有效期限，缺省表示永久有效。<br />
－f：指定在密码过期后多少天即关闭该账号。<br />
－g：指定用户所属的群组。<br />
－G：指定用户所属的附加群组。<br />
－m：自动建立用户的登入目录。<br />
－M：不要自动建立用户的登入目录。<br />
－n：取消建立以用户名称为名的群组。<br />
－r：建立系统账号。<br />
－s：指定用户登入后所使用的shell。<br />
－u：指定用户ID号。<br />
4.说明<br />
useradd可用来建立用户账号，它和adduser命令是相同的。账号建好之后，再用passwd设定账号的密码。使用useradd命令所建立的账号，实际上是保存在/etc/passwd文本文件中。<br />
5.应用实例<br />
建立一个新用户账户，并设置ID：<br />
＃useradd caojh －u 544<br />
需要说明的是，设定ID值时尽量要大于500，以免冲突。因为Linux安装后会建立一些特殊用户，一般0到499之间的值留给bin、mail这样的系统账号。<br />
<span style="color: #0000ff;">groupadd</span><br />
1.作用<br />
groupadd命令用于将新组加入系统。<br />
2.格式<br />
groupadd [－g gid] [－o]] [－r] [－f] groupname<br />
3.主要参数<br />
－g gid：指定组ID号。<br />
－o：允许组ID号，不必惟一。<br />
－r：加入组ID号，低于499系统账号。<br />
－f：加入已经有的组时，发展程序退出。<br />
4.应用实例<br />
建立一个新组，并设置组ID加入系统：<br />
＃groupadd －g 344 cjh<br />
此时在/etc/passwd文件中产生一个组ID（GID）是344的项目。<br />
<span style="color: #0000ff;">kill</span><br />
1.作用<br />
kill命令用来中止一个进程。<br />
2.格式<br />
kill [ －s signal | －p ] [ －a ] pid ...<br />
kill －l [ signal ]<br />
3.参数<br />
－s：指定发送的信号。<br />
－p：模拟发送信号。<br />
－l：指定信号的名称列表。<br />
pid：要中止进程的ID号。<br />
Signal：表示信号。<br />
4.说明<br />
进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统，系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的，或者是内核如何管理分配时间片的，所关心的是如何去控制这些进程，让它们能够很好地为用户服务。<br />
Linux<br />
操作系统包括三种不同类型的进程，每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行，也可以在后台运行。<br />
批处理进程和终端没有联系，是一个进程序列。监控进程（也称系统守护进程）时Linux系统启动时启动的进程，并在后台运行。例如，httpd是著名的<br />
Apache服务器的监控进程。<br />
kill命令的工作原理是，向Linux系统的内核发送一个系统操作信号<br />
和某个程序的进程标识号，然后系统内核就可以对进程标识号指定的进程进行操作。比如在top命令中，我们看到系统运行许多进程，有时就需要使用kill中<br />
止某些进程来提高系统资源。在讲解安装和登陆命令时，曾提到系统多个虚拟控制台的作用是当一个程序出错造成系统死锁时，可以切换到其它虚拟控制台工作关闭<br />
这个程序。此时使用的命令就是kill，因为kill是大多数Shell内部命令可以直接调用的。<br />
5.应用实例<br />
（1）强行中止（经常使用杀掉）一个进程标识号为324的进程：<br />
＃kill －9 324<br />
（2）解除Linux系统的死锁<br />
在Linux<br />
中有时会发生这样一种情况：一个程序崩溃，并且处于死锁的状态。此时一般不用重新启动计算机，只需要中止(或者说是关闭)这个有问题的程序即可。当<br />
kill处于X-Window界面时，主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端，在那里中止有问题的程序。比如，如果<br />
Mozilla浏览器程序出现了锁死的情况，可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用top命令查处该程序的PID，然<br />
后使用kill命令停止这个程序：<br />
＃kill －SIGKILL XXX<br />
其中，XXX是包含有Mozolla浏览器的程序的进程标识号。<br />
（3）使用命令回收内存<br />
我们知道内存对于系统是非常重要的，回收内存可以提高系统资源。kill命令可以及时地中止一些&#8220;越轨&#8221;的程序或很长时间没有相应的程序。例如，使用top命令发现一个无用 (Zombie) 的进程，此时可以使用下面命令：<br />
＃kill －9 XXX<br />
其中，XXX是无用的进程标识号。<br />
然后使用下面命令：<br />
＃free<br />
此时会发现可用内存容量增加了。<br />
（4）killall命令<br />
Linux下还提供了一个killall命令，可以直接使用进程的名字而不是进程标识号，例如：<br />
＃ killall -HUP inetd<br />
<span style="color: #0000ff;">crontab</span><br />
1.作用<br />
使用crontab命令可以修改crontab配置文件，然后该配置由cron公用程序在适当的时间执行，该命令使用权限是所有用户。<br />
2.格式<br />
crontab [ －u user ] 文件<br />
crontab [ －u user ] { －l | －r | －e }<br />
3.主要参数<br />
－e：执行文字编辑器来设定时程表，内定的文字编辑器是vi。<br />
－r：删除目前的时程表。<br />
－l：列出目前的时程表。<br />
crontab<br />
文件的格式为&#8220;M H D m d<br />
cmd&#8221;。其中，M代表分钟（0～59），H代表小时（0～23），D代表天（1～31），m代表月（1～12），d代表一星期内的天（0～6，0为星期<br />
天）。cmd表示要运行的程序，它被送入sh执行，这个Shell只有USER、HOME、SHELL三个环境变量。<br />
4.说明<br />
和at命令相比，crontab命令适合完成固定周期的任务。<br />
5.应用实例<br />
设置一个定时、定期的系统提示：<br />
[cao @www cao]#crontab －e<br />
此时系统会打开一个vi编辑器。<br />
如果输入以下内容：35 17 * * 5 wall "Tomorrow is Saturday I will go CS"，然后存盘退出。这时在/var/spool/cron/目录下会生产一个cao的文件，内容如下：<br />
# DO NOT EDIT THIS FILE － edit the master and reinstall.<br />
# (/tmp/crontab.2707 installed on Thu Jan 1 22:01:51 2004)<br />
# (Cron version －－ $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)<br />
35 17 * * 5 wall "Tomorrow is Saturday I will play CS "<br />
这样每个星期五17：35系统就会弹出一个终端，提醒星期六可以打打CS了！显示结果见图3所示。<br />
图3 一个定时、定期的系统提示<br />
动手练习<br />
1.联合使用kill和top命令观察系统性能的变化<br />
首先启动一个终端运行top命令，然后再启动一个终端使用kill命令，见图4所示。<br />
图4 观察kill命令对top终端的影响<br />
这时利用上面介绍的kill命令来中止一些程序：<br />
＃kill SIGKILL XXX<br />
然后再看top命令终端的变化，包括内存容量、CPU使用率、系统负载等。注意，有些进程是不能中止的，不过学习Linux命令时可以试试，看看系统有什么反应。<br />
2.使用at和halt命令定时关机<br />
首先设定关机时间是17:35，输入下面代码：<br />
＃at 17:35<br />
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh<br />
at&gt;halt `-i －p<br />
at&gt; <br />
job 6 at 2004－01－01 17:35<br />
此<br />
时实际上就已经进入Linux系统的Shell，并且编写一个最简单程序：halt －i<br />
－p。上面Shell中的文本结束符号表示按&#8220;Ctrl＋D&#8221;组合键关闭命令，提交任务退出Shell。&#8220;Job 6 at 2004－01－01<br />
17:35&#8221;表示系统接受第6个at命令，在&#8220;2004－01－01 17:35&#8221;时执行命令：先把所有网络相关的装置停止，关闭系统后关闭电源。<br />
3.用crontab命令实现每天定时的病毒扫描<br />
前面已经介绍了一个简单的crontab命令操作，这里看一些更重要的操作。<br />
（1）建立一个文件，文件名称自己设定，假设为caoproject：<br />
＃crontab －e<br />
（2）文件内容如下：<br />
05 09 * * * antivir<br />
用vi编辑后存盘退出。antivir是一个查杀Linux病毒的软件，当然需要时先安装在系统中。<br />
（3）使用crontab命令添加到任务列表中：<br />
＃crontab caoproject<br />
这样系统内所有用户在每天的9点05分会自动进行病毒扫描。<br />
4.用kill使修改的配置文件马上生效<br />
Windows用户一般都知道，重要配置文件修改后往往都要重新启动计算机才能使修改生效。而Linux由于采用了模块化设计，可以自己根据需要实时设定服务。这里以网络服务inetd为例介绍一些操作技巧。<br />
inetd<br />
是一个监听守护进程，监听与提供互联网服务进程（如rlogin、telnet、ftp、rsh）进行连接的要求，并扩展所需的服务进程。默认情况下，<br />
inetd监听的这些daemon均列于/etc<br />
/inetd.conf文件中。编辑/etc/inetd.conf文件，可以改变inetd启动服务器守护进程的选项，然后驱使inetd以<br />
SIGHUP（signal 1）向当前的inetd进程发送信号，使inetd重读该文件。这一过程由kill命令来实现。<br />
用vi或其它编辑器修改inetd.conf后，首先使用下面命令：<br />
＃ps -ef |grep inetd<br />
上面代码表明查询inetd.conf的进程号(PID)，这里假设是1426，然后使用下面命令：<br />
＃ kill -1426 inetd<br />
这样配置文件就生效了。<br />
这一讲介绍的系统管理命令都是比较重要的，特别是crontab命令和quota命令使用起来会有一定难度，需要多做一些练习。另外，使用kill命令要注意&#8220;－9&#8220;这个参数，练习时最好不要运行一些重要的程序。 <br />
<span style="color: #00f000;"><strong>Linux必学的60个命令(4)-网络操作命令</strong></span>Linux必学的60个命令：网络操作命令<br />
因<br />
为Linux系统是在Internet上起源和发展的，它与生俱来拥有强大的网络功能和丰富的网络应用软件，尤其是TCP/IP网络协议的实现尤为成熟。<br />
Linux的网络命令比较多，其中一些命令像ping、<br />
ftp、telnet、route、netstat等在其它操作系统上也能看到，但也有一些Unix/Linux系统独有的命令，如ifconfig、<br />
finger、mail等。Linux网络操作命令的一个特点是，命令参数选项和功能很多，一个命令往往还可以实现其它命令的功能。<br />
<span style="color: #0000ff;">ifconfig</span><br />
1.作用<br />
ifconfig用于查看和更改网络接口的地址和参数，包括IP地址、网络掩码、广播地址，使用权限是超级用户。<br />
2.格式<br />
ifconfig -interface [options] address<br />
3.主要参数<br />
-interface：指定的网络接口名，如eth0和eth1。<br />
up：激活指定的网络接口卡。<br />
down：关闭指定的网络接口。<br />
broadcast address：设置接口的广播地址。<br />
pointopoint：启用点对点方式。<br />
address：设置指定接口设备的IP地址。<br />
netmask address：设置接口的子网掩码。<br />
4.应用说明<br />
ifconfig是用来设置和配置网卡的命令行工具。为了手工配置网络，这是一个必须掌握的命令。使用该命令的好处是无须重新启动机器。要赋给eth0接口IP地址207.164.186.2，并且马上激活它，使用下面命令：<br />
#fconfig eth0 210.34.6.89 netmask 255.255.255.128 broadcast 210.34.6.127<br />
该<br />
命令的作用是设置网卡eth0的IP地址、网络掩码和网络的本地广播地址。若运行不带任何参数的ifconfig命令，这个命令将显示机器所有激活接口的<br />
信息。带有&#8220;-a&#8221;参数的命令则显示所有接口的信息，包括没有激活的接口。注意，用ifconfig命令配置的网络设备参数，机器重新启动以后将会丢失。<br />
如果要暂停某个网络接口的工作，可以使用down参数：<br />
#ifconfig eth0 down<br />
<span style="color: #0000ff;">ip</span><br />
1.作用<br />
ip是iproute2软件包里面的一个强大的网络配置工具，它能够替代一些传统的网络管理工具，例如ifconfig、route等，使用权限为超级用户。几乎所有的Linux发行版本都支持该命令。<br />
2.格式<br />
ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]<br />
3.主要参数<br />
OPTIONS是修改ip行为或改变其输出的选项。所有的选项都是以-字符开头，分为长、短两种形式。目前，ip支持如表1所示选项。<br />
OBJECT是要管理者获取信息的对象。目前ip认识的对象见表2所示。<br />
表1 ip支持的选项<br />
-V,-Version 打印ip的版本并退出。<br />
-s,-stats,-statistics 输出更为详尽的信息。如果这个选项出现两次或多次，则输出的信息将更为详尽。<br />
-f,-family 这个选项后面接协议种类，包括inet、inet6或link，强调使用的协议种类。如果没有足够的信息告诉ip使用的协议种类，ip就会使用默认值inet或any。link比较特殊，它表示不涉及任何网络协议。<br />
-4 是-family inet的简写。<br />
-6 是-family inet6的简写。<br />
-0 是-family link的简写。<br />
-o,-oneline 对每行记录都使用单行输出，回行用字符代替。如果需要使用wc、grep等工具处理ip的输出，则会用到这个选项。<br />
-r,-resolve 查询域名解析系统，用获得的主机名代替主机IP地址<br />
COMMAND<br />
设置针对指定对象执行的操作，它和对象的类型有关。一般情况下，ip支持对象的增加(add)、删除(delete)和展示(show或list)。有些<br />
对象不支持这些操作，或者有其它的一些命令。对于所有的对象，用户可以使用help命令获得帮助。这个命令会列出这个对象支持的命令和参数的语法。如果没<br />
有指定对象的操作命令，ip会使用默认的命令。一般情况下，默认命令是list，如果对象不能列出，就会执行help命令。<br />
ARGUMENTS<br />
是命令的一些参数，它们倚赖于对象和命令。ip支持两种类型的参数：flag和parameter。flag由一个关键词组成；parameter由一个<br />
关键词加一个数值组成。为了方便，每个命令都有一个可以忽略的默认参数。例如，参数dev是ip link命令的默认参数，因此ip link ls<br />
eth0等于ip link ls dev eth0。我们将在后面的详细介绍每个命令的使用，命令的默认参数将使用default标出。<br />
4.应用实例<br />
添加IP地址192.168.2.2/24到eth0网卡上：<br />
#ip addr add 192.168.1.1/24 dev eth0<br />
丢弃源地址属于192.168.2.0/24网络的所有数据报：<br />
#ip rule ad</em>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/237035.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> 2008-10-28 10:50 <a href="http://www.blogjava.net/mlxlzc/articles/237035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux常用命令汇集</title><link>http://www.blogjava.net/mlxlzc/articles/200821.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:55:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200821.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200821.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200821.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200821.html</trackback:ping><description><![CDATA[<p>ssh中文乱码解决</p><p><div>编辑 vi /etc/sysconfig/i18n <br />最后面加上一行LANG="zh_CN.GB18030"<br />保存后，从新用SSH登陆就可以解决乱码问题。</div><br /></p><p><br /></p><p>统计文件夹下文件个数</p>
<p>ls | wc -l</p>
<p>删除目录&nbsp; <br />
</p>
<p>&nbsp;&nbsp;&nbsp; rm -rf /opt/tomcat5028   删除目录</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>修改日期<br />
</p>
<p>&nbsp;&nbsp;&nbsp; 讲一下Linux 或Unix下怎样修改系统时间 </p>
<p>我们一般使用&#8220;date -s&#8221;命令来修改系统时间。比如将系统时间设定成1996年6月10日的命令如下。 <br />
#date -s 06/10/96 <br />
将系统时间设定成下午1点12分0秒的命令如下。<br />
#date -s 13:12:00 </p>
<p>---- 注意，这里说的是系统时间，是linux由操作系统维护的。 <br />
----
在系统启动时，Linux操作系统将时间从CMOS中读到系统时间变量中，以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性，
Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间（大约是11分钟）进行的，在我们执行date
-s后，如果马上重起机器，修改时间就有可能没有被写入CMOS,这就是问题的原因。如果要确保修改生效可以执行如下命令。 </p>
<p>---- #clock -w </p>
<br />
<p>     </p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－ </p>
<p>添加ftp用户</p>
<p>&nbsp;&nbsp;&nbsp; //添加sfupload/123abc<br />
&nbsp;&nbsp;&nbsp; useradd -G ftp -d /home/sfupload &#8211;M sfupload<br />
&nbsp;&nbsp;&nbsp; mkdir /home/sfupload<br />
&nbsp;&nbsp;&nbsp; chown sfupload.sfupload /home/sfupload<br />
&nbsp;&nbsp;&nbsp; chmod 777 /home/sfupload  //7表示wrx 5表示rx 0表示什么权限都没有<br />
&nbsp;&nbsp;&nbsp; passwd sfupload<br />
&nbsp;&nbsp;&nbsp; #123abc<br />
&nbsp;&nbsp;&nbsp; #123abc</p>
<p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p>
<p>oracle 启动<br />
</p>
<p>&nbsp;&nbsp;&nbsp; svrmgrl</p>
<p>&nbsp;&nbsp;&nbsp; connect internal</p>
<p>&nbsp;&nbsp;&nbsp; shutdown abort</p>
<p>&nbsp;&nbsp;&nbsp; startup</p>
<p>&nbsp;&nbsp;&nbsp; lsnrctl stop</p>
<p>&nbsp;&nbsp;&nbsp; lsnrctl start&nbsp;</p>
<p>－－－－－－－－－－－－－－－－－－</p>
<p>9版本</p>
<p>sqlplus /nolog<br />
<br />
connect / as sysdba;<br />
<br />
</p>
<p>－－－－－－－－－－－－－－－－－<br />
</p>
<p>linux目录下文件总数</p>
<p>&nbsp;ls -l | grep "^-" | wc -l<br />
<br />
</p><img src ="http://www.blogjava.net/mlxlzc/aggbug/200821.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> 2008-05-16 10:55 <a href="http://www.blogjava.net/mlxlzc/articles/200821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux操作系统定时任务系统Cron介绍</title><link>http://www.blogjava.net/mlxlzc/articles/200818.html</link><dc:creator>goto</dc:creator><author>goto</author><pubDate>Fri, 16 May 2008 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/mlxlzc/articles/200818.html</guid><wfw:comment>http://www.blogjava.net/mlxlzc/comments/200818.html</wfw:comment><comments>http://www.blogjava.net/mlxlzc/articles/200818.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlxlzc/comments/commentRss/200818.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlxlzc/services/trackbacks/200818.html</trackback:ping><description><![CDATA[cron是一个linux下的定时执行工具，可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务，但它不自动起来，可以用以下的方法启动、关闭这个服务:
<p>　　/sbin/service crond start //启动服务</p>
<p>　　/sbin/service crond stop //关闭服务</p>
<p>　　/sbin/service crond restart //重启服务</p>
<p>　　/sbin/service crond reload //重新载入配置</p>
<p>　　你也可以将这个服务在系统启动的时候自动启动:</p>
<p>　　在/etc/rc.d/rc.local这个脚本的末尾加上:</p>
<p>　　/sbin/service crond start</p>
<p>　　现在Cron这个服务已经在进程里面了，我们就可以用这个服务了，Cron服务提供以下几种接口供大家使用:</p>
<p>　　1.直接用crontab命令编辑</p>
<p>　　cron服务提供crontab命令来设定cron服务的，以下是这个命令的一些参数与说明:</p>
<p>　　crontab -u //设定某个用户的cron服务，一般root用户在执行这个命令的时候需要此参数</p>
<p>　　crontab -l //列出某个用户cron服务的详细内容</p>
<p>　　crontab -r //删除没个用户的cron服务</p>
<p>　　crontab -e //编辑某个用户的cron服务</p>
<p>　　比如说root查看自己的cron设置:crontab -u root -l</p>
<p>　　再例如，root想删除fred的cron设置:crontab -u fred -r</p>
<p>　　在编辑cron服务时，编辑的内容有一些格式和约定，输入:crontab -u root -e</p>
<p>　　进入vi编辑模式，编辑的内容一定要符合下面的格式:*/1 * * * * ls &gt;&gt; /tmp/ls.txt</p>
<p>
这个格式的前一部分是对时间的设定，后面一部分是要执行的命令，如果要执行的命令太多，可以把这些命令写到一个脚本里面，然后在这里直接调用这个脚本就
可以了，调用的时候记得写出命令的完整路径。时间的设定我们有一定的约定，前面五个*号代表五个数字，数字的取值范围和含义如下:</p>
<p>　　分钟　(0-59)</p>
<p>　　小時　(0-23)</p>
<p>　　日期　(1-31)</p>
<p>　　月份　(1-12)</p>
<p>　　星期　(0-6)//0代表星期天</p>
<p>　　除了数字还有几个个特殊的符号就是"*"、"/"和"-"、","，*代表所有的取值范围内的数字，"/"代表每的意思,"*/5"表示每5个单位，"-"代表从某个数字到某个数字,","分开几个离散的数字。以下举几个例子说明问题:</p>
<p>　　每天早上6点</p>
<p>　　0 6 * * * echo "Good morning." &gt;&gt; /tmp/test.txt //注意单纯echo，从屏幕上看不到任何输出，因为cron把任何输出都email到root的信箱了。</p>
<p>　　每两个小时</p>
<p>　　0 */2 * * * echo "Have a break now." &gt;&gt; /tmp/test.txt</p>
<p>　　晚上11点到早上8点之间每两个小时，早上八点</p>
<p>　　0 23-7/2，8 * * * echo "Have a good dream:)" &gt;&gt; /tmp/test.txt</p>
<p>　　每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点</p>
<p>　　0 11 4 * 1-3 command line</p>
<p>　　1月1日早上4点</p>
<p>　　0 4 1 1 * command line</p>
<p>
每次编辑完某个用户的cron设置后，cron自动在/var/spool/cron下生成一个与此用户同名的文件，此用户的cron信息都记录在这个
文件中，这个文件是不可以直接编辑的，只可以用crontab -e
来编辑。cron启动后每过一份钟读一次这个文件，检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。</p>
<p>　　2.编辑/etc/crontab 文件配置cron</p>
<p>
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件，还需要读一次/etc/crontab,因此我们配置这个文件也能运用
cron服务做一些事情。用crontab配置是针对某个用户的，而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:</p>
<p>　　SHELL=/bin/bash</p>
<p>　　PATH=/sbin:/bin:/usr/sbin:/usr/bin</p>
<p>　　MAILTO=root //如果出现错误，或者有数据输出，数据作为邮件发给这个帐号</p>
<p>　　HOME=/ //使用者运行的路径,这里是根目录</p>
<p>　　# run-parts</p>
<p>　　01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本</p>
<p>　　02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本</p>
<p>　　22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本</p>
<p>　　42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本</p>
<p>　　大家注意"run-parts"这个参数了，如果去掉这个参数的话，后面就可以写要运行的某个脚本名，而不是文件夹名了。</p>
<img src ="http://www.blogjava.net/mlxlzc/aggbug/200818.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> 2008-05-16 10:52 <a href="http://www.blogjava.net/mlxlzc/articles/200818.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>