﻿<?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>C++博客-小默-随笔分类-Linux</title><link>http://www.cppblog.com/momoxiao/category/13037.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 15 Jun 2011 12:18:08 GMT</lastBuildDate><pubDate>Wed, 15 Jun 2011 12:18:08 GMT</pubDate><ttl>60</ttl><item><title>thread 多线程</title><link>http://www.cppblog.com/momoxiao/archive/2011/06/14/148668.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 14 Jun 2011 12:27:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/06/14/148668.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/148668.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/06/14/148668.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/148668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/148668.html</trackback:ping><description><![CDATA[<div>多线程<br /><br />编写多线程程序时,在设计上要特别小心.<br />对共享变量,多个执行路径,要引起足够重视.</div><br />创建多线程:<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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;多线程<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">#define</span><span style="color: #000000; ">&nbsp;NUM_THREADS&nbsp;6</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_function(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;res;<br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;a_thread[NUM_THREADS];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_result;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;lots_of_threads;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(lots_of_threads&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;lots_of_threads&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;NUM_THREADS;&nbsp;lots_of_threads</span><span style="color: #000000; ">++</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">before&nbsp;pthread_create,&nbsp;lots_of_threads=%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,lots_of_threads);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_create(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">(a_thread[lots_of_threads]),NULL,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread_function,&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">lots_of_threads);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;creation&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Waiting&nbsp;for&nbsp;threads&nbsp;to&nbsp;finish<img src="http://www.cppblog.com/Images/dot.gif" alt="" />\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(lots_of_threads&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;NUM_THREADS&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;lots_of_threads&nbsp;</span><span style="color: #000000; ">&gt;=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;lots_of_threads</span><span style="color: #000000; ">--</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_join(a_thread[lots_of_threads],&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread_result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Picked&nbsp;up&nbsp;a&nbsp;thread\n</span><span style="color: #000000; ">"</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; ">else</span><span style="color: #000000; ">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">pthread_join&nbsp;failed\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">All&nbsp;done\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_function(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;my_number&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;rand_num;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">thread_funcion&nbsp;is&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;my_number);<br />&nbsp;&nbsp;&nbsp;&nbsp;rand_num&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">+</span><span style="color: #000000; ">(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">)(</span><span style="color: #000000; ">9.0</span><span style="color: #000000; ">*</span><span style="color: #000000; ">rand()</span><span style="color: #000000; ">/</span><span style="color: #000000; ">(RAND_MAX</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1.0</span><span style="color: #000000; ">));<br />&nbsp;&nbsp;&nbsp;&nbsp;sleep(rand_num);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Bye&nbsp;from&nbsp;%d\n</span><span style="color: #000000; ">"</span><span style="color: #000000;">,&nbsp;my_number);<br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_exit(NULL);<br />}</span></div><br />执行结果:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">[green@colorfulgreen&nbsp;ch11]$&nbsp;gcc&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">D_REENTRANT&nbsp;thread8.c&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;thread8&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lpthread<br />[green@colorfulgreen&nbsp;ch11]$&nbsp;.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread8&nbsp;&nbsp;&nbsp;&nbsp;<br />before&nbsp;pthread_create,&nbsp;lots_of_threads</span><span style="color: #000000; ">=</span><span style="color: #000000; ">0</span><span style="color: #000000; "><br />before&nbsp;pthread_create,&nbsp;lots_of_threads</span><span style="color: #000000; ">=</span><span style="color: #000000; ">1</span><span style="color: #000000; "><br />before&nbsp;pthread_create,&nbsp;lots_of_threads</span><span style="color: #000000; ">=</span><span style="color: #000000; ">2</span><span style="color: #000000; "><br />before&nbsp;pthread_create,&nbsp;lots_of_threads</span><span style="color: #000000; ">=</span><span style="color: #000000; ">3</span><span style="color: #000000; "><br />before&nbsp;pthread_create,&nbsp;lots_of_threads</span><span style="color: #000000; ">=</span><span style="color: #000000; ">4</span><span style="color: #000000; "><br />before&nbsp;pthread_create,&nbsp;lots_of_threads</span><span style="color: #000000; ">=</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Waiting&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;threads&nbsp;to&nbsp;finish<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br />thread_funcion&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />thread_funcion&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />thread_funcion&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />thread_funcion&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />thread_funcion&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />thread_funcion&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Bye&nbsp;from&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Bye&nbsp;from&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Picked&nbsp;up&nbsp;a&nbsp;thread<br />:&nbsp;Success<br />Bye&nbsp;from&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Picked&nbsp;up&nbsp;a&nbsp;thread<br />:&nbsp;Success<br />Bye&nbsp;from&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Picked&nbsp;up&nbsp;a&nbsp;thread<br />:&nbsp;Success<br />Bye&nbsp;from&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000; "><br />Picked&nbsp;up&nbsp;a&nbsp;thread<br />:&nbsp;Success<br />Bye&nbsp;from&nbsp;</span><span style="color: #000000; ">5</span><span style="color: #000000;"><br />Picked&nbsp;up&nbsp;a&nbsp;thread<br />:&nbsp;Success<br />Picked&nbsp;up&nbsp;a&nbsp;thread<br />:&nbsp;Success<br />All&nbsp;done</span></div><br />从执行结果里,很显然看到有bug,5个线程的argument全是5.<br />因为新线程的参数,是使用地址引用传递的:<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_create(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000;">(a_thread[lots_of_threads]),NULL,<br /></span><span style="color: red;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000;">&nbsp;&nbsp;</span><span>thread_function,</span><span style="color: #ff0000;">&nbsp;(</span><span style="color: #ff0000;">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #ff0000;">*</span><span style="color: #ff0000;">)</span><span style="color: #ff0000;">&amp;</span><span style="color: #ff0000;">lots_of_threads</span><span style="color: #000000;">);</span></div>主线程创建线程循环,很快执行完. 引用地址中的值,在子线程执行前,已经被改成了5.<br />线程参数改成值传递就好了.<br /><br />--<br />FROM:Linux程序设计<img src ="http://www.cppblog.com/momoxiao/aggbug/148668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-06-14 20:27 <a href="http://www.cppblog.com/momoxiao/archive/2011/06/14/148668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>thread 取消线程</title><link>http://www.cppblog.com/momoxiao/archive/2011/06/14/148666.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 14 Jun 2011 11:45:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/06/14/148666.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/148666.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/06/14/148666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/148666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/148666.html</trackback:ping><description><![CDATA[<div>取消一个线程<br /><br />可以请求一个线程终止,像给它发送一个信号一样.<br /><br />1 请求端:<br /><br />#include &lt;pthread.h&gt;<br />int pthread_cancel(pthread_t thread);<br />请求取消指定线程.<br /><br />2 接收请求端:<br /><br />#include &lt;pthread.h&gt;<br />int pthread_setcancelstate(int state, int *oldstate);<br />state: 线程是否接收取消请求.<br />| PTHREAD_CANCEL_ENABLE 允许线程接收取消请求<br />| PTHREAD_CANCEL_DISABLE 忽略取消请求<br />oldstate: 获取先前的取消状态,不关心先前状态传NULL.<br /><br />#include &lt;pthread.h&gt;<br />int pthread_setcanceltype(int type, int *oldtype);<br />type: 如果接收到取消请求,什么时候采取行动.<br />| PTHREAD_CANCEL_ASYNCHRONOUS 接收到取消请求后立即采取行动.<br />| PTHREAD_CANCEL_DEFERRED 接收到取消请求后,等待请求端线程执行以下函数之一,再采取行动.<br />|&nbsp;&nbsp;&nbsp; (pthread_join,pthread_cond_wait, pthread_cond_timedwait, pthread_testcancel, sem_wait, sigwait)<br />oldtype: 获取先前的取消状态,不关心先前状态传NULL.</div><br />取消一个线程:<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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;取消一个线程<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_function(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg);<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;res;<br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;a_thread;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_result;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_create(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a_thread,&nbsp;NULL,&nbsp;thread_function,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;creation&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000; ">3</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Canceling&nbsp;thread<img src="http://www.cppblog.com/Images/dot.gif" alt="" />\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_cancel(a_thread);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;cancelation&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Waiting&nbsp;for&nbsp;thread&nbsp;to&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif" alt="" />\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_join(a_thread,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread_result);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;join&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_function(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i,res;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;pthread_setcancelstate&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,&nbsp;NULL);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;pthread_setcanceltype&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">thread_function&nbsp;is&nbsp;running\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">(i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;is&nbsp;still&nbsp;running&nbsp;(%d)<img src="http://www.cppblog.com/Images/dot.gif" alt="" />\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_exit(</span><span style="color: #000000; ">0</span><span style="color: #000000;">);<br />}</span></div><br />运行结果:<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; ">$&nbsp;gcc&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">D_REENTRANT&nbsp;thread7.c&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;thread7&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lpthread<br />$&nbsp;.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread7<br />thread_function&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running<br />Thread&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;still&nbsp;running&nbsp;(</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br />Thread&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;still&nbsp;running&nbsp;(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br />Thread&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;still&nbsp;running&nbsp;(</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br />Canceling&nbsp;thread<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br />Waiting&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;thread&nbsp;to&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span></div><br />--<br />FROM:Linux程序设计<img src ="http://www.cppblog.com/momoxiao/aggbug/148666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-06-14 19:45 <a href="http://www.cppblog.com/momoxiao/archive/2011/06/14/148666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>thread 线程属性 脱离线程</title><link>http://www.cppblog.com/momoxiao/archive/2011/06/14/148663.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 14 Jun 2011 10:56:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/06/14/148663.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/148663.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/06/14/148663.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/148663.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/148663.html</trackback:ping><description><![CDATA[<div>线程的属性<br /><br />脱离线程:不向主线程返回信息,不需要主线程等待.<br />通过两种方法创建:<br />调用pthread_detach;<br />修改线程的属性. &lt;- 这里使用<br /><br />#include &lt;pthread.h&gt;<br />int pthread_attr_init(pthread_attr_t *attr);<br />初始化一个线程属性对象.<br />pthread_destroy<br />回收一个线程属性对象.<br /><br />#include &lt;pthread.h&gt;<br />int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);<br />int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);<br />这个属性允许我们无需对线程进行合并:<br />| PTHREAD_CREATE_JOINABLE 默认.<br />| PTHREAD_CREATE_DETACHED 不能调用pthread_join来获得另一个线程的退出状态.<br /><br />int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);<br />int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);<br />控制线程的调度方式:<br />| SCHED_OTHER 默认<br />| SCHED_RP&nbsp;&nbsp; 循环(round_robin) &lt;- 下面2个调度方式具备实时调度功能,需要root权限.<br />| SCHED_FIFO 先进先出<br /><br />int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);<br />int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);<br />和schedpolicy配合使用,控制SCHED_OTHER线程的调度策略.<br /><br />int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);<br />int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);<br />| PTHREAD_EXPLICIT_SCHED 调度由属性明确设置.<br />| PTHREAD_INHERIT_SCHED&nbsp; 新线程沿用创建者的属性.<br /><br />int pthread_attr_setscope(pthread_attr_t *attr, int scope);<br />int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);<br />控制一个线程调度的计算方式,目前Linux只支持PTHREAD_SCOPE_SYSTEM.<br /><br />int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);<br />int pthread_attr_getstacksize(const pthread_attr_t *attr, int *scope);<br />控制线程创建的栈大小,单位字节.可选.<br />Linux在实现线程时,默认的栈很大,这个属性有点多余.</div><br />创建脱离线程:<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: #008000; ">/*</span><span style="color: #008000; "><br />&nbsp;*&nbsp;线程属性-创建脱离线程<br />&nbsp;*&nbsp;主线程不等待子线程结束,只通过thread_finished标志来检测子线程是否已结束,并显示线程之间仍然共享的变量.<br />&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdio.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">unistd.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">stdlib.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />#include&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">pthread.h</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_function(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg);<br /><br /></span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;g_message[]&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Hello&nbsp;World!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;g_thread_finished&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /><br /></span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;main(){<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;res;<br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_t&nbsp;a_thread;<br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_attr_t&nbsp;thread_attr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_attr_init(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread_attr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Attribute&nbsp;creation&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_attr_setdetachstate(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread_attr,&nbsp;PTHREAD_CREATE_DETACHED);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Setting&nbsp;detached&nbsp;attribute&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;res&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;pthread_create(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">a_thread,&nbsp;</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread_attr,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread_function,&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)g_message);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(res&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Thread&nbsp;creation&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_FAILURE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">)pthread_attr_destroy(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">thread_attr);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">g_thread_finished){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Waiting&nbsp;for&nbsp;thread&nbsp;to&nbsp;say&nbsp;it's&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif" alt="" />\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Other&nbsp;thread&nbsp;finished,&nbsp;bye!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;exit(EXIT_SUCCESS);<br />}<br /><br /></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">thread_function(</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">arg){<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">thread_function&nbsp;is&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;%s\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;(</span><span style="color: #0000FF; ">char</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">)arg);<br />&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Second&nbsp;thread&nbsp;setting&nbsp;finished&nbsp;flag,&nbsp;and&nbsp;exit&nbsp;now\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;g_thread_finished&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;pthread_exit(NULL);<br />}</span></div><br />执行结果:<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; ">$&nbsp;gcc&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">D_REENTRANT&nbsp;thread5.c&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">o&nbsp;thread5&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">lpthread&nbsp;&nbsp;<br />$&nbsp;.</span><span style="color: #000000; ">/</span><span style="color: #000000; ">thread5&nbsp;<br />Waiting&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;thread&nbsp;to&nbsp;say&nbsp;it</span><span style="color: #000000; ">'</span><span style="color: #000000; ">s&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #000000; "><br /></span><span style="color: #000000; ">thread_function&nbsp;</span><span style="color: #0000FF; ">is</span><span style="color: #000000; ">&nbsp;running.&nbsp;Argument&nbsp;was&nbsp;Hello&nbsp;World</span><span style="color: #000000; ">!</span><span style="color: #000000; "><br />Waiting&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;thread&nbsp;to&nbsp;say&nbsp;it</span><span style="color: #000000; ">'</span><span style="color: #000000; ">s&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #000000; "><br /></span><span style="color: #000000; ">Waiting&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;thread&nbsp;to&nbsp;say&nbsp;it</span><span style="color: #000000; ">'</span><span style="color: #000000; ">s&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #000000; "><br /></span><span style="color: #000000; ">Waiting&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;thread&nbsp;to&nbsp;say&nbsp;it</span><span style="color: #000000; ">'</span><span style="color: #000000; ">s&nbsp;finished<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #000000; "><br /></span><span style="color: #000000; ">Second&nbsp;thread&nbsp;setting&nbsp;finished&nbsp;flag,&nbsp;and&nbsp;exit&nbsp;now<br />Other&nbsp;thread&nbsp;finished,&nbsp;bye</span><span style="color: #000000; ">!</span></div><br />--<br />FROM: Linux程序设计<img src ="http://www.cppblog.com/momoxiao/aggbug/148663.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-06-14 18:56 <a href="http://www.cppblog.com/momoxiao/archive/2011/06/14/148663.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struct sk_buff</title><link>http://www.cppblog.com/momoxiao/archive/2011/03/24/142666.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Thu, 24 Mar 2011 10:07:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/03/24/142666.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/142666.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/03/24/142666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/142666.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/142666.html</trackback:ping><description><![CDATA[<div>/home/green/src/list.c</div><div>alloc_skb</div><div>kfree_skb</div><div>skb_put</div><div>skb_trim</div><div><br></div><div><br></div><div>#############</div><div>/home/green/src/list.c</div><div>#############</div><div>alloc_skb</div><div>kfree_skb</div><div>skb_put &nbsp;// used data后部扩展</div><div>skb_push // used data前部扩展</div><div>skb_pull // used data前部截断</div><div>skb_trim // used data后部截断</div><div>skb_reserve // data+分片后移,只允许对空缓存使用</div><div><br></div><div>skb_queue_head_init &nbsp;// 初始化struct sk_buff_head</div><div>skb_queue_head &nbsp;// list头部添加一个packet</div><div>skb_queue_tail &nbsp;// list尾部添加一个packet</div><div>skb_dequeue &nbsp; &nbsp; &nbsp;// 移去list头部第一个packet(返回移除的packet指针,内存没有收回?)</div><div>skb_dequeue_tail // 移去list尾部第一个packet &nbsp;</div><div>skb_queue_purge &nbsp;// 清空list中的节点</div><div>skb_append &nbsp; &nbsp; &nbsp;// 在list的给定packet后append一个packet</div><div>skb_insert &nbsp; &nbsp; &nbsp;// 在list的给定packet前insert一个packet</div><div><br></div><div><br></div><div><br></div><div>#############</div><div>alloc_skb</div><div>#############</div><div>&lt;linux-2.6.36/net/core/skbuff.c&gt;</div><div><br></div><div>__alloc_skb()分析:</div><div><br></div><div>申请struct skb_buff skb空间, 必须从CACHE中申请(skbuff_fclone_cache或skbuff_head_cache).</div><div>申请数据区内存, 使用kmalloc. 数据区包括字节对齐后的size和struct skb_shared_info.</div><div>填充skb结构.</div><div>填充分片信息struct skb_shared_info shinfo.</div><div>如果头部skb_buff是从skbuff_fclone_cache中申请的,do something... //TODO</div><div><br></div><div>********</div><div><br></div><div>__alloc_skb()完成时,内存状态:</div><div><br></div><div>skb &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; struct sk_buff &nbsp; &nbsp; &lt;-| skb-&gt;truesize</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-------------- &nbsp; &nbsp; &nbsp; |</div><div>data &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; |</div><div>skb-&gt;data &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</div><div>skb-&gt;head &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;|</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;------------- &nbsp; &nbsp; &nbsp;&lt;-|</div><div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;struct skb_shared_info</div><div><br></div><div>tail 和 end是偏移量</div><div>skb-&gt;tail = skb-&gt;data - skb-&gt;head = 0</div><div>skb-&gt;end = skb-&gt;tail + skb-&gt;size</div><div><br></div><div>********</div><div><br></div><div>head,data是指针，tail,end是偏移量。</div><div><br></div><div>&lt;linux-2.6.36/include/linux/skbuff.h&gt;</div><div>#ifdef NET_SKBUFF_DATA_USES_OFFSET</div><div>typedef unsigned int sk_buff_data_t;</div><div>#else</div><div>typedef unsigned char *sk_buff_data_t;</div><div>#endif</div><div><br></div><div>struct sk_buff {</div><div>&nbsp;&nbsp; &nbsp;/* These elements must be at the end, see alloc_skb() for details. &nbsp;*/</div><div>&nbsp;&nbsp; &nbsp;sk_buff_data_t &nbsp; &nbsp; &nbsp;tail;</div><div>&nbsp;&nbsp; &nbsp;sk_buff_data_t &nbsp; &nbsp; &nbsp;end;</div><div>&nbsp;&nbsp; &nbsp;unsigned char &nbsp; &nbsp; &nbsp; *head,</div><div>&nbsp;&nbsp; &nbsp;*data;</div><div><br></div><div>&nbsp;&nbsp; &nbsp;unsigned int &nbsp; &nbsp; &nbsp; &nbsp;truesize;</div><div>&nbsp;&nbsp; &nbsp;atomic_t &nbsp; &nbsp; &nbsp; &nbsp;users;</div><div>};</div><div><br></div><div>*********</div><div>skb,shinfo的引用计数都是原子类型atomic_t.</div><div>volatile只读内存,不读寄存器.&nbsp;</div><div><br></div><div><br></div><div>#############</div><div>kfree_skb</div><div>#############</div><div>内存屏障</div><div><br></div><div>软件可通过读写屏障强制内存访问次序.所有在设置读写屏障之前发起的内存访问,必须先于在设置屏障之后发起的内存访问之前完成,确保内存访问按程序的顺序完成.</div><div><br></div><div>smp_mb() &nbsp; &nbsp;适用于多处理器的内存屏障。</div><div>smp_rmb() &nbsp; 适用于多处理器的读内存屏障。</div><div><br></div><div>http://blogold.chinaunix.net/u3/93713/showart_2061476.html</div><div><br></div><div><br></div><div>#############</div><div>skb_put</div><div>#############</div><div>BUG() BUGON()</div><div><br></div><div>BUG()和BUG_ON()被用来提供断言,当被调用时会引发oops,导致栈的回溯和错误信息的打印.</div><div>大部分体系结构把BUG()定义成某种非法操作.</div><div>断言某种情况不该发生:</div><div>if(bad_thing):</div><div>&nbsp;&nbsp; &nbsp;BUG();</div><div>或者更好的形式:</div><div>BUG_ON(bad_thing);</div><div><br></div><div>******</div><div>frag_list</div><div><br></div><div>如果传输层将数据包分片了,就会把这些数据包放到skb的frag_list链表中.</div><div><br></div><div>******</div><div>skb_put 在尾部扩展used data area.常被用于给数据块添加协议尾部.</div><div>其实就修改了tail偏移量和len值,别的什么都没做.</div><div>设了俩断言:</div><div>数据包不能有分片;</div><div>扩展数据区不能超出skb-&gt;end.</div><div><br></div><div><br></div><div>#############</div><div>skb_trim</div><div>#############</div><div>struct sk_buff</div><div><br></div><div>truesize = skb + data</div><div>len = data + 分片</div><div>data+len = 分片</div><div><br></div><img src ="http://www.cppblog.com/momoxiao/aggbug/142666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-03-24 18:07 <a href="http://www.cppblog.com/momoxiao/archive/2011/03/24/142666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】Fedora Linux中的日志服务</title><link>http://www.cppblog.com/momoxiao/archive/2011/03/02/141009.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Wed, 02 Mar 2011 13:23:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/03/02/141009.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/141009.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/03/02/141009.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/141009.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/141009.html</trackback:ping><description><![CDATA[原文：<a href="http://blog.csdn.net/flagonxia/archive/2009/08/09/4427756.aspx"><u><font color=#0000ff>http://blog.csdn.net/flagonxia/archive/2009/08/09/4427756.aspx</font></u></a><br><br>---<br><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium 微软雅黑; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 14px; LINE-HEIGHT: 21px; FONT-FAMILY: verdana, sans-serif; TEXT-ALIGN: left">
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><strong><span style="FONT-SIZE: small; LINE-HEIGHT: 19px">&lt;序言&gt;</span></strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">我已经写过两篇实用型的博文，可以作为参考：</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">1） 如何将Linux主机设置成syslog服务器；</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">2） 使用cron和logrotate来管理日志文件。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; 这篇文章主要介绍日志服务的基础知识。涉及日志的服务有两个，在Fedora9中是rsyslog服务和logrotate服务。前者负责写入日志，后者负责备份和删除旧日志，以及更新日志文件。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong><span style="FONT-SIZE: small; LINE-HEIGHT: 19px">1. rsyslogd 服务</span></strong></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">1.1 查看当前rsyslogd服务的状态</span></strong></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong></strong></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Fedora 9开始，负责写入日志信息的服务是<span style="LINE-HEIGHT: 18px; TEXT-DECORATION: underline">rsyslogd</span>，它的配置文件为：/etc/rsyslog.conf。我们检测一下当前这个服务是不是在运行。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 18px">&nbsp;&nbsp;</span><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 18px">[flagonxia@airhouse etc]$ ps -ef | grep -v grep | grep rsyslog<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1584&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; 0 10:33 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00:00:00 rsyslogd -c 3</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从上面命令的输出结果看到rsyslogd执行时使用的参数是-c 3。这个输入参数在文件/etc/sysconfig/rsyslog中指定。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 18px">[flagonxia@airhouse sysconfig]$ less rsyslog<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Options to syslogd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # syslogd options are deprecated in rsyslog v3<span class=Apple-converted-space>&nbsp;</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # if you want to use them, switch to compatibility mode 2 by "-c 2"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SYSLOGD_OPTIONS="-c 3"</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也可以通过另一种方式，查看当前运行级别中，rsyslogd是否运行。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 18px">[flagonxia@airhouse sysconfig]$ sudo chkconfig --list rsyslog<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>rsyslog</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0:off&nbsp;&nbsp; 1:off&nbsp;&nbsp; 2:on&nbsp;&nbsp;&nbsp; 3:on&nbsp;&nbsp;&nbsp; 4:on&nbsp;&nbsp;&nbsp; 5:on&nbsp;&nbsp;&nbsp; 6:off</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><span style="COLOR: rgb(0,0,0); LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意，这里的服务名是rsyslog。</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><span style="COLOR: rgb(0,0,0); LINE-HEIGHT: 18px"><strong>1.2 配置文件/etc/rsyslog.conf</strong></span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><strong>1.2.1 配置文件的基本信息</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;配置文件/etc/rsyslog.conf中有很多内容，但最主要的是指定需要记录哪些服务和需要记录什么等级的信息。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是rsyslog.conf的内容。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # /etc/rsyslog.conf</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... ...</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #### RULES ####</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Log all kernel messages to the console.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Logging much else clutters up the screen.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #kern.*&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /dev/console</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Log anything (except mail) of level info or higher.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Don't log private authentication messages!<br><strong><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: 18px">A</span></strong>&nbsp;&nbsp;&nbsp; *.info;mail.none;authpriv.none;cron.none&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/messages</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# The authpriv file has restricted access.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authpriv.*&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/secure</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Log all the mail messages in one place.<br><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: 18px"><strong>B</strong></span>&nbsp;&nbsp;&nbsp; mail.*&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -/var/log/maillog</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Log cron stuff<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cron.*&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/cron</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Everybody gets emergency messages<br><span style="COLOR: rgb(51,153,102); LINE-HEIGHT: 21px"><strong>C</strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*.emerg&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Save news errors of level crit and higher in a special file.<br><strong><span style="COLOR: rgb(255,102,0); LINE-HEIGHT: 21px">D</span></strong>&nbsp;&nbsp;&nbsp;&nbsp;uucp,news.crit&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/spooler</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Save boot messages also to boot.log<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local7.*&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/boot.log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【注释】</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(255,0,0); LINE-HEIGHT: 18px"><strong>A</strong></span>：把所有<span style="LINE-HEIGHT: 18px; TEXT-DECORATION: underline">大于</span>info级别的信息都记录到/var/log/messages中，但不要记录mail，authpriv和cron服务产生的信息；</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: 18px"><strong>B</strong></span>：把mail产生的信息都记录到/var/log/maillog中</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(51,153,102); LINE-HEIGHT: 18px"><strong>C</strong></span>：把所有服务输出的&#8220;大于&#8221;emergy级别的信息显示给每个在线的人，通过wall工具</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(255,102,0); LINE-HEIGHT: 18px"><strong>D</strong></span>：把uucp和news输出的大雨crit级别的信息记录到/var/log/spooler中</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><strong>1.2.2 信息的等级及其在配置文件中指定的方式</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><strong>&nbsp;&nbsp;&nbsp;&nbsp; A&nbsp;七种信息等级</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）info</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 2）notice</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 3）warning或warn</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;4）err或error</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 5）crit</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 6）alert</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 7）emerg或panic：导致系统几乎要死机</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B 信息等级的指定方式</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1）. xxx: 表示大于xxx级别的信息</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 2）.=xxx：表示等于xxx级别的信息</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3）.!xxx：表示在xxx之外的等级的信息</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong><span style="FONT-SIZE: small; LINE-HEIGHT: 19px">2. logrotate服务</span></strong></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong></strong></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong></strong></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px"><strong>2.1 logrotate服务的启动方式</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="FONT-SIZE: small; LINE-HEIGHT: 19px"><span style="FONT-SIZE: x-small; LINE-HEIGHT: 18px">logrotate是一个日志管理程序，用来把旧的日志文件删除（备份），并创建新的日志文件，这个过程称为&#8220;转储&#8221;。我们可以根据日志的大小，或者根据其使用的天数来转储。</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logrotate的执行由crond服务实现。在/etc/cron.daily目录中，有个文件logrotate，它实际上是个shell script，用来启动logrotate。logrotate程序每天由cron在指定的时间（/etc/crontab）启动。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">[flagonxia@airhouse cron.daily]$ less logrotate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">#!/bin/sh</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/sbin/logrotate /etc/logrotate.conf<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXITVALUE=$?<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if [ $EXITVALUE != 0 ]; then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fi<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit 0</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(0,0,0); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，使用ps是无法查看到logrotate的。如果它没有起来，就要查看一下crond服务有没有在运行。</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(0,0,0); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(0,0,255); LINE-HEIGHT: 21px">[flagonxia@airhouse logrotate.d]$ ps -ef | grep -v grep | grep cron<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1984&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; 0 10:34 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00:00:00 crond</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><strong>2.2 logrotate的配置文件/etc/logrotate.conf</strong>&nbsp;</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: rgb(0,0,0); LINE-HEIGHT: 21px">在执行logrotate时，需要指定其配置文件/etc/logrotate.conf。这个文件定义了如何转储日志文件的规则。如下：</span></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # see "man logrotate" for details<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # rotate log files weekly<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; weekly</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; # keep 4 weeks worth of backlogs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rotate 4</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # create new (empty) log files after rotating old ones<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; create</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # use date as a suffix of the rotated file<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dateext</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # uncomment this if you want your log files compressed<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #compress</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # RPM packages drop log rotation information into this directory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><strong>include /etc/logrotate.d</strong></span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # no packages own wtmp and btmp -- we'll rotate them here<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/wtmp {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; monthly<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; create 0664 root utmp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rotate 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /var/log/btmp {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; missingok<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; monthly<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; create 0600 root utmp<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; rotate 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px"><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # system-specific logs may be also be configured here.</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个配置文件的注释写得很清楚，没有必要再罗嗦了。只想强调下面这行，它的作用包含存放在/etc/logrotate.d目录下面的配置文件，不可或缺。如果你安装了一个新的服务，它的日志转储的规则可以建立一个专门的配置文件，放在/etc/logrotate.d下面。它其实也因为下面的这句话，在logrotate服务启动时被读取。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;include /etc/logrotate.d</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有个例子：/etc/logrotate.d/syslog</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=Apple-converted-space>&nbsp;</span><span style="COLOR: rgb(51,102,255); LINE-HEIGHT: 21px">/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sharedscripts<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;postrotate<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;/bin/kill -HUP `cat /var/run/rsyslogd.pid 2&gt; /dev/null` 2&gt; /dev/null || true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; endscript<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上面的配置对于/var/log/messages, /var/log/secure, /var/log/mailog/ /var/log/spooler, /var/log/boot.log, /var/log/cron都是适用的。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注意，prerotate和postrotate必须和sharescripts...endscript一起用。上面的信息表示日志文件转储后，重启rsyslogd服务。</p>
<p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em 0px 0.5em; PADDING-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每个存放在/etc/logrotate.d目录里的文件，都有上面格式的配置信息。在{}中定义的规则，如果与logrotate.conf中的冲突，以/etc/logrotatate.d/中的文件定义的为准。</p>
</span></span>
<img src ="http://www.cppblog.com/momoxiao/aggbug/141009.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-03-02 21:23 <a href="http://www.cppblog.com/momoxiao/archive/2011/03/02/141009.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux kernel macro likely() unlikely()</title><link>http://www.cppblog.com/momoxiao/archive/2011/02/03/139709.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Thu, 03 Feb 2011 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/02/03/139709.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/139709.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/02/03/139709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/139709.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/139709.html</trackback:ping><description><![CDATA[<p>&lt;linux/compiler.h&gt; 2.6.36<br>142 # define likely(x)&nbsp; __builtin_expect(!!(x), 1)<br>143 # define unlikely(x)&nbsp;&nbsp;&nbsp; __builtin_expect(!!(x), 0)</p>
<p>long __buildin_expect(long EXP, C)是GCC的内置函数，用来给编译器提供分支预测信息：期望EXP==C，返回值是EXP。其中C是编译时常量。<br>eg:<br>if(__buildin_expect(ptr != NULL, 1)) error(); // 期望ptr!=NULL为1；当期望满足时（返回的ptr != NULL为1）执行error()<br>if(__buildin_expect(x,0)) foo(); // 期望x==0；当期望未满足（返回的x为真）时执行foo()</p>
<p>总之：<br>if(likely(x)) foo();&nbsp;&nbsp;&nbsp;&nbsp; // 期望x为真，且x为真时执行foo()<br>if(unlikely(x)) foo(); // 期望x为假，且x为真时执行foo()<br>也就是说，likely()和unlikely()都是在x为真时执行分支下面的语句；不同的是likely()期望x为真，unlikely期望x为假，</p>
<p>--<br>ref: <br><a href="http://blog.richliu.com/2007/02/01/428/">http://blog.richliu.com/2007/02/01/428/</a></p>
<img src ="http://www.cppblog.com/momoxiao/aggbug/139709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-02-03 16:23 <a href="http://www.cppblog.com/momoxiao/archive/2011/02/03/139709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>implicit declaration of function 'NIPQUAD'</title><link>http://www.cppblog.com/momoxiao/archive/2011/01/27/139393.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Wed, 26 Jan 2011 20:28:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/01/27/139393.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/139393.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/01/27/139393.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/139393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/139393.html</trackback:ping><description><![CDATA[<p>Q:implicit declaration of function 'NIPQUAD'<br>A:</p>
<p><a href="http://kerneltrap.org/mailarchive/linux-netdev/2008/10/31/3873584">http://kerneltrap.org/mailarchive/linux-netdev/2008/10/31/3873584</a></p>
<p>&nbsp;Using NIPQUAD() with NIPQUAD_FMT, %d.%d.%d.%d or %u.%u.%u.%u<br>can be replaced with %pI4</p>
<p>-&nbsp;&nbsp;dprintf("SRC: %u.%u.%u.%u. Mask: %u.%u.%u.%u. Target: %u.%u.%u.%u.%s\n",<br>-&nbsp;&nbsp;&nbsp;NIPQUAD(src_ipaddr),<br>-&nbsp;&nbsp;&nbsp;NIPQUAD(arpinfo-&gt;smsk.s_addr),<br>-&nbsp;&nbsp;&nbsp;NIPQUAD(arpinfo-&gt;src.s_addr),<br>+&nbsp;&nbsp;dprintf("SRC: %pI4. Mask: %pI4. Target: %pI4.%s\n",<br>+&nbsp;&nbsp;&nbsp;&amp;src_ipaddr,<br>+&nbsp;&nbsp;&nbsp;&amp;arpinfo-&gt;smsk.s_addr,<br>+&nbsp;&nbsp;&nbsp;&amp;arpinfo-&gt;src.s_addr,<br>&nbsp;&nbsp;&nbsp;&nbsp;arpinfo-&gt;invflags &amp; ARPT_INV_SRCIP ? " (INV)" : "");<br></p>
<img src ="http://www.cppblog.com/momoxiao/aggbug/139393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-01-27 04:28 <a href="http://www.cppblog.com/momoxiao/archive/2011/01/27/139393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ldd3读书笔记</title><link>http://www.cppblog.com/momoxiao/archive/2011/01/05/138041.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Wed, 05 Jan 2011 15:24:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2011/01/05/138041.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/138041.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2011/01/05/138041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/138041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/138041.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ldd3读书笔记最近编辑过的 2011年1月3日&nbsp;Q:implicit declaration of function 'NIPQUAD'A:http://kerneltrap.org/mailarchive/linux-netdev/2008/10/31/3873584&nbsp;Using NIPQUAD() with NIPQUAD_FMT, %d.%d.%d.%d or %u.%...&nbsp;&nbsp;<a href='http://www.cppblog.com/momoxiao/archive/2011/01/05/138041.html'>阅读全文</a><img src ="http://www.cppblog.com/momoxiao/aggbug/138041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2011-01-05 23:24 <a href="http://www.cppblog.com/momoxiao/archive/2011/01/05/138041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>scull源码分析 //未完待续，囧</title><link>http://www.cppblog.com/momoxiao/archive/2010/12/10/136112.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Fri, 10 Dec 2010 15:48:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/12/10/136112.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/136112.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/12/10/136112.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/136112.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/136112.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Makefile&nbsp;Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#&nbsp;disable/enable&nbsp;debugging#DEBUG&nbsp;=&nbsp;y#&nbsp;当DEBUG变量等于y时。两个比较变量用括...&nbsp;&nbsp;<a href='http://www.cppblog.com/momoxiao/archive/2010/12/10/136112.html'>阅读全文</a><img src ="http://www.cppblog.com/momoxiao/aggbug/136112.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-12-10 23:48 <a href="http://www.cppblog.com/momoxiao/archive/2010/12/10/136112.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盖楼 </title><link>http://www.cppblog.com/momoxiao/archive/2010/11/09/133126.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 09 Nov 2010 14:18:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/11/09/133126.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/133126.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/11/09/133126.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/133126.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/133126.html</trackback:ping><description><![CDATA[恩，RT
<br><img src ="http://www.cppblog.com/momoxiao/aggbug/133126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-11-09 22:18 <a href="http://www.cppblog.com/momoxiao/archive/2010/11/09/133126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>kill</title><link>http://www.cppblog.com/momoxiao/archive/2010/08/17/123645.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Mon, 16 Aug 2010 16:18:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/08/17/123645.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/123645.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/08/17/123645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/123645.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/123645.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: arial; font-size: 14px; line-height: 24px;">kill（传送信号给指定的进程，使用 kill -l 命令可查看linux系统中信号。）<br><br><strong>相关函数<br></strong>raise，signal<br><br><strong>表头文件<br></strong>#include&lt;sys/types.h&gt;<br>#include&lt;signal.h&gt;<span style="font-weight: bold;"><br><br></span><strong>定义函数<br></strong>int kill(pid_t pid,int sig);<span style="font-weight: bold;"><br><br></span><strong>函数说明<br></strong>kill()可以用来送参数sig指定的信号给参数pid指定的进程。<br><br>参数pid有几种情况:<br>pid&gt;0 将信号传给进程识别码为pid 的进程。<br>pid=0 将信号传给和目前进程相同进程组的所有进程<br>pid=-1 将信号广播传送给系统内所有的进程<br>pid&lt;0 将信号传给进程组识别码为pid绝对值的所有进程<br><span style="font-weight: bold;"><br></span><strong>返回值</strong><span class="Apple-converted-space"><br></span>执行成功则返回0，如果有错误则返回-1。<br><br><strong>错误代码</strong><br>EINVAL 参数sig 不合法<br>ESRCH 参数pid 所指定的进程或进程组不存在　<br>EPERM 权限不够无法传送信号给指定进程</span></span><img src ="http://www.cppblog.com/momoxiao/aggbug/123645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-08-17 00:18 <a href="http://www.cppblog.com/momoxiao/archive/2010/08/17/123645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SIGHUP</title><link>http://www.cppblog.com/momoxiao/archive/2010/08/17/123642.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Mon, 16 Aug 2010 16:05:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/08/17/123642.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/123642.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/08/17/123642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/123642.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/123642.html</trackback:ping><description><![CDATA[当进程的控制终端关闭时，发送给进程 SIGHUP 信号。<br><br><span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: sans-serif; font-size: 16px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"><span class="Apple-style-span" style="font-size: 13px; line-height: 19px;">On<span class="Apple-converted-space">&nbsp;</span><a href="http://www.cppblog.com/wiki/POSIX" title="POSIX" style="text-decoration: none; color: #0645ad; background-image: none;">POSIX</a>-compliant platforms,<span class="Apple-converted-space">&nbsp;</span><strong>SIGHUP</strong><span class="Apple-converted-space">&nbsp;</span>is a<span class="Apple-converted-space">&nbsp;</span><a href="http://www.cppblog.com/wiki/Signal_(computing)" title="Signal (computing)" style="text-decoration: none; color: #0645ad; background-image: none;">signal</a><span class="Apple-converted-space">&nbsp;</span>sent to a<span class="Apple-converted-space">&nbsp;</span><a href="http://www.cppblog.com/wiki/Process_(computing)" title="Process (computing)" style="text-decoration: none; color: #0645ad; background-image: none;">process</a><span class="Apple-converted-space">&nbsp;</span>when its<a href="http://www.cppblog.com/w/index.php?title=Controlling_terminal&amp;action=edit&amp;redlink=1" class="new" title="Controlling terminal (page does not exist)" style="text-decoration: none; color: #cc2200; background-image: none;"> controlling terminal</a><span class="Apple-converted-space">&nbsp;</span>is closed. (It was originally designed to notify the process of a<span class="Apple-converted-space">&nbsp;</span><a href="http://www.cppblog.com/wiki/RS-232" title="RS-232" style="text-decoration: none; color: #0645ad; background-image: none;">serial line</a><span class="Apple-converted-space">&nbsp;</span>drop). SIGHUP is a<span class="Apple-converted-space">&nbsp;</span><a href="http://www.cppblog.com/wiki/C_preprocessor" title="C preprocessor" style="text-decoration: none; color: #0645ad; background-image: none;">symbolic constant</a><span class="Apple-converted-space">&nbsp;</span>defined in the<a href="http://www.cppblog.com/wiki/Header_file" title="Header file" style="text-decoration: none; color: #0645ad; background-image: none;">header file</a><span class="Apple-converted-space">&nbsp;</span><code style="font-family: monospace,sans-serif; background-color: #f9f9f9;"><a href="http://www.cppblog.com/wiki/Signal.h" title="Signal.h" style="text-decoration: none; color: #0645ad; background-image: none;">signal.h</a></code>.</span></span> <img src ="http://www.cppblog.com/momoxiao/aggbug/123642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-08-17 00:05 <a href="http://www.cppblog.com/momoxiao/archive/2010/08/17/123642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>wait</title><link>http://www.cppblog.com/momoxiao/archive/2010/08/16/123640.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Mon, 16 Aug 2010 15:42:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/08/16/123640.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/123640.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/08/16/123640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/123640.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/123640.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: arial; font-size: 14px; line-height: 24px;">wait（等待子进程中断或结束）<br><br>相关函数<br>waitpid，fork<br><br>表头文件<br>#include&lt;sys/types.h&gt;<br>#include&lt;sys/wait.h&gt;<br><br>定义函数<br>pid_t wait (int * status);<br><br>函数说明<br>wait（）会暂时停止目前进程的执行，直到有信号来到或子进程结束。如果在调用wait（）时子进程已经结束，则wait（）会立即返回子进程结束状态值。子进程的结束状态值会由参数status 返回，而子进程的进程识别码也会一快返回。如果不在意结束状态值，则参数status 可以设成NULL。子进程的结束状态值请参考下面的waitpid（）。<br><br>返回值<br>如果执行成功则返回子进程识别码（PID），如果有错误发生则返回-1。失败原因存于errno 中。<br><br>==============<br></span></span>EINTR ，A signal interrupted this function<br> <img src ="http://www.cppblog.com/momoxiao/aggbug/123640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-08-16 23:42 <a href="http://www.cppblog.com/momoxiao/archive/2010/08/16/123640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fork</title><link>http://www.cppblog.com/momoxiao/archive/2010/08/16/123639.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Mon, 16 Aug 2010 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/08/16/123639.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/123639.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/08/16/123639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/123639.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/123639.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: Simsun; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;"><span class="Apple-style-span" style="font-family: arial; font-size: 14px; line-height: 24px;">头文件：<br>#include &lt;unistd.h&gt;<br><br>函数定义：<br>int fork( void );<br><br>返回值：<br>子进程中返回0，父进程中返回子进程ID，出错返回-1<br><br>函数说明：<br>一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程（child process）。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。<br>子进程是父进程的副本，它将获得父进程数据空间、堆、栈等资源的副本。注意，子进程持有的是上述存储空间的&#8220;副本&#8221;，这意味着父子进程间不共享这些存储空间，它们之间共享的存储空间只有代码段。</span></span><br class="Apple-interchange-newline"><img src ="http://www.cppblog.com/momoxiao/aggbug/123639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-08-16 23:27 <a href="http://www.cppblog.com/momoxiao/archive/2010/08/16/123639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gcc math.h -lm</title><link>http://www.cppblog.com/momoxiao/archive/2010/08/05/122265.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Thu, 05 Aug 2010 01:04:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/08/05/122265.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/122265.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/08/05/122265.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/122265.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/122265.html</trackback:ping><description><![CDATA[程序中用到 math.c，使用 gcc 编译，需要加上 -lm 选项。<br>-l表示使用库，m为数学库。<br>=================<br>Linux程序设计中的一个例子：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">types.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">resource.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">sys</span><span style="color: #000000;">/</span><span style="color: #000000;">time.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">unistd.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">math.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;向一个临时文件写一个字符串10000次，然后进行一些数学运算，目的是制造一些CPU负荷</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;work()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;FILE&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">f;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">double</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4.5</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;f&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;tmpfile();&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;创建临时文件</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10000</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(f,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Do&nbsp;some&nbsp;output\n</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;">(ferror(f)){&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">TODO&nbsp;ferror?</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fprintf(stderr,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Error&nbsp;writing&nbsp;to&nbsp;temporary&nbsp;file\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exit(</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;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">(i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1000000</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log(x</span><span style="color: #000000;">*</span><span style="color: #000000;">x&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3.21</span><span style="color: #000000;">);<br>}<br><br></span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;main&nbsp;函数先调用&nbsp;work,&nbsp;再调用&nbsp;getrusage&nbsp;函数查看它使用了多少&nbsp;CPU&nbsp;时间。把这些资料显示在屏幕上。</span><span style="color: #808080;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;rusage&nbsp;r_usage;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;rlimit&nbsp;r_limit;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;priority;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;work();<br>&nbsp;&nbsp;&nbsp;&nbsp;getrusage(RUSAGE_SELF,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">r_usage);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;只返回当前程序的&nbsp;CPU&nbsp;占用时间</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">CPU&nbsp;usage:&nbsp;User&nbsp;=&nbsp;%ld.%06ld,&nbsp;System&nbsp;=&nbsp;%ld.%06ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r_usage.ru_utime.tv_sec,&nbsp;r_usage.ru_utime.tv_usec,&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;r_usage.ru_utime&nbsp;程序本身执行它的指令所消耗的时间</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r_usage.ru_stime.tv_sec,&nbsp;r_usage.ru_stime.tv_usec);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;r_usage.ru_stime&nbsp;OS由于这个程序而消耗的&nbsp;CPU&nbsp;时间</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;调用&nbsp;getpriority&nbsp;和&nbsp;getrlimit&nbsp;函数分别查出自己的当前优先级和文件长度限制</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;priority&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getpriority(PRIO_PROCESS,&nbsp;getpid());&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;PRIO_PROCESS&nbsp;表示后面是进程标识符</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Current&nbsp;priority&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;priority);<br>&nbsp;&nbsp;&nbsp;&nbsp;getrlimit(RLIMIT_FSIZE,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">r_limit);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;读取以字节计的文件长度限制到&nbsp;r_limit&nbsp;中</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Current&nbsp;FSIZE&nbsp;limit:&nbsp;soft&nbsp;=&nbsp;%ld,&nbsp;hard&nbsp;=&nbsp;%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r_limit.rlim_cur,&nbsp;r_limit.rlim_max);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;rlim_cur&nbsp;软限制,&nbsp;rlimt_max&nbsp;硬限制</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;通过&nbsp;setrlimit&nbsp;函数设置了一个文件长度限制。</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;r_limit.rlim_cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2048</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;软限制2M</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;r_limit.rlim_max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">4096</span><span style="color: #000000;">;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;硬限制4M</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Setting&nbsp;a&nbsp;2K&nbsp;file&nbsp;size&nbsp;limit\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;setrlimit(RLIMIT_FSIZE,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">r_limit);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">///</span><span style="color: #008000;">&nbsp;然后再次调用&nbsp;work&nbsp;失败，因为它尝试创建的文件尺寸过大。</span><span style="color: #808080;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;work();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;exit(</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br><br>}</span></div>
<br>编译：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">[green@colorfulgreen&nbsp;environ]$&nbsp;gcc&nbsp;limits.c&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">o&nbsp;limits</span></div>
<br>报错：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">/</span><span style="color: #000000;">tmp</span><span style="color: #000000;">/</span><span style="color: #000000;">ccxW94yi.o:&nbsp;In&nbsp;function&nbsp;`work</span><span style="color: #000000;">'</span><span style="color: #000000;">:</span><span style="color: #000000;"><br></span><span style="color: #000000;">limits.c:(.text</span><span style="color: #000000;">+</span><span style="color: #000000;">0xaf</span><span style="color: #000000;">):&nbsp;undefined&nbsp;reference&nbsp;to&nbsp;`log</span><span style="color: #000000;">'<br></span><span style="color: #000000;">collect2:&nbsp;ld&nbsp;returned&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;exit&nbsp;status</span></div>
<br>编译时加上 -lm 选项：<br>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">[green@colorfulgreen&nbsp;environ]$&nbsp;gcc&nbsp;limits.c&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">lm&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">o&nbsp;limits</span></div>
<br>Done.<br>============<br>PS:为嘛这个编辑器插入代码时最前面不能有下面这几行T_T<br>/**<br>&nbsp; * 资源限制<br>**/<br><br><br><br><br><br><br><img src ="http://www.cppblog.com/momoxiao/aggbug/122265.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-08-05 09:04 <a href="http://www.cppblog.com/momoxiao/archive/2010/08/05/122265.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>硬盘安装 Fedore13 Live</title><link>http://www.cppblog.com/momoxiao/archive/2010/07/18/120668.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Sat, 17 Jul 2010 23:20:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/07/18/120668.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/120668.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/07/18/120668.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/120668.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/120668.html</trackback:ping><description><![CDATA[睡觉被同事敲门敲醒，居然7点多了，orz。。。<br>昨晚无聊把Fedora装本上了，记一下，免得每次都得上网找。<br><br>1. grldr 放在C盘<br>2. boot.ini 最后添加一行 c:\grldr="GRUB"<br>3. ISO安装镜像中提取 LiveOS目录，/isolinux/vmlinuz0，/isolinux/initrd0.img 放在FAT32分区盘根目录中。<br>4. 重启进入grub<br>kernel (hd0,7)/isolinux/vmlinuz0 root=live:LABEL=FILE liveimg rhgb rootfstype=auto<br>initrd (hd0,7)/isolinux/initrd0.img<br>boot<br><br>其中(hd0,7)是第3步中的FAT32分区盘，卷标为FILE
<img src ="http://www.cppblog.com/momoxiao/aggbug/120668.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-07-18 07:20 <a href="http://www.cppblog.com/momoxiao/archive/2010/07/18/120668.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fedora13 mp3 rmvb</title><link>http://www.cppblog.com/momoxiao/archive/2010/07/18/120665.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Sat, 17 Jul 2010 20:21:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/07/18/120665.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/120665.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/07/18/120665.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/120665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/120665.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; letter-spacing: 1px; line-height: 21px; ">rpm -ivh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; list-style-type: none; list-style-position: initial; list-style-image: initial; letter-spacing: 0px; ">yum install gstreamer-plugins-bad gstreamer-ffmpeg gstreamer-plugins-ugly -y</span>
<img src ="http://www.cppblog.com/momoxiao/aggbug/120665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-07-18 04:21 <a href="http://www.cppblog.com/momoxiao/archive/2010/07/18/120665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Grub磁盘分区表示方法</title><link>http://www.cppblog.com/momoxiao/archive/2010/07/18/120660.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Sat, 17 Jul 2010 18:20:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/07/18/120660.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/120660.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/07/18/120660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/120660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/120660.html</trackback:ping><description><![CDATA[<span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 15px; COLOR: rgb(51,51,51); LINE-HEIGHT: 19px; FONT-FAMILY: Tahoma, 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, sans-serif; TEXT-ALIGN: left"><span class=Apple-style-span style="WORD-SPACING: 0px; FONT: medium Simsun; TEXT-TRANSFORM: none; COLOR: rgb(0,0,0); TEXT-INDENT: 0px; WHITE-SPACE: normal; LETTER-SPACING: normal; BORDER-COLLAPSE: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span class=Apple-style-span style="FONT-SIZE: 15px; COLOR: rgb(51,51,51); LINE-HEIGHT: 19px; FONT-FAMILY: Tahoma, 'Trebuchet MS', 'Lucida Grande', Verdana, Arial, sans-serif; TEXT-ALIGN: left">
<p><a href="http://www.linux-wiki.cn/index.php?title=Grub%E7%A3%81%E7%9B%98%E5%88%86%E5%8C%BA%E8%A1%A8%E7%A4%BA%E6%96%B9%E6%B3%95&amp;variant=zh-cn"><u><font color=#0000ff>http://www.linux-wiki.cn/index.php?title=Grub磁盘分区表示方法&amp;variant=zh-cn</font></u></a><br>==============================================<br><br>Grub指定分区的方法和Linux、Windows等系统不一样，它的主要特点为：</p>
<ul>
    <li style="MARGIN-LEFT: -10px">Grub在表示方式上并不区分普通的IDE硬盘、当下流行的SATA硬盘和SCSI硬盘等，在Grub中，硬盘会被识别为hd#，#是从0开始的硬盘编号，而软盘被类似地识别为fd#。</li>
    <li style="MARGIN-LEFT: -10px">Grub的硬盘编号和分区编号都是从0开始的，这一点linux不同。</li>
</ul>
<p>按照以上两个特点，假设有一块硬盘(hd0)，那么(hd0,0) (hd0,1) (hd0,2) (hd0,3)依次表示它的四个<a title=主分区 style="COLOR: rgb(33,83,176)" href="http://www.cppblog.com/index.php?title=%E4%B8%BB%E5%88%86%E5%8C%BA&amp;variant=zh-cn"><u>主分区</u></a>，而随后的(hd0,4)...则是<a class=new title="逻辑分区 (尚未撰写)" style="COLOR: red" href="http://www.cppblog.com/index.php?title=%E9%80%BB%E8%BE%91%E5%88%86%E5%8C%BA&amp;action=edit&amp;redlink=1"><u>逻辑分区</u></a>。<span class=Apple-converted-space>&nbsp;</span><a class=new title=Image:Example.jpg style="COLOR: red" href="http://www.cppblog.com/index.php?title=Special:Upload&amp;wpDestFile=Example.jpg"><u>Image:Example.jpg</u></a></p>
<p>通常情况下，装有Windows的硬盘中，通常是按照一个主分区(hd0,0)，一个<a title=扩展分区 style="COLOR: rgb(33,83,176)" href="http://www.cppblog.com/index.php?title=%E6%89%A9%E5%B1%95%E5%88%86%E5%8C%BA&amp;variant=zh-cn"><u>扩展分区</u></a>(hd0,1)该扩展分区下是若干逻辑分区。这样(hd0,0)对应C盘，(hd0,4)对应D盘，依此类推。</p>
<p>如果您还不能确定你需要的那个分区，可以在输入过程中按下Tab键实现<a class=new title="命令补全 (尚未撰写)" style="COLOR: red" href="http://www.cppblog.com/index.php?title=%E5%91%BD%E4%BB%A4%E8%A1%A5%E5%85%A8&amp;action=edit&amp;redlink=1"><u>命令补全</u></a>。比如你在输入一条root语句：</p>
<pre style="PADDING-RIGHT: 0.5em; OVERFLOW-Y: auto; PADDING-LEFT: 0.5em; FONT-SIZE: 12px; OVERFLOW-X: auto; PADDING-BOTTOM: 0.5em; MARGIN-LEFT: 2em; BORDER-LEFT: rgb(204,204,204) 3px solid; COLOR: rgb(102,0,0); PADDING-TOP: 0.5em">root (hd0,
</pre>
<p>此时按下Tab键，grub将列出可用的分区编号和分区类型（grub还不能识别ntfs分区，显示为不知道类型的分区）。你可以依照这个提示来完成命令的输入。</p>
<p>如果不能确定ISO文件的位置，可使用find 文件名.iso(find debian-40r2-i386-CD-1.iso)</p>
==============================<br><br>试了下Tab键命令补全。。。窃喜ing。。。<img height=20 src="http://www.cppblog.com/Emoticons/QQ/14.gif" width=20 border=0></span></span></span></span>
<img src ="http://www.cppblog.com/momoxiao/aggbug/120660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-07-18 02:20 <a href="http://www.cppblog.com/momoxiao/archive/2010/07/18/120660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>volume group "volgroup00" not found</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/26/118758.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Sat, 26 Jun 2010 02:49:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/26/118758.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/118758.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/26/118758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/118758.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/118758.html</trackback:ping><description><![CDATA[


<table cellspacing="0" cellpadding="0" style="word-wrap: break-word; empty-cells: show; border-collapse: collapse; color: rgb(0, 0, 0); line-height: normal; table-layout: fixed; margin-left: 1px; font-family: song, Verdana; font-size: 12px; width: 792px; "><tbody style="word-wrap: break-word; line-height: normal; "><tr style="word-wrap: break-word; line-height: normal; "><td class="t_msgfont" id="postmessage_7140149" style="word-wrap: break-word; color: rgb(0, 0, 0); font: normal normal normal 12px/normal song, Verdana; line-height: 1.6em; font-size: 14px; "><a href="http://www.csource.org/bbs/thread-1140084-1-1.html">http://www.csource.org/bbs/thread-1140084-1-1.html</a>&nbsp;<br>by SharkBones<br><br>前段时间也遇到和lz类似的问题，出现这种情况可能是有以下几个原因：<br style="word-wrap: break-word; line-height: normal; ">1.编译内核时未添加相应的硬件支持，比如对于SCSI或IDE硬盘的支持，这些硬件驱动都是以模块的形式编译进内核。<br style="word-wrap: break-word; line-height: normal; ">2.编译时的选项不正确<span style="COLOR:red">对LVM,RAID的支持应该是以模块的形式编译进内核，而不是Built-in,</span>否则可能就会出现lz所说的情况。<br style="word-wrap: break-word; line-height: normal; ">建议楼主用cpio解压你的initrd-2.6.31.4-*.img，检查一下解压后的lib目录里是否有相应的支持LVM的内核模块，如果没有，那就是编译时内核选项不正确，需要重新编译了。<br><br>=============================<br><br><span  style="border-collapse: separate; font-family: Simsun; line-height: normal; font-size: medium; ">那为啥还提供Build-in选项。。。悲剧。。。<br>呃，想起来了，貌似只有yes,no,module;yes,no.没有module,no。。。<br><br>==============================<br><br>好吧# make defconfig 好了，传说中Linus的配置 &gt;_&lt;<br>貌似又悲剧了。。。</span></td></tr></tbody></table><img src ="http://www.cppblog.com/momoxiao/aggbug/118758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-26 10:49 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/26/118758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】proc文件系统分析（四）</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/23/118521.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 22 Jun 2010 22:10:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/23/118521.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/118521.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/23/118521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/118521.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/118521.html</trackback:ping><description><![CDATA[<span style="WIDOWS: 2; TEXT-TRANSFORM: none; TEXT-INDENT: 0px; BORDER-COLLAPSE: separate; FONT: medium Simsun; WHITE-SPACE: normal; ORPHANS: 2; LETTER-SPACING: normal; COLOR: rgb(0,0,0); WORD-SPACING: 0px; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" class=Apple-style-span><span style="LINE-HEIGHT: 20px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif; FONT-SIZE: 14px" class=Apple-style-span>（六） 对proc文件默认操作的分析<span class=Apple-converted-space>&nbsp;</span><br>现在，我们已经基本清楚了proc文件系统对自己proc_dir_entry结构的管理了。下面我们回过头来，再看一下在文件注册函数中的一段代码：<span class=Apple-converted-space>&nbsp;</span><br>if (S_ISDIR(dp-&gt;mode)) {<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;proc_iops == NULL) {<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_fops = &amp;proc_dir_operations;<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_iops = &amp;proc_dir_inode_operations;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>dir-&gt;nlink++;<span class=Apple-converted-space>&nbsp;</span><br>} else if (S_ISLNK(dp-&gt;mode)) {<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;proc_iops == NULL)<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_iops = &amp;proc_link_inode_operations;<span class=Apple-converted-space>&nbsp;</span><br>} else if (S_ISREG(dp-&gt;mode)) {<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;proc_fops == NULL)<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_fops = &amp;proc_file_operations;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>我在前面已经提过，这段代码根据注册的proc文件类型的不同，为proc_dir_entry结构设置了不同的操作函数集。也就是说，我们使用封装的create_proc_entry函数在proc文件系统中注册文件时，可以不用去管这些操作函数集，因为该结构总是自动地设置了相应的proc_iops和proc_fops操作函数。下面我们就对这些默认的操作进行一个分析，因为这对我们了解proc文件系统和VFS的结构非常重要。<span class=Apple-converted-space>&nbsp;</span><br>1 对普通文件的操作<span class=Apple-converted-space>&nbsp;</span><br>我们首先看一下普通proc文件的函数集，根据代码段：<span class=Apple-converted-space>&nbsp;</span><br>if (S_ISREG(dp-&gt;mode)) {<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;proc_fops == NULL)<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_fops = &amp;proc_file_operations;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>我们可以看到，对于普通的proc文件，只设置了文件操作，即proc_file_operations，从这一点上可以看出，对于普通的proc文件，只缺省提供了文件操作，因此，在必要的时候，我们必须手工设置需要的索引节点操作函数集，比如inode_operations中的权限检查函数permission等等。<span class=Apple-converted-space>&nbsp;</span><br>对于proc_file_operations，我们可以看到，只实现了三个函数：<span class=Apple-converted-space>&nbsp;</span><br>static struct file_operations proc_file_operations = {<span class=Apple-converted-space>&nbsp;</span><br>llseek: proc_file_lseek,<span class=Apple-converted-space>&nbsp;</span><br>read: proc_file_read,<span class=Apple-converted-space>&nbsp;</span><br>write: proc_file_write,<span class=Apple-converted-space>&nbsp;</span><br>};<span class=Apple-converted-space>&nbsp;</span><br>下面我们简单的看一下它们实现的功能：<span class=Apple-converted-space>&nbsp;</span><br>（1）llseek: proc_file_lseek<span class=Apple-converted-space>&nbsp;</span><br>这个函数，用来实现lseek系统调用，其功能是设置file结构的-&gt;f_pos域，因此，根据第三个参数orig的不同，将f_pos设置为相应的值，该函数非常简单，因此不作过多的介绍。<span class=Apple-converted-space>&nbsp;</span><br>（2）read: proc_file_read<span class=Apple-converted-space>&nbsp;</span><br>这个函数是file_operations结构中的成员，在后面我们将看到，在proc_dir_entry结构中实现的file_operations和inode_operations将链接至VFS的inode中，因此，该函数将用来实现read系统调用。在这个函数中，首先根据file结构，得到相应的inode，然后由<span class=Apple-converted-space>&nbsp;</span><br>struct proc_dir_entry * dp;<span class=Apple-converted-space>&nbsp;</span><br>dp = (struct proc_dir_entry *) inode-&gt;u.generic_ip;<span class=Apple-converted-space>&nbsp;</span><br>而得到proc_dir_entry结构，然后，开始调用该proc_dir_entry结构中的函数，向用户空间返回指定大小的数据，我们看一下下面的代码片断：<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;get_info) {<span class=Apple-converted-space>&nbsp;</span><br>/*<span class=Apple-converted-space>&nbsp;</span><br>* Handle backwards compatibility with the old net<span class=Apple-converted-space>&nbsp;</span><br>* routines.<span class=Apple-converted-space>&nbsp;</span><br>*/<span class=Apple-converted-space>&nbsp;</span><br>n = dp-&gt;get_info(page, &amp;start, *ppos, count);<span class=Apple-converted-space>&nbsp;</span><br>if (n read_proc) {<span class=Apple-converted-space>&nbsp;</span><br>n = dp-&gt;read_proc(page, &amp;start, *ppos,<span class=Apple-converted-space>&nbsp;</span><br>count, &amp;eof, dp-&gt;data);<span class=Apple-converted-space>&nbsp;</span><br>} else<span class=Apple-converted-space>&nbsp;</span><br>break;<span class=Apple-converted-space>&nbsp;</span><br>由此我们看出，该函数的实现依赖于proc_dir_entry结构中的get_info和read_proc函数，因此，如果我们要注册自己的proc文件，在不设置自己的proc_fops操作函数集的时候，必须实现上面两个函数中的一个，否则，这个缺省的proc_file_read函数将做不了任何工作。示意图如下：<span class=Apple-converted-space>&nbsp;</span><br>在这个函数中，实现了从内核空间向用户空间传递数据的功能，其中使用了许多技巧，在这里就不作讨论了，具体实现可以参考源码。<span class=Apple-converted-space>&nbsp;</span><br>（3）write: proc_file_write<span class=Apple-converted-space>&nbsp;</span><br>与上面的函数类似，我们可以看到proc_file_write函数同样依赖于proc_dir_entry中的write_proc(file, buffer, count, dp-&gt;data)函数，它的实现非常简单：<span class=Apple-converted-space>&nbsp;</span><br>static ssize_t<span class=Apple-converted-space>&nbsp;</span><br>proc_file_write(struct file * file, const char * buffer,<span class=Apple-converted-space>&nbsp;</span><br>size_t count, loff_t *ppos)<span class=Apple-converted-space>&nbsp;</span><br>{<span class=Apple-converted-space>&nbsp;</span><br>struct inode *inode = file-&gt;f_dentry-&gt;d_inode;<span class=Apple-converted-space>&nbsp;</span><br>struct proc_dir_entry * dp;<span class=Apple-converted-space>&nbsp;</span><br>dp = (struct proc_dir_entry *) inode-&gt;u.generic_ip;<span class=Apple-converted-space>&nbsp;</span><br>if (!dp-&gt;write_proc)<span class=Apple-converted-space>&nbsp;</span><br>return -EIO;<span class=Apple-converted-space>&nbsp;</span><br>/* FIXME: does this routine need ppos? probably... */<span class=Apple-converted-space>&nbsp;</span><br>return dp-&gt;write_proc(file, buffer, count, dp-&gt;data);<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>我们看到，它只是简单地检测了-&gt;write_proc函数是否存在，如果我们在proc_dir_entry结构中实现了这个函数，那么就调用它，否则，就退出。<span class=Apple-converted-space>&nbsp;</span><br>根据上面的讨论，我们看到，对于普通文件的操作函数，proc文件系统为我们提供了一个简单的封装，因此，我们只要在proc_dir_entry中实现相关的读写操作即可。<span class=Apple-converted-space>&nbsp;</span><br>但是，如果我们想提供读写操作之外的函数，那么我们就可以定义自己的file_operations函数集，并且在proc文件注册后，将它链接到proc_dir_entry的proc_fops上，这样，就可以使用自己的函数集了。<span class=Apple-converted-space>&nbsp;</span><br>2 对链接文件的操作<span class=Apple-converted-space>&nbsp;</span><br>根据代码段：<span class=Apple-converted-space>&nbsp;</span><br>else if (S_ISLNK(dp-&gt;mode)) {<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;proc_iops == NULL)<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_iops = &amp;proc_link_inode_operations;<span class=Apple-converted-space>&nbsp;</span><br>我们可以看出，对于链接文件，proc文件系统为它设置了索引节点操作proc_iops。因为我们知道，一个符号链接，只拥有inode结构，而没有文件结构，所以，为它提供proc_link_inode_operations函数集就可以了。<span class=Apple-converted-space>&nbsp;</span><br>下面我们看一下，这个函数集的内容：<span class=Apple-converted-space>&nbsp;</span><br>static struct inode_operations proc_link_inode_operations = {<span class=Apple-converted-space>&nbsp;</span><br>readlink: proc_readlink,<span class=Apple-converted-space>&nbsp;</span><br>follow_link: proc_follow_link,<span class=Apple-converted-space>&nbsp;</span><br>};<span class=Apple-converted-space>&nbsp;</span><br>这个函数集实现了和链接相关的两个函数，我们分别来看一下：<span class=Apple-converted-space>&nbsp;</span><br>（1）readlink: proc_readlink<span class=Apple-converted-space>&nbsp;</span><br>该函数用来实现readlink系统调用，它的功能是获得目标文件的文件名，我们在前面看到，对于一个链接文件，在注册时已经将链接目标的文件放在了proc_dir_entry结构的-&gt;data域中（参考前面介绍的函数proc_symlink），因此，我们只要将-&gt;data中的数据返回就可以了，它的代码如下：<span class=Apple-converted-space>&nbsp;</span><br>static int proc_readlink(struct dentry *dentry, char *buffer, int buflen)<span class=Apple-converted-space>&nbsp;</span><br>{<span class=Apple-converted-space>&nbsp;</span><br>char *s=<span class=Apple-converted-space>&nbsp;</span><br>((struct proc_dir_entry *)dentry-&gt;d_inode-&gt;u.generic_ip)-&gt;data;<span class=Apple-converted-space>&nbsp;</span><br>return vfs_readlink(dentry, buffer, buflen, s);<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>我们看到，这个函数使用一个指针指向-&gt;data，然后，使用VFS函数vfs_readlink将数据返回到用户空间，非常的简单。<span class=Apple-converted-space>&nbsp;</span><br>（2）follow_link: proc_follow_link<span class=Apple-converted-space>&nbsp;</span><br>这个函数代码如下：<span class=Apple-converted-space>&nbsp;</span><br>static int proc_follow_link(struct dentry *dentry, struct nameidata *nd)<span class=Apple-converted-space>&nbsp;</span><br>{<span class=Apple-converted-space>&nbsp;</span><br>char *s=<span class=Apple-converted-space>&nbsp;</span><br>((struct proc_dir_entry *)dentry-&gt;d_inode-&gt;u.generic_ip)-&gt;data;<span class=Apple-converted-space>&nbsp;</span><br>return vfs_follow_link(nd, s);<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>和上面介绍的函数类似，它同样利用VFS的函数实现其功能，对于vfs_follow_link，可以参考fs/namei.c文件。其结构如下图所示：<span class=Apple-converted-space>&nbsp;</span><br>3 对目录文件的操作<span class=Apple-converted-space>&nbsp;</span><br>最后我们看一下proc文件系统对目录文件的操作函数集，在文件注册的时候，有如下代码：<span class=Apple-converted-space>&nbsp;</span><br>if (S_ISDIR(dp-&gt;mode)) {<span class=Apple-converted-space>&nbsp;</span><br>if (dp-&gt;proc_iops == NULL) {<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_fops = &amp;proc_dir_operations;<span class=Apple-converted-space>&nbsp;</span><br>dp-&gt;proc_iops = &amp;proc_dir_inode_operations;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>dir-&gt;nlink++;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>从中我们可以看到，在proc文件系统中注册目录文件的时候，它会检查是否该proc_dir_entry结构已经注册了proc_iops函数集，如果没有，那么就为proc_fops和proc_iops设置相应的缺省函数集。下面我们对它们分别进行讨论：<span class=Apple-converted-space>&nbsp;</span><br>1．对目录的文件操作proc_dir_operations：<span class=Apple-converted-space>&nbsp;</span><br>static struct file_operations proc_dir_operations = {<span class=Apple-converted-space>&nbsp;</span><br>read: generic_read_dir,<span class=Apple-converted-space>&nbsp;</span><br>readdir: proc_readdir,<span class=Apple-converted-space>&nbsp;</span><br>};<span class=Apple-converted-space>&nbsp;</span><br>这个函数集的主要功能，是在由proc_dir_entry结构构成的proc文件树中解析目录。下面我们对这两个函数进行一个简单的分析：<span class=Apple-converted-space>&nbsp;</span><br>（1）read: generic_read_dir<span class=Apple-converted-space>&nbsp;</span><br>我们知道，对于read系统调用，当其参数文件句柄指向目录的时候，将返回EISDIR错误。因此，目录文件的read函数将完成这个工作。generic_read_dir函数是VFS提供的通用函数，可以参考fs/read_write.c文件：<span class=Apple-converted-space>&nbsp;</span><br>ssize_t generic_read_dir(struct file *filp, char *buf, size_t siz, loff_t *ppos){<span class=Apple-converted-space>&nbsp;</span><br>return &#8211;EISDIR;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>这个函数很简单，只要返回错误码就可以了。<span class=Apple-converted-space>&nbsp;</span><br>（2）readdir: proc_readdir<span class=Apple-converted-space>&nbsp;</span><br>这个函数用来实现readdir系统调用，它从目录文件中读出dirent结构到内存中。我们可以参考fs/readdir.c中的filldir()函数。<span class=Apple-converted-space>&nbsp;</span><br>2．对目录文件索引节点的操作函数：proc_dir_inode_operations<span class=Apple-converted-space>&nbsp;</span><br>首先，我们看一下proc_dir_inode_operations的定义：<span class=Apple-converted-space>&nbsp;</span><br>/*<span class=Apple-converted-space>&nbsp;</span><br>* proc directories can do almost nothing..<span class=Apple-converted-space>&nbsp;</span><br>*/<span class=Apple-converted-space>&nbsp;</span><br>static struct inode_operations proc_dir_inode_operations = {<span class=Apple-converted-space>&nbsp;</span><br>lookup: proc_lookup,<span class=Apple-converted-space>&nbsp;</span><br>};<span class=Apple-converted-space>&nbsp;</span><br>我们看到，对于目录文件的索引节点，只定义了一个函数lookup。因为我们在前面对VFS进行分析的时候知道，以下操作，是只在目录节点中定义的：<span class=Apple-converted-space>&nbsp;</span><br>int (*create) (struct inode *,struct dentry *,int);<span class=Apple-converted-space>&nbsp;</span><br>struct dentry * (*lookup) (struct inode *,struct dentry *);<span class=Apple-converted-space>&nbsp;</span><br>int (*link) (struct dentry *,struct inode *,struct dentry *);<span class=Apple-converted-space>&nbsp;</span><br>int (*unlink) (struct inode *,struct dentry *);<span class=Apple-converted-space>&nbsp;</span><br>int (*symlink) (struct inode *,struct dentry *,const char *);<span class=Apple-converted-space>&nbsp;</span><br>int (*mkdir) (struct inode *,struct dentry *,int);<span class=Apple-converted-space>&nbsp;</span><br>int (*rmdir) (struct inode *,struct dentry *);<span class=Apple-converted-space>&nbsp;</span><br>int (*mknod) (struct inode *,struct dentry *,int,int);<span class=Apple-converted-space>&nbsp;</span><br>int (*rename) (struct inode *, struct dentry *,<span class=Apple-converted-space>&nbsp;</span><br>struct inode *, struct dentry *);<span class=Apple-converted-space>&nbsp;</span><br>但是经过我们对proc文件系统的分析，我们知道，proc文件系统中的文件都是在内核代码中通过proc_dir_entry实现的，因此，它不提供目录索引节点的create，link，unlink，symlink，mkdir，rmdir，mknod，rename方法，也就是说，用户是不能通过shell命令在/proc目录中对proc文件进行改名，删除，建子目录等操作的。这也算是proc文件系统的一种保护策略。<span class=Apple-converted-space>&nbsp;</span><br>而在内核中，则使用proc_mkdir，proc_mknod等函数，在核心内通过代码来维护proc文件树。由此可以看出虚拟文件系统的一些特性。对目录文件的默认操作，可以参见下面的示意图：<span class=Apple-converted-space>&nbsp;</span><br>下面我们就来看一下唯一定义的函数lookup: proc_lookup，到底实现了什么功能。<span class=Apple-converted-space>&nbsp;</span><br>在进行具体分析之前，我们先考虑一个问题，我们知道，proc文件系统维护了自己的proc_dir_entry结构，因此提供了create_proc_entry，remove_proc_entry等等函数，并且为了方便实现对proc文件的读写功能，特意在proc_dir_entry结构中设置了get_info，read_proc和write_proc函数指针（我们在前面介绍过，这三个函数被封装在proc_file_operations中），并且，提供了自己的inode_operations和file_operations，分别是proc_iops 和proc_fops。也就是说，我们在建立proc文件以及为proc文件建立操作函数的时候，似乎可以不用考虑VFS的实现，只要建立并注册该proc_dir_entry结构，然后实现其proc_iops 和proc_fops（或者get_info，read_proc和write_proc）就可以了。<span class=Apple-converted-space>&nbsp;</span><br>但是我们知道，在linux系统中，所有的子系统都是与VFS层交互，而VFS是通过inode结构进行管理的，并且在其上的操作（文件和索引节点的操作）也是通过该inode结构的inode_operations和file_operations实现的。因此，proc文件系统必须将自己的文件与VFS的inode链接起来。<span class=Apple-converted-space>&nbsp;</span><br>那么proc文件系统是在何时，通过何种方法将自己的proc_dir_entry结构和VFS的inode联系在一起的，并且将对inode的inode_operations和file_operations操作定位到自己结构中的proc_iops 和proc_fops上呢？通过我们对lookup: proc_lookup的分析，就会明白这一过程。<span class=Apple-converted-space>&nbsp;</span><br>我们先看一下它的代码：<span class=Apple-converted-space>&nbsp;</span><br>struct dentry *proc_lookup(struct inode * dir, struct dentry *dentry)<span class=Apple-converted-space>&nbsp;</span><br>{<span class=Apple-converted-space>&nbsp;</span><br>struct inode *inode;<span class=Apple-converted-space>&nbsp;</span><br>struct proc_dir_entry * de;<span class=Apple-converted-space>&nbsp;</span><br>int error;<span class=Apple-converted-space>&nbsp;</span><br>error = -ENOENT;<span class=Apple-converted-space>&nbsp;</span><br>inode = NULL;<span class=Apple-converted-space>&nbsp;</span><br>de = (struct proc_dir_entry *) dir-&gt;u.generic_ip;<span class=Apple-converted-space>&nbsp;</span><br>if (de) {<span class=Apple-converted-space>&nbsp;</span><br>for (de = de-&gt;subdir; de ; de = de-&gt;next) {<span class=Apple-converted-space>&nbsp;</span><br>if (!de || !de-&gt;low_ino)<span class=Apple-converted-space>&nbsp;</span><br>continue;<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;namelen != dentry-&gt;d_name.len)<span class=Apple-converted-space>&nbsp;</span><br>continue;<span class=Apple-converted-space>&nbsp;</span><br>if (!memcmp(dentry-&gt;d_name.name,<span class=Apple-converted-space>&nbsp;</span><br>de-&gt;name, de-&gt;namelen)) {<span class=Apple-converted-space>&nbsp;</span><br>int ino = de-&gt;low_ino;<span class=Apple-converted-space>&nbsp;</span><br>error = -EINVAL;<span class=Apple-converted-space>&nbsp;</span><br>inode = proc_get_inode(dir-&gt;i_sb, ino, de);<span class=Apple-converted-space>&nbsp;</span><br>break;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>if (inode) {<span class=Apple-converted-space>&nbsp;</span><br>dentry-&gt;d_op = &amp;proc_dentry_operations;<span class=Apple-converted-space>&nbsp;</span><br>d_add(dentry, inode);<span class=Apple-converted-space>&nbsp;</span><br>return NULL;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>return ERR_PTR(error);<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>这个函数的参数是struct inode * dir和struct dentry *dentry，它的功能是查找由dentry指定的文件，是否在由dir指定的目录中。<span class=Apple-converted-space>&nbsp;</span><br>我们知道，proc文件系统通过proc_dir_entry结构维护文件信息，并且该结构与相应的inode-&gt;u.generic_ip联系，因此，这个函数首先通过struct inode * dir得到了相应目录文件的proc_dir_entry结构，并使用指针de指向它，然后，开始在该结构的孩子中查找指定的dentry。<span class=Apple-converted-space>&nbsp;</span><br>判断是否找到的条件很简单，就是de-&gt;namelen等于 dentry-&gt;d_name.len，并且dentry-&gt;d_name.name等于de-&gt;name，根据程序流程，如果没有找到，那么将返回-ENOENT错误（使用inode指针作为判断条件），如果找到该文件，那么就根据ino = de-&gt;low_ino（要注意的是，这时候的de已经指向由dentry确定的proc_dir_entry结构了。）调用函数：<span class=Apple-converted-space>&nbsp;</span><br>inode = proc_get_inode(dir-&gt;i_sb, ino, de);<span class=Apple-converted-space>&nbsp;</span><br>这个proc_get_inode的功能很容易猜到，就是从由超级块i_sb确定的文件系统中，得到索引节点号为ino的inode。因此考虑两种情况，第一种情况，这个索引节点已经被读入缓存了，那么直接返回该inode即可。第二种情况是，指定ino的索引节点不在缓存中，那么就需要调用相应的函数，将该索引节点从逻辑文件系统中读入inode中。<span class=Apple-converted-space>&nbsp;</span><br>下面我们就来分析一下proc_get_inode函数，尤其注意上面所说的第二种情况，因为这正是inode和proc_dir_entry建立联系并重定位操作函数集的时机。先看一下源码：<span class=Apple-converted-space>&nbsp;</span><br>struct inode * proc_get_inode(struct super_block * sb, int ino,<span class=Apple-converted-space>&nbsp;</span><br>struct proc_dir_entry * de)<span class=Apple-converted-space>&nbsp;</span><br>{<span class=Apple-converted-space>&nbsp;</span><br>struct inode * inode;<span class=Apple-converted-space>&nbsp;</span><br>/*<span class=Apple-converted-space>&nbsp;</span><br>* Increment the use count so the dir entry can't disappear.<span class=Apple-converted-space>&nbsp;</span><br>*/<span class=Apple-converted-space>&nbsp;</span><br>de_get(de);<span class=Apple-converted-space>&nbsp;</span><br>#if 1<span class=Apple-converted-space>&nbsp;</span><br>/* shouldn't ever happen */<span class=Apple-converted-space>&nbsp;</span><br>if (de &amp;&amp; de-&gt;deleted)<span class=Apple-converted-space>&nbsp;</span><br>printk("proc_iget: using deleted entry %s, count=%d\n", de-&gt;name, atomic_read(&amp;de-&gt;count));<span class=Apple-converted-space>&nbsp;</span><br>#endif<span class=Apple-converted-space>&nbsp;</span><br>inode = iget(sb, ino);<span class=Apple-converted-space>&nbsp;</span><br>if (!inode)<span class=Apple-converted-space>&nbsp;</span><br>goto out_fail;<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;u.generic_ip = (void *) de; /* link the proc_dir_entry to inode */<span class=Apple-converted-space>&nbsp;</span><br>/*<span class=Apple-converted-space>&nbsp;</span><br>* set up other fields in the inode<span class=Apple-converted-space>&nbsp;</span><br>*/<span class=Apple-converted-space>&nbsp;</span><br>if (de) {<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;mode) {<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_mode = de-&gt;mode;<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_uid = de-&gt;uid;<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_gid = de-&gt;gid;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;size)<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_size = de-&gt;size;<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;nlink)<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_nlink = de-&gt;nlink;<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;owner)<span class=Apple-converted-space>&nbsp;</span><br>__MOD_INC_USE_COUNT(de-&gt;owner);<span class=Apple-converted-space>&nbsp;</span><br>if (S_ISBLK(de-&gt;mode)||S_ISCHR(de-&gt;mode)||S_ISFIFO(de-&gt;mode))<span class=Apple-converted-space>&nbsp;</span><br>init_special_inode(inode,de-&gt;mode,kdev_t_to_nr(de-&gt;rdev));<span class=Apple-converted-space>&nbsp;</span><br>else {<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;proc_iops)<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_op = de-&gt;proc_iops;<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;proc_fops)<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_fop = de-&gt;proc_fops;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>out:<span class=Apple-converted-space>&nbsp;</span><br>return inode;<span class=Apple-converted-space>&nbsp;</span><br>out_fail:<span class=Apple-converted-space>&nbsp;</span><br>de_put(de);<span class=Apple-converted-space>&nbsp;</span><br>goto out;<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>我们根据程序流程，分析它的功能：<span class=Apple-converted-space>&nbsp;</span><br>1．使用de_get(de)增加proc_dir_entry结构de的引用计数。<span class=Apple-converted-space>&nbsp;</span><br>2．使用VFS的iget(sb, ino)函数，从sb指定的文件系统中得到节点号为ino的索引节点，并使用指针inode指向它。如果没有得到，则直接跳到标号out_fail，减少de的引用计数后退出。<span class=Apple-converted-space>&nbsp;</span><br>因此我们要了解一下iget，这个函数由VFS提供，可以参考源文件fs/inode.c和头文件include/linux/fs.h，在fs.h头文件中，有如下定义：<span class=Apple-converted-space>&nbsp;</span><br>static inline struct inode *iget(struct super_block *sb, unsigned long ino)<span class=Apple-converted-space>&nbsp;</span><br>{<span class=Apple-converted-space>&nbsp;</span><br>return iget4(sb, ino, NULL, NULL);<span class=Apple-converted-space>&nbsp;</span><br>}<span class=Apple-converted-space>&nbsp;</span><br>因此该函数是由fs/inode.c中的iget4实现的。主要步骤是，首先根据sb和ino得到要查找的索引节点的哈希链表，然后调用find_inode函数在该链表中查找该索引节点。如果找到了，那么就增加该索引节点的引用计数，并将其返回；否则，调用get_new_inode函数，以便从逻辑文件系统中读出该索引节点。<span class=Apple-converted-space>&nbsp;</span><br>而get_new_inode函数也很简单，它分配一个inode结构，并试图重新查找指定的索引节点，如果还是没有找到，那么就给新分配的索引节点加入到哈希链表和使用链表中，并设置一些基本信息，如i_ino，i_sb，i_dev等，并且，将其引用计数i_count初始化为1。然后，调用超级块sb的read_inode函数，来作逻辑文件系统自己特定的工作，但对于proc文件系统来说，read_inode函数基本没有实质性的功能，可参考前文对该函数的分析。最后，返回这个新建的索引节点。<span class=Apple-converted-space>&nbsp;</span><br>3．这时，我们已经得到了指定的inode（或者是从缓存中返回，或者是利用get_new_inode函数刚刚创建），那么就使用语句<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;u.generic_ip = (void *) de;<span class=Apple-converted-space>&nbsp;</span><br>将proc_dir_entry结构de与相应的索引节点链接起来。因此，我们就可以在其他时刻，利用proc文件索引节点的-&gt;u.generic_ip得到相应的proc_dir_entry结构了。<span class=Apple-converted-space>&nbsp;</span><br>对于新创建的inode来说，将其-&gt;u.generic_ip域指向(void *) de没什么问题，因为该域还没有被赋值，但是如果这个inode是从缓存中得到的，那么，说明该域已经指向了一个proc_dir_entry结构，这样直接赋值，会不会引起问题呢？<span class=Apple-converted-space>&nbsp;</span><br>这有两种情况，第一种情况，它指向的proc_dir_entry结构没有发生过变化，那么，由于索引节点是由ino确定的，而且在一个文件系统中，确保了索引节点号ino的唯一性，因此，使用inode-&gt;u.generic_ip = (void *) de语句对其重新进行赋值，不会发生任何问题。<span class=Apple-converted-space>&nbsp;</span><br>另一种情况是在这之前，程序曾调用remove_proc_entry要将该proc_dir_entry结构删除，那么由于它的引用计数count不等于零，因此，该结构不会被释放，而只是打上了删除标记。所以这种情况下，该赋值语句也不会引起问题。<span class=Apple-converted-space>&nbsp;</span><br>我们知道，当inode的i_count变为0的时候，会调用sb的proc_delete_inode函数，这个函数将inode的i_state设置为I_CLEAR，这可以理解为将该inode删除了，并调用de_put，减少并检查proc_dir_entry的引用计数，如果到零，也将其释放。因此我们看到，引用计数的机制使得VFS的inode结构和proc的proc_dir_entry结构能够保持同步，也就是说，对于一个存在于缓存中的的inode，必有一个proc_dir_entry结构存在。<span class=Apple-converted-space>&nbsp;</span><br>4．这时，我们已经得到了inode结构，并且将相应的proc_dir_entry结构de与inode链接在了一起。因此，就可以根据de的信息，对inode的一些域进行填充了。其中最重要的是使用语句：<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;proc_iops)<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_op = de-&gt;proc_iops;<span class=Apple-converted-space>&nbsp;</span><br>if (de-&gt;proc_fops)<span class=Apple-converted-space>&nbsp;</span><br>inode-&gt;i_fop = de-&gt;proc_fops;<span class=Apple-converted-space>&nbsp;</span><br>将inode的操作函数集重定向到proc_dir_entry结构提供的函数集上。这是因为我们可以通过proc_dir_entry结构进行方便的设置和调整，但最终要将文件提交至VFS进行管理。正是在这种思想下，proc文件系统提供提供了一套封装函数，使得我们可以只对proc_dir_entry结构进行操作，而忽略与VFS的inode的联系。<span class=Apple-converted-space>&nbsp;</span><br>5．最后，成功地返回所要的inode结构。<span class=Apple-converted-space>&nbsp;</span><br>（七） 小结<span class=Apple-converted-space>&nbsp;</span><br>至此，已经对proc文件系统进行了一个粗略的分析，从文件系统的注册，到proc_dir_entry结构的管理，以及与VFS的联系等等。下面我们对proc文件系统的整体结构作一个总结。<span class=Apple-converted-space>&nbsp;</span><br>proc文件系统使用VFS接口，注册自己的文件类型，并且通过注册时提供的proc_read_super函数，创建自己的超级块，然后装载vfsmount结构。在proc文件系统内部，则使用proc_dir_entry结构来维护自己的文件树，并且通过目录文件的lookup函数，将proc_dir_entry结构与VFS的inode结构建立联系。<span class=Apple-converted-space>&nbsp;</span><br><br><br><strong>本文来自ChinaUnix博客，如果查看原文请点：</strong><a style="COLOR: rgb(0,68,182); TEXT-DECORATION: none" href="http://blog.chinaunix.net/u2/74524/showart_1129842.html" target=_blank>http://blog.chinaunix.net/u2/74524/showart_1129842.html</a></span></span>
<img src ="http://www.cppblog.com/momoxiao/aggbug/118521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-23 06:10 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/23/118521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>『转』文件结构体struct file(Linux 2.6.23内核)</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/17/118121.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Thu, 17 Jun 2010 15:14:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/17/118121.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/118121.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/17/118121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/118121.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/118121.html</trackback:ping><description><![CDATA[<span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct file结构体定义在/linux/include/linux/fs.h(Linux 2.6.11内核)中，其原型是：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct file {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/*</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;* fu_list becomes invalid after file_free is called and queued via</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;* fu_rcuhead for RCU freeing</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;*/</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;union {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; struct list_head&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;fu_list;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; struct rcu_head&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;fu_rcuhead;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;} f_u;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct path&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; f_path;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#define f_dentry&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_path.dentry</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#define f_vfsmnt&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_path.mnt</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;const struct file_operations&nbsp; &nbsp; *f_op;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;atomic_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; f_count;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned int&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_flags;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;mode_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_mode;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;loff_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_pos;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct fown_struct&nbsp; &nbsp;&nbsp; &nbsp;f_owner;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned int&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_uid, f_gid;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct file_ra_state&nbsp; &nbsp; f_ra;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_version;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#ifdef CONFIG_SECURITY</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;void&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;*f_security;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#endif</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* needed for tty driver, and maybe others */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;void&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;*private_data;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#ifdef CONFIG_EPOLL</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* Used by fs/eventpoll.c to link all the hooks to this file */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct list_head&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_ep_links;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;spinlock_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_ep_lock;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#endif /* #ifdef CONFIG_EPOLL */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct address_space&nbsp; &nbsp; *f_mapping;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">};</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">文件结构体代表一个打开的文件，系统中的每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建，并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后，内核释放这个数据结构。在内核创建和驱动源码中，struct file的指针通常被命名为file或filp。一下是对结构中的每个数据成员的解释：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">一、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">union {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp; struct list_head fu_list;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp; struct rcu_head rcuhead;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">}f_u;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">其中的struct list_head定义在 linux/include/linux/list.h中，原型为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct list_head {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct list_head *next, *prev;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">};</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">用于通用文件对象链表的指针。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct rcu_head定义在linux/include/linux/rcupdate.h中，其原型为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">/**</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">* struct rcu_head - callback structure for use with RCU</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">* @next: next update requests in a list</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">* @func: actual update function to call after the grace period.</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">*/</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct rcu_head {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct rcu_head *next;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;void (*func)(struct rcu_head *head);</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">};</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">RCU(Read-Copy Update)是Linux 2.6内核中新的锁机制，具体在这里有介绍：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">http://www.ibm.com/developerworks/cn/linux/l-rcu/</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">二、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct path&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; f_path;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">被定义在linux/include/linux/namei.h中，其原型为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct path {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct vfsmount *mnt;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct dentry *dentry;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">};</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">在早些版本的内核中并没有此结构，而是直接将path的两个数据成员作为struct file的数据成员，</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct vfsmount *mnt的作用是指出该文件的已安装的文件系统，</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct dentry *dentry是与文件相关的目录项对象。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">三、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">const struct file_operations&nbsp; &nbsp; *f_op;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">被定义在linux/include/linux/fs.h中，其中包含着与文件关联的操作，如:</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">loff_t (*llseek) (struct file *, loff_t, int);</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">等。当打开一个文件时，内核就创建一个与该文件相关联的struct file结构，其中的*f_op就指向的是</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">具体对该文件进行操作的函数。例如用户调用系统调用read来读取该文件的内容时，那么系统调用read最终会陷入内核调用sys_read函数，而sys_read最终会调用于该文件关联的struct file结构中的f_op-&gt;read函数对文件内容进行读取。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">四、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">atomic_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; f_count;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">atomic_t被定义为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">typedef struct { volatile int counter; } atomic_t;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">volatile修饰字段告诉gcc不要对该类型的数据做优化处理，对它的访问都是对内存的访问，而不是对寄存器的访问。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">本质是int类型，之所以这样写是让编译器对基于该类型变量的操作进行严格的类型检查。此处f_count的作用是记录对文件对象的引用计数，也即当前有多少个进程在使用该文件。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">五、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">unsigned int&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_flags;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">当打开文件时指定的标志，对应系统调用open的int flags参数。驱动程序为了支持非阻塞型操作需要检查这个标志。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">六、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">mode_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_mode;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">对文件的读写模式，对应系统调用open的mod_t mode参数。如果驱动程序需要这个值，可以直接读取这个字段。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">mod_t被定义为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">typedef unsigned int __kernel_mode_t;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">typedef __kernel_mode_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;mode_t;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">七、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">loff_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_pos;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">当前的文件指针位置，即文件的读写位置。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">loff_t被定义为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">typedef long long&nbsp; &nbsp;&nbsp; &nbsp; __kernel_loff_t;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">typedef __kernel_loff_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;loff_t;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">八、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct fown_struct&nbsp; &nbsp;&nbsp; &nbsp;f_owner;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct fown_struct在linux/include/linux/fs.h被定义，原型为:</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct fown_struct {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;rwlock_t lock;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* protects pid, uid, euid fields */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct pid *pid;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* pid or -pgrp where SIGIO should be sent */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;enum pid_type pid_type; /* Kind of process group SIGIO should be sent to */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;uid_t uid, euid;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* uid/euid of process setting the owner */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;int signum;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* posix.1b rt signal to be delivered on IO */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">};</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">该结构的作用是通过信号进行I/O时间通知的数据。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">九、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">unsigned int&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;f_uid, f_gid;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">标识文件的所有者id，所有者所在组的id.</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">十、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct file_ra_state&nbsp; &nbsp; f_ra;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct file_ra_state结构被定义在/linux/include/linux/fs.h中，原型为：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct file_ra_state {</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;pgoff_t start;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/* where readahead started */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long size;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; /* # of readahead pages */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long async_size;&nbsp; &nbsp;&nbsp; &nbsp; /* do asynchronous readahead when</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&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; there are only # of pages ahead */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&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;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long ra_pages;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/* Maximum readahead window */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long mmap_hit;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;/* Cache hit stat for mmap accesses */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long mmap_miss;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* Cache miss stat for mmap accesses */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned long prev_index;&nbsp; &nbsp;&nbsp; &nbsp; /* Cache last read() position */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;unsigned int prev_offset;&nbsp; &nbsp;&nbsp; &nbsp; /* Offset where last read() ended in a page */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">};</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">文件预读状态，文件预读算法使用的主要数据结构，当打开一个文件时，f_ra中出了perv_page(默认为－1)和ra_apges(对该文件允许的最大预读量)这两个字段外，其他的所有西端都置为0。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">十一、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">unsigned long&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_version;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">记录文件的版本号，每次使用后都自动递增。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">十二、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#ifdef CONFIG_SECURITY</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;void&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;*f_security;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#endif</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">此处我的理解是如果在编译内核时配置了安全措施，那么struct file结构中就会有void *f_security数据项，用来描述安全措施或者是记录与安全有关的信息。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">十三、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">void *private_data;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">系统在调用驱动程序的open方法前将这个指针置为NULL。驱动程序可以将这个字段用于任意目的，也可以忽略这个字段。驱动程序可以用这个字段指向已分配的数据，但是一定要在内核释放file结构前的release方法中清除它。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">十四、</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#ifdef CONFIG_EPOLL</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* Used by fs/eventpoll.c to link all the hooks to this file */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;struct list_head&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_ep_links;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;spinlock_t&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;f_ep_lock;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">#endif /* #ifdef CONFIG_EPOLL */</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">被用在fs/eventpoll.c来链接所有钩到这个文件上。其中f_ep_links是文件的事件轮询等待者链表的头，f_ep_lock是保护f_ep_links链表的自旋锁。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">十五、struct address_space&nbsp; &nbsp; *f_mapping;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">struct address_space被定义在/linux/include/linux/fs.h中，此处是指向文件地址空间的指针。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;在驱动开发中，文件读/写模式mode、标志f_flags都是设备驱动关心的内容，而私有数据指针private_data在折本驱动中被广泛使用，大多被指向设备驱动自定义用于描述设备的结构体。</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">驱动程序中常用如下类似的代码来检测用户打开文件的读写方式：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">if (file-&gt;f_mode &amp; FMODE_WRITE) //用户要求可写</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;{</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;}</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;if (file-&gt;f_mode &amp; FMODE_READ) //用户要求可读</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;{</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;}</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">下面的代码可用于判断以阻塞还是非阻塞方式打开设备文件：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;if (file-&gt;f_flags &amp; O_NONBLOCK) //非阻塞</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;pr_debug("open:non-blocking\n");</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp;&nbsp;else //阻塞</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">&nbsp; &nbsp;&nbsp; &nbsp;pr_debug("open:blocking\n");</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">参考：</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">Linux设备驱动开发详解</span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; "><br></span><span  style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 20px; ">深入理解linux内核</span>
<img src ="http://www.cppblog.com/momoxiao/aggbug/118121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-17 23:14 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/17/118121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>warning:  Clock skew detected.  Your build may be incomplete.</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/15/117967.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 15 Jun 2010 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/15/117967.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/117967.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/15/117967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/117967.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/117967.html</trackback:ping><description><![CDATA[时钟检测出错 <br>怎么检测的？ //TODO<br><br>&#8220;在系统启动时，Linux操作系统将时间从CMOS中读到系统时间变量中，以后修改时间通过修改系统时间实现。为了保持系统时间与CMOS时间的一致性，Linux每隔一段时间会将系统时间写入CMOS。由于该同步是每隔一段时间（大约是11分钟）进行的，在我们执行date
-s后，如果马上重起机器，修改时间就有可能没有被写入CMOS。如果要确保修改生效可以执行命令clock -w。&#8220;<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">[root@colorfulgreen&nbsp;rkit]#&nbsp;date&nbsp;<br>Thu&nbsp;Jun&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">50</span><span style="color: #000000;">:</span><span style="color: #000000;">30</span><span style="color: #000000;">&nbsp;CST&nbsp;</span><span style="color: #000000;">2010</span><span style="color: #000000;"><br>[root@colorfulgreen&nbsp;rkit]#&nbsp;date&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">s&nbsp;</span><span style="color: #000000;">6</span><span style="color: #000000;">/</span><span style="color: #000000;">15</span><span style="color: #000000;">/</span><span style="color: #000000;">2010</span><span style="color: #000000;">&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">修改时间－指由Linux操作系统维护的时间</span><span style="color: #008000;"><br></span><span style="color: #000000;">Tue&nbsp;Jun&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">00</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;">&nbsp;CST&nbsp;</span><span style="color: #000000;">2010</span><span style="color: #000000;"><br>[root@colorfulgreen&nbsp;rkit]#&nbsp;date&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">s&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">:</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;"><br>Tue&nbsp;Jun&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">:</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">00</span><span style="color: #000000;">&nbsp;CST&nbsp;</span><span style="color: #000000;">2010</span><span style="color: #000000;"><br>[root@colorfulgreen&nbsp;rkit]#&nbsp;date<br>Tue&nbsp;Jun&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">:</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">04</span><span style="color: #000000;">&nbsp;CST&nbsp;</span><span style="color: #000000;">2010</span><span style="color: #000000;"><br>[root@colorfulgreen&nbsp;rkit]#&nbsp;clock&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">w&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">强制把系统时间写入CMOS</span><span style="color: #008000;"><br></span><span style="color: #000000;">[root@colorfulgreen&nbsp;rkit]#&nbsp;date<br>Tue&nbsp;Jun&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">:</span><span style="color: #000000;">20</span><span style="color: #000000;">:</span><span style="color: #000000;">20</span><span style="color: #000000;">&nbsp;CST&nbsp;</span><span style="color: #000000;">2010</span><span style="color: #000000;"><br>[root@colorfulgreen&nbsp;rkit]#&nbsp;</span></div>
<br><img src ="http://www.cppblog.com/momoxiao/aggbug/117967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-15 15:33 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/15/117967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】SELinux targeted policy relabel is required.</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/13/117767.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Sun, 13 Jun 2010 01:48:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/13/117767.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/117767.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/13/117767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/117767.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/117767.html</trackback:ping><description><![CDATA[<a href="http://www.centos.org/modules/newbb/viewtopic.php?topic_id=15960">http://www.centos.org/modules/newbb/viewtopic.php?topic_id=15960</a>
<img src ="http://www.cppblog.com/momoxiao/aggbug/117767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-13 09:48 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/13/117767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 登录密码忘记 &amp; root密码设置</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/06/117253.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Sat, 05 Jun 2010 23:53:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/06/117253.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/117253.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/06/117253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/117253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/117253.html</trackback:ping><description><![CDATA[<p>刚装好Ubuntu&nbsp;8.04可以刚才设置的密码忘记了<br>用了以下方法恢复了系统的登陆密码：<br>1、重新启动，按ESC键进入Boot Menu，选择recovery mode（一般是第二个选项）。<br>2、在#号提示符下用cat /etc/shadow，查看刚才设置的用户名<br>3、输入passwd "用户名"（引号是必须的）。<br>4、输入新的密码.<br>5、重新启动，用新密码登录。</p><p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p><p>首先设置root密码，利用现有管理员帐户登陆Ubuntu，在终端执行命令：sudo passwd root，接着输入密码和root密码，重复密码。这样就有了可用的root用户。</p><img src ="http://www.cppblog.com/momoxiao/aggbug/117253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-06 07:53 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/06/117253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ps lkm</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/01/116924.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 01 Jun 2010 12:23:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/01/116924.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/116924.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/01/116924.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/116924.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/116924.html</trackback:ping><description><![CDATA[pslkm.c<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">module.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">init.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">list.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">sched.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;METHOD&nbsp;1</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;list_init(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;task_struct&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">task,&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;list_head&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pos;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;count;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">method;<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;task&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;task&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">init_task;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">switch</span><span style="color: #000000;">(METHOD){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">list_for_each</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">for_each_process</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">case</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">list_for_each_entry</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">The&nbsp;method&nbsp;is&nbsp;%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,method);<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT</span><span style="color: #000000;">"</span><span style="color: #000000;">PID\tCOMM\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(METHOD&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_for_each(pos,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">task</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">tasks){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;list_entry(pos,</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;task_struct,tasks);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\t%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(METHOD&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for_each_process(task){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\t%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,task</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,task</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(METHOD&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">3</span><span style="color: #000000;">){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_for_each_entry(p,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">task</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">tasks,tasks){<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\t%s\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">系统当前共有&nbsp;%d&nbsp;个进程!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,count);<br><br><br><br>&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><br><br>}<br><br><br><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;list_exit(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br><br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_ALERT&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">GOOD&nbsp;BYE!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>}<br><br><br><br>module_init(list_init);<br><br>module_exit(list_exit);<br><br><br><br>MODULE_AUTHOR(</span><span style="color: #000000;">"</span><span style="color: #000000;">...</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br><br>Makefile:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">obj</span><span style="color: #000000;">-</span><span style="color: #000000;">m&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pslkm.o<br><br>KERNELDIR&nbsp;</span><span style="color: #000000;">?=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">modules</span><span style="color: #000000;">/</span><span style="color: #000000;">$(shell&nbsp;uname&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r)</span><span style="color: #000000;">/</span><span style="color: #000000;">build<br><br>PWD&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;$(shell&nbsp;pwd)<br><br>all:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;make&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">C&nbsp;$(KERNELDIR)&nbsp;M</span><span style="color: #000000;">=</span><span style="color: #000000;">$(PWD)&nbsp;modules<br><br>clean:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;make&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">C&nbsp;$(KERNELDIR)&nbsp;M</span><span style="color: #000000;">=</span><span style="color: #000000;">$(PWD)&nbsp;clean</span></div>
<br><br><img src ="http://www.cppblog.com/momoxiao/aggbug/116924.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-01 20:23 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/01/116924.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>param</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/01/116923.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 01 Jun 2010 12:21:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/01/116923.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/116923.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/01/116923.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/116923.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/116923.html</trackback:ping><description><![CDATA[para.c<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">module.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">kernel.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">init.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br><br></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;module_int&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">100</span><span style="color: #000000;">;<br><br><br>module_param(module_int,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,S_IRUSR);<br><br><br><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__init&nbsp;para_init(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">My&nbsp;linux&nbsp;kernel&nbsp;module\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">module_int&nbsp;=&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,module_int);<br>&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>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__exit&nbsp;para_exit(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">My&nbsp;linux&nbsp;kernel&nbsp;module&nbsp;was&nbsp;removed.\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}<br><br>module_init(para_init);<br>module_exit(para_exit);<br><br>MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br><br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">向内核注册模块所提供的新功能<br></span><span style="color: #008000;">//</span><span style="color: #008000;">module_init(lkp_init);&nbsp;<br></span><span style="color: #008000;">//</span><span style="color: #008000;">注销由模块提供的所有功能<br></span><span style="color: #008000;">//</span><span style="color: #008000;">module_exit(lkp_cleanup);<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">MODULE_LICENSE("GPL");</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span></div>
<br><br>Makefile:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">KERNELBUILD&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">modules</span><span style="color: #000000;">/</span><span style="color: #000000;">$(shell&nbsp;uname&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r)</span><span style="color: #000000;">/</span><span style="color: #000000;">build<br><br><br><br>obj</span><span style="color: #000000;">-</span><span style="color: #000000;">m&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;para.o<br><br><br><br></span><span style="color: #0000ff;">default</span><span style="color: #000000;">:&nbsp;para<br><br><br><br>para:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;make&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">C&nbsp;$(KERNELBUILD)&nbsp;M</span><span style="color: #000000;">=</span><span style="color: #000000;">$(shell&nbsp;pwd)&nbsp;modules<br><br><br><br>clean:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.ko&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">.o&nbsp;hide<br><br>&nbsp;&nbsp;&nbsp;&nbsp;rm&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">f&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">mod</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;Module</span><span style="color: #000000;">*</span></div>
<br><br><img src ="http://www.cppblog.com/momoxiao/aggbug/116923.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-01 20:21 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/01/116923.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>malloc</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/01/116922.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 01 Jun 2010 12:20:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/01/116922.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/116922.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/01/116922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/116922.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/116922.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">//malloc.c<br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">module.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">slab.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">vmalloc.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">pagemem;<br>unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">kmallocmem;<br>unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">vmallocmem;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__init&nbsp;mem_module_init(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br></span><span style="color: #008000;">//</span><span style="color: #008000;">最好每次内存申请都检查申请是否成功<br></span><span style="color: #008000;">//</span><span style="color: #008000;">下面这段仅仅作为演示的代码没有检查<br></span><span style="color: #008000;">//</span><span style="color: #008000;">pagemem&nbsp;=&nbsp;(unsigned&nbsp;char*)get_free_page(0);<br></span><span style="color: #008000;">//</span><span style="color: #008000;">printk("&lt;1&gt;pagemem&nbsp;addr=%x",&nbsp;pagemem);</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>kmallocmem&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)kmalloc(</span><span style="color: #000000;">100</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br>printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;1&gt;kmallocmem&nbsp;addr=%x</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;kmallocmem);<br><br>vmallocmem&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(unsigned&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)vmalloc(</span><span style="color: #000000;">1000000</span><span style="color: #000000;">);<br>printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;1&gt;vmallocmem&nbsp;addr=%x</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;vmallocmem);<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__exit&nbsp;mem_module_exit(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)<br>{<br></span><span style="color: #008000;">//</span><span style="color: #008000;">free_page(pagemem);</span><span style="color: #008000;"><br></span><span style="color: #000000;">kfree(kmallocmem);<br>vfree(vmallocmem);<br>}<br><br>module_init(mem_module_init);<br>module_exit(mem_module_exit);</span></div>
<br>Makefile:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">obj</span><span style="color: #000000;">-</span><span style="color: #000000;">m&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;malloc.o<br>KDIR&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">modules</span><span style="color: #000000;">/</span><span style="color: #000000;">$(shell&nbsp;uname&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r)</span><span style="color: #000000;">/</span><span style="color: #000000;">build<br>PWD&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;$(shell&nbsp;pwd)<br><br></span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">C&nbsp;$(KDIR)&nbsp;SUBDIRS</span><span style="color: #000000;">=</span><span style="color: #000000;">$(PWD)&nbsp;modules</span></div>
<br><br><img src ="http://www.cppblog.com/momoxiao/aggbug/116922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-01 20:20 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/01/116922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>free pages</title><link>http://www.cppblog.com/momoxiao/archive/2010/06/01/116921.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Tue, 01 Jun 2010 12:18:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/06/01/116921.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/116921.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/06/01/116921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/116921.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/116921.html</trackback:ping><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">module.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">kernel.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">gfp.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">linux</span><span style="color: #000000;">/</span><span style="color: #000000;">mm.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;__init&nbsp;freepage_init()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;page;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;__get_free_pages(GFP_KERNEL,</span><span style="color: #000000;">3</span><span style="color: #000000;">);&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">8&nbsp;page</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #000000;">!</span><span style="color: #000000;">page){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">no&nbsp;enough&nbsp;space</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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;">ENOMEM;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;1&gt;the&nbsp;vaddr&nbsp;of&nbsp;the&nbsp;first&nbsp;page&nbsp;is&nbsp;&lt;%lx&gt;..</span><span style="color: #000000;">"</span><span style="color: #000000;">,page);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;free_pages(page,</span><span style="color: #000000;">3</span><span style="color: #000000;">);<br><br>&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>}<br><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;__exit&nbsp;freepage_exit()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>}<br><br>module_init(freepage_init);<br>module_exit(freepage_exit);<br><br>MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span></div>
<br>Makefile:<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">obj</span><span style="color: #000000;">-</span><span style="color: #000000;">m&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;freepage.o<br>KDIR&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">lib</span><span style="color: #000000;">/</span><span style="color: #000000;">modules</span><span style="color: #000000;">/</span><span style="color: #000000;">$(shell&nbsp;uname&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">r)</span><span style="color: #000000;">/</span><span style="color: #000000;">build<br>PWD&nbsp;:</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;$(shell&nbsp;pwd)<br><br></span><span style="color: #0000ff;">default</span><span style="color: #000000;">:<br>&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">C&nbsp;$(KDIR)&nbsp;SUBDIRS</span><span style="color: #000000;">=</span><span style="color: #000000;">$(PWD)&nbsp;modules</span></div>
<br><br><img src ="http://www.cppblog.com/momoxiao/aggbug/116921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-06-01 20:18 <a href="http://www.cppblog.com/momoxiao/archive/2010/06/01/116921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】使用 /sys 文件系统访问 Linux 内核</title><link>http://www.cppblog.com/momoxiao/archive/2010/05/31/116813.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Mon, 31 May 2010 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/05/31/116813.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/116813.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/05/31/116813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/116813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/116813.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: sysfs 虚拟文件系统提供了一种比 proc 更为理想的访问内核数据的途径级别： 中级程 任全&nbsp;(crquan@gmail.com), Linux 内核开发者、存储开发工程师, UIT（创新科存储技术有限公司）2009 年 1 月 08 日sysfs 是 Linux 内核中设计较新的一种虚拟的基于内存的文件系统，它的作用与 proc 有些类似，但除了与 proc 相同的具有查看和设定内...&nbsp;&nbsp;<a href='http://www.cppblog.com/momoxiao/archive/2010/05/31/116813.html'>阅读全文</a><img src ="http://www.cppblog.com/momoxiao/aggbug/116813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-05-31 15:33 <a href="http://www.cppblog.com/momoxiao/archive/2010/05/31/116813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zz]Ubuntu hosts</title><link>http://www.cppblog.com/momoxiao/archive/2010/05/26/116355.html</link><dc:creator>小默</dc:creator><author>小默</author><pubDate>Wed, 26 May 2010 01:35:00 GMT</pubDate><guid>http://www.cppblog.com/momoxiao/archive/2010/05/26/116355.html</guid><wfw:comment>http://www.cppblog.com/momoxiao/comments/116355.html</wfw:comment><comments>http://www.cppblog.com/momoxiao/archive/2010/05/26/116355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/momoxiao/comments/commentRss/116355.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/momoxiao/services/trackbacks/116355.html</trackback:ping><description><![CDATA[<meta http-equiv="content-type" content="text/html; charset=utf-8"><span  style="color: rgb(51, 51, 51); font-family: arial, helvetica, sans-serif; font-size: 13px; line-height: 22px; ">Ubuntu系统的Hosts只需修改/etc/hosts文件，在目录中还有一个hosts.conf文件，刚开始还以为只需要修改这个就可以了，结果发现是需要修改hosts。修改完之后要重启网络。<br>具体过程如下：<br>1、修改hosts<br>sudo gedit /etc/hosts<br>2、添加解析记录（ . ）<br>完整案例：127.0.0.1 localhost.localdomain localhost<br>简洁记录：127.0.0.1 localhost<br>3、保存后重启网络<br>sudo /etc/init.d/networking restart</span>
<img src ="http://www.cppblog.com/momoxiao/aggbug/116355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/momoxiao/" target="_blank">小默</a> 2010-05-26 09:35 <a href="http://www.cppblog.com/momoxiao/archive/2010/05/26/116355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>