﻿<?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++博客-cztchoice</title><link>http://www.cppblog.com/cztchoice/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 10:08:28 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 10:08:28 GMT</pubDate><ttl>60</ttl><item><title>我的vimium--chrome的一款插件的配置</title><link>http://www.cppblog.com/cztchoice/archive/2010/05/21/116008.html</link><dc:creator>cztchoice</dc:creator><author>cztchoice</author><pubDate>Fri, 21 May 2010 02:54:00 GMT</pubDate><guid>http://www.cppblog.com/cztchoice/archive/2010/05/21/116008.html</guid><wfw:comment>http://www.cppblog.com/cztchoice/comments/116008.html</wfw:comment><comments>http://www.cppblog.com/cztchoice/archive/2010/05/21/116008.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cztchoice/comments/commentRss/116008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cztchoice/services/trackbacks/116008.html</trackback:ping><description><![CDATA[<table style="WIDTH: 320px; BORDER-COLLAPSE: collapse" border=1 cellSpacing=0 cellPadding=3>
    <tbody>
        <tr>
            <td>unmap h<br>unmap l<br>map h previousTab<br>map l nextTab<br>map g scrollToTop<br>unmap &lt;c-d&gt;<br>unmap &lt;c-f&gt;<br>unmap &lt;c-e&gt;<br>unmap &lt;c-y&gt;<br>unmap &lt;c-u&gt;<br>unmap J<br>unmap K<br>map J scrollPageDown<br>map K scrollPageUp</td>
        </tr>
    </tbody>
</table>
<img src ="http://www.cppblog.com/cztchoice/aggbug/116008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cztchoice/" target="_blank">cztchoice</a> 2010-05-21 10:54 <a href="http://www.cppblog.com/cztchoice/archive/2010/05/21/116008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>刚写的一个unix作业，关于内核编程的</title><link>http://www.cppblog.com/cztchoice/archive/2010/01/08/105181.html</link><dc:creator>cztchoice</dc:creator><author>cztchoice</author><pubDate>Fri, 08 Jan 2010 10:13:00 GMT</pubDate><guid>http://www.cppblog.com/cztchoice/archive/2010/01/08/105181.html</guid><wfw:comment>http://www.cppblog.com/cztchoice/comments/105181.html</wfw:comment><comments>http://www.cppblog.com/cztchoice/archive/2010/01/08/105181.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cztchoice/comments/commentRss/105181.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cztchoice/services/trackbacks/105181.html</trackback:ping><description><![CDATA[作业题目：<br>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-weight: bold; font-size: 14pt; font-family: '宋体';"><font face="宋体">内核模块编程练习</font></span><span style="font-weight: bold; font-size: 14pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';">设计两个内核模块，它们分别完成以下工作：</span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-left: 18pt; text-indent: -18pt; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: 'Times New Roman';">1）&nbsp;</span><span style="font-size: 10.5pt; font-family: '宋体';">设计一个模块，该模块的功能是列出系统中所有内核进程的程序名、<font face="Times New Roman">PID</font><font face="宋体">号和进程的状态。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-left: 18pt; text-indent: -18pt; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: 'Times New Roman';">2）&nbsp;</span><span style="font-size: 10.5pt; font-family: '宋体';">设计一个带有参数的内核模块，其参数为某个进程的<font face="Times New Roman">PID</font><font face="宋体">号；该模块的功能是列出该进程的家族信息，包括父进程、兄弟进程和子进程的程序名、</font><font face="Times New Roman">PID</font><font face="宋体">号。</font></span><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<p class="p0" style="margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10.5pt; font-family: '宋体';"><o:p></o:p></span></p>
<span style="font-size: 10.5pt; font-family: '宋体';"></span><span style="font-size: 10.5pt; font-family: '宋体';"></span>作业1的答案：<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: #008080;">&nbsp;1</span>&nbsp;<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;">init.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义在init.h</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><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></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<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;">sched.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<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;">list.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;name_init(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化函数，注册和申请资源。返回0表示初始化成功；其他值表示失败</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">{<br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">My&nbsp;name&nbsp;is&nbsp;Liu&nbsp;Xu\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">&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;">p,</span><span style="color: #000000;">*</span><span style="color: #000000;">task1;<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&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;">ptr;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;for_each_process(p)<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">\nProcess&nbsp;info:\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">comm=%s,pid=%d,state=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm,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;">state);<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task1</span><span style="color: #000000;">=</span><span style="color: #000000;">list_entry(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">children,</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;task_struct,children);<br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">\nChildren&nbsp;info:\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_for_each(ptr,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">(p</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">children)){<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task1</span><span style="color: #000000;">=</span><span style="color: #000000;">list_entry(ptr,</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;task_struct,sibling);<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">child:comm=%s,pid=%d,state=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm,task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">state);<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #000000;">&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;">;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;name_exit(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;退出的函数，注销和释放资源</span><span style="color: #008000;"><br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">{<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">Goodbye!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">module_init(name_init);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">标记的name_init函数在模块加载时调用</span><span style="color: #008000;"><br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">module_exit(name_exit);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">标记的name_exit函数在卸载模块时调用<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #008000;"></span></div>
<br>作业2的答案：<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: #008080;">&nbsp;1</span>&nbsp;<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;">init.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">定义在init.h</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #008000;"></span><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></span><span style="color: #008080;">&nbsp;3</span>&nbsp;<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;">sched.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;4</span>&nbsp;<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;">list.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #000000;">MODULE_LICENSE(</span><span style="color: #000000;">"</span><span style="color: #000000;">GPL</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;pid</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br></span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #000000;">module_param(pid,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">,S_IRUGO);</span><span style="color: #008000;">//</span><span style="color: #008000;">给模块传递参数</span><span style="color: #008000;"><br></span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;"><br></span><span style="color: #008080;">10</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;name_init(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">初始化函数，注册和申请资源。返回0表示初始化成功；其他值表示失败</span><span style="color: #008000;"><br></span><span style="color: #008080;">11</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">{<br></span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">&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;">task1,</span><span style="color: #000000;">*</span><span style="color: #000000;">task2;<br></span><span style="color: #008080;">13</span>&nbsp;<span style="color: #000000;">&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;">ptr;<br></span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">15</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">My&nbsp;name&nbsp;is&nbsp;Liu&nbsp;Xu\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">find_task_by_pid&nbsp;和&nbsp;find_task_by_vpid在2.6.30版后内核都没有被声明为extern<br></span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">find_get_pid是获得pid_t对应的pid结构指针，以给pid_task调用，在内核版本号为2.6.31-17-generic下测试通过</span><span style="color: #008000;"><br></span><span style="color: #008080;">18</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;task1</span><span style="color: #000000;">=</span><span style="color: #000000;">pid_task(find_get_pid(pid),PIDTYPE_PID);&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">19</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(task1){<br></span><span style="color: #008080;">20</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">The&nbsp;wanted&nbsp;process&nbsp;info:\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">21</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">##Wanted:comm=%s,pid=%d,state=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm,task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">state);<br></span><span style="color: #008080;">22</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task2</span><span style="color: #000000;">=</span><span style="color: #000000;">task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">parent;<br></span><span style="color: #008080;">23</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">##His&nbsp;Parent:comm=%s,pid=%d,state=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">state);<br></span><span style="color: #008080;">24</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/*</span><span style="color: #008000;">list_for_each(ptr,&amp;task1-&gt;children){<br></span><span style="color: #008080;">25</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task2=list_entry(ptr,struct&nbsp;task_struct,tasks);//ptr是task1的child，是task2的sibiling，双链表<br></span><span style="color: #008080;">26</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk("##His&nbsp;child:comm=%s,pid=%d,state=%ld\n",task2-&gt;comm,task2-&gt;pid,task2-&gt;state);<br></span><span style="color: #008080;">27</span>&nbsp;<span style="color: #008000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br></span><span style="color: #008080;">28</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">searching&nbsp;the&nbsp;children</span><span style="color: #008000;"><br></span><span style="color: #008080;">29</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_for_each_entry(task2,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">children,&nbsp;sibling)&nbsp;{<br></span><span style="color: #008080;">30</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">##His&nbsp;child:comm=%s,pid=%d,state=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">state);<br></span><span style="color: #008080;">31</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">32</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">searching&nbsp;the&nbsp;siblings</span><span style="color: #008000;"><br></span><span style="color: #008080;">33</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_for_each_entry(task2,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">task1</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">real_parent</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">children,&nbsp;sibling)&nbsp;{<br></span><span style="color: #008080;">34</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">##His&nbsp;siblings:comm=%s,pid=%d,state=%ld\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">comm,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">pid,task2</span><span style="color: #000000;">-&gt;</span><span style="color: #000000;">state);<br></span><span style="color: #008080;">35</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="color: #008080;">36</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">37</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br></span><span style="color: #008080;">38</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">process&nbsp;%d&nbsp;does&nbsp;not&nbsp;exist!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,pid);<br></span><span style="color: #008080;">39</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">40</span>&nbsp;<span style="color: #000000;">&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;">;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="color: #008080;">41</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">42</span>&nbsp;<span style="color: #000000;"></span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;name_exit(</span><span style="color: #0000ff;">void</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;退出的函数，注销和释放资源</span><span style="color: #008000;"><br></span><span style="color: #008080;">43</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">{<br></span><span style="color: #008080;">44</span>&nbsp;<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printk(</span><span style="color: #000000;">"</span><span style="color: #000000;">Goodbye!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br></span><span style="color: #008080;">45</span>&nbsp;<span style="color: #000000;">}<br></span><span style="color: #008080;">46</span>&nbsp;<span style="color: #000000;"><br></span><span style="color: #008080;">47</span>&nbsp;<span style="color: #000000;">module_init(name_init);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">标记的name_init函数在模块加载时调用</span><span style="color: #008000;"><br></span><span style="color: #008080;">48</span>&nbsp;<span style="color: #008000;"></span><span style="color: #000000;">module_exit(name_exit);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">标记的name_exit函数在卸载模块时调用<br></span><span style="color: #008080;">49</span>&nbsp;<span style="color: #008000;"></span></div>
作业2因为在linux内核版本2.6.30以后，没有把find_task_by_vpid声明为extern，所以不能当作API函数调用，我在网上搜了好多方法才最终找到解决方案的。。<br>第18行的那句话，在2.6.24版本以前的内核，应该写成<br><span style="color: #000000;">task1</span><span style="color: #000000;">=find_task_by_pid(pid);<br><br>在2.6.30版本以前内核应该写成<br><br>task1=find_task_by_vpid(pid);<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;">ifneq&nbsp;($(KERNELRELEASE),)<br>&nbsp;&nbsp;&nbsp;&nbsp;obj</span><span style="color: #000000;">-</span><span style="color: #000000;">m:</span><span style="color: #000000;">=</span><span style="color: #000000;">name.o<br></span><span style="color: #0000ff;">else</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;KDIR:</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>&nbsp;&nbsp;&nbsp;&nbsp;PWD:</span><span style="color: #000000;">=</span><span style="color: #000000;">$(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;M</span><span style="color: #000000;">=</span><span style="color: #000000;">$(PWD)&nbsp;modules<br>clean:<br>&nbsp;&nbsp;&nbsp;&nbsp;$(MAKE)&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">C&nbsp;$(KDIR)&nbsp;M</span><span style="color: #000000;">=</span><span style="color: #000000;">$(PWD)&nbsp;clean<br><br>endif<br></span></div>
<br></span><span style="color: #008000;"></span><br> <img src ="http://www.cppblog.com/cztchoice/aggbug/105181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cztchoice/" target="_blank">cztchoice</a> 2010-01-08 18:13 <a href="http://www.cppblog.com/cztchoice/archive/2010/01/08/105181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>