﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Calvin's Tech Space-随笔分类-Linux</title><link>http://www.blogjava.net/lihao336/category/43733.html</link><description>成于坚忍，毁于浮躁</description><language>zh-cn</language><lastBuildDate>Wed, 14 Dec 2011 00:27:46 GMT</lastBuildDate><pubDate>Wed, 14 Dec 2011 00:27:46 GMT</pubDate><ttl>60</ttl><item><title>[转]unix/linux中的dup()系统调用</title><link>http://www.blogjava.net/lihao336/archive/2011/12/13/366231.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Tue, 13 Dec 2011 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/12/13/366231.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/366231.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/12/13/366231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/366231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/366231.html</trackback:ping><description><![CDATA[   在linux纷繁复杂的内核代码中，sys_dup()的代码也许称得上是最简单的之一了，但是就是这么一个简单的系统调用，却成就了unix/linux系统最著名的一个特性：输入/输出重定向。<br />    sys_dup()的主要工作就是用来“复制”一个打开的文件号，使两个文件号都指向同一个文件。既然说简单，我们就首先来看一下它的代码（定义在fs/fcntl.c中）：<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: #008080; "> 1</span> <span style="color: #000000; ">asmlinkage </span><span style="color: #0000FF; ">long</span><span style="color: #000000; "> sys_dup(unsigned </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> fildes)<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> ret </span><span style="color: #000000; ">=</span><span style="color: #000000; "> </span><span style="color: #000000; ">-</span><span style="color: #000000; ">EBADF;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> file </span><span style="color: #000000; ">*</span><span style="color: #000000; "> file </span><span style="color: #000000; ">=</span><span style="color: #000000; "> fget(fildes);<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (file)<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">        ret </span><span style="color: #000000; ">=</span><span style="color: #000000; "> dupfd(file, </span><span style="color: #000000; ">0</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> ret;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; "></span></div><br />而sys_dup()的主体是dupfd()（定义在同一个文件中）：<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: #008080; "> 1</span> <span style="color: #0000FF; ">static</span><span style="color: #000000; "> </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> dupfd(</span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> file </span><span style="color: #000000; ">*</span><span style="color: #000000; ">file, </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> start)<br /></span><span style="color: #008080; "> 2</span> <span style="color: #000000; ">{<br /></span><span style="color: #008080; "> 3</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">struct</span><span style="color: #000000; "> files_struct </span><span style="color: #000000; ">*</span><span style="color: #000000; "> files </span><span style="color: #000000; ">=</span><span style="color: #000000; "> current</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">files;<br /></span><span style="color: #008080; "> 4</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">int</span><span style="color: #000000; "> ret;<br /></span><span style="color: #008080; "> 5</span> <span style="color: #000000; "><br /></span><span style="color: #008080; "> 6</span> <span style="color: #000000; ">    ret </span><span style="color: #000000; ">=</span><span style="color: #000000; "> locate_fd(files, file, start);<br /></span><span style="color: #008080; "> 7</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">if</span><span style="color: #000000; "> (ret </span><span style="color: #000000; ">&lt;</span><span style="color: #000000; "> </span><span style="color: #000000; ">0</span><span style="color: #000000; ">)<br /></span><span style="color: #008080; "> 8</span> <span style="color: #000000; ">        </span><span style="color: #0000FF; ">goto</span><span style="color: #000000; "> out_putf;<br /></span><span style="color: #008080; "> 9</span> <span style="color: #000000; ">    allocate_fd(files, file, ret);<br /></span><span style="color: #008080; ">10</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> ret;<br /></span><span style="color: #008080; ">11</span> <span style="color: #000000; "><br /></span><span style="color: #008080; ">12</span> <span style="color: #000000; ">out_putf:<br /></span><span style="color: #008080; ">13</span> <span style="color: #000000; ">    write_unlock(</span><span style="color: #000000; ">&amp;</span><span style="color: #000000; ">files</span><span style="color: #000000; ">-&gt;</span><span style="color: #000000; ">file_lock);<br /></span><span style="color: #008080; ">14</span> <span style="color: #000000; ">    fput(file);<br /></span><span style="color: #008080; ">15</span> <span style="color: #000000; ">    </span><span style="color: #0000FF; ">return</span><span style="color: #000000; "> ret;<br /></span><span style="color: #008080; ">16</span> <span style="color: #000000; ">}<br /></span><span style="color: #008080; ">17</span> <span style="color: #000000; "></span></div><br /><font color="#0000FF">注：dup和dup2的原型如下：<br />#include &lt;unistd.h&gt;<br /><br />int dup(int file_descriptor);<br />int dup2(int file_descriptor1, int file_descriptor2)<br />dup返回的文件描述符总是取最小的可用值<br />dup2返回的文件描述符或者与file_descriptor2相同，或者是第一个大于该参数的可用值。</font><br /><br />    而这么一个简单的系统调用是如何完成重定向这个艰巨的任务的呢？我们不妨先看个例子。<br />   
 当我们在shell下输入如下命令：“echo 
hello!”，这条命令要求shell进程执行一个可执行文件echo，参数为“hello!”。当shell接收到命令之后，先找到
bin/echo，然后fork()出一个子进程让他执行bin/echo，并将参数传递给它，<font color="#FF0000">而这个进程从shell继承了三个标准文件，即标准输入
（stdin），标准输出（stdout）和标准出错信息（stderr），他们三个的文件号分别为0、1、2。</font>而至于echo进程的工作很简单，就是将参数“hello!”写到标准输出文件中去，通常都是我们的显示器上。但是如果我们将命令改成“echo hello! &gt; 
foo”，则在执行时输出将会被重定向到磁盘文件foo中<font color="#0000FF">（注：重定向于文件描述符有关）</font>。我们假定在此之前该shell进程只有三个标准文件打开，文件号分别为0、1、2，以上命令行将按如下序列执行：<br />    (1) 打开或创建磁盘文件foo，如果foo中原来有内容，则清除原来内容，其文件号为3。<br />    (2) 通过dup()复制文件stdout，即将文件号1出的file结构指针复制到文件号4处，目的是将stdout的file指针暂时保存一下<br />    (3) 关闭stdout，即1号文件，但是由于4号文件对stdout也同时有个引用，所以stdout文件并未真正关闭，只是腾出1号文件号位置。<br />    (4) 通过dup()，复制3号文件（即磁盘文件foo），由于1号文件关闭，其位置空缺，故3号文件被复制到1号，即进程中原来指向stdout的指针指向了foo。<br />   
 (5) 
通过系统调用fork()和exec()创建子进程并执行echo，子进程在执行echo前夕关闭3号和4号文件，只留下0、1、2三个文件，请注意，这
时的1号文件已经不是stdout而是磁盘文件foo了。当echo想向stdout文件写入“hello!”时自然就写入到了foo中。<br />    (6) 回到shell后，关闭指向foo的1号与3号文件文件，再用dup()和close()将2号恢复至stdout，这样shell就恢复了0、1、2三个标准输入/输出文件。<br /><br />   
 
由此可见，<font color="#FF0000">当echo程序（或其他）在运行的时候并不知道stdout（对于stdin和stderr同样）指向什么，进程与实际输出文件或设备的结合是在运行时由其父进程“包办”的。这样就简化了子进程的程序设计，因为在设计时只要跟三个逻辑上存在的文件打交道就可以了</font>。可能有人会觉得这很像面向对象中
的多态和重载，没有什么新奇之处，但是如果你活在30甚至40年前，可能你会改变你的看法。 
<img src ="http://www.blogjava.net/lihao336/aggbug/366231.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-12-13 14:20 <a href="http://www.blogjava.net/lihao336/archive/2011/12/13/366231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu10.04安装无线网卡ath9k_htc驱动</title><link>http://www.blogjava.net/lihao336/archive/2011/10/18/361521.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Tue, 18 Oct 2011 05:55:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/10/18/361521.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/361521.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/10/18/361521.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/361521.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/361521.html</trackback:ping><description><![CDATA[我的USB无线网卡<font color="#000000">型号为TL_WN721N，插在Ubuntu10.04上没有反应。据说10.10以后插上就可以用了，没有测试。<br /><br />第一步 确定</font>ath9k_htc驱动支持<font color="#000000">你的网卡型号<br /></font><a href="http://linuxwireless.org/en/users/Drivers/ath9k_htc/devices" class="postlink">http://linuxwireless.org/en/users/Drivers/ath9k_htc/devices</a> 列出了支持的型号列表，你可以通过lsusb查看自己的网卡型号是否在列表当中。<br /><br /><span class="Apple-style-span">第二步 </span><font color="#000000">安装firmwire<br />从<a href="http://wireless.kernel.org/download/htc_fw/">这里</a>下载</font><span class="Apple-style-span">htc_9271.fw，拷贝到/lib/firmwire下<br /><br /></span><span class="Apple-style-span">第三步 </span><span class="Apple-style-span">安装</span>compact wireless<br />安装compact wireless有打包好的deb包，从<a href="https://sourceforge.net/projects/ath9k-htc/files/ath9k_htc-installer/">这里</a>下载GUI Program to install ath9k_htc，安装完后直接运行，等待安装完成重启机器就可以了。<br />爱折腾的也可以到<a href="http://wireless.kernel.org/download/">http://wireless.kernel.org/download/</a><br />最新的compact wireless驱动，然后编译安装：<br />sudo make
<br />sudo make install
<br />sudo make unload
<br />sudo make load ath9k_htc
<br />重启机器即可。<br /><br />http://forum.ubuntu.com.cn/viewtopic.php?f=116&amp;t=326568&amp;p=2388841<br />http://blog.chinaunix.net/space.php?uid=20620288&amp;do=blog&amp;id=2691282<br /><img src ="http://www.blogjava.net/lihao336/aggbug/361521.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-10-18 13:55 <a href="http://www.blogjava.net/lihao336/archive/2011/10/18/361521.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Process state codes in ps output</title><link>http://www.blogjava.net/lihao336/archive/2011/06/08/351927.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 08 Jun 2011 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/06/08/351927.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/351927.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/06/08/351927.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/351927.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/351927.html</trackback:ping><description><![CDATA[
		<br />
		<table class="inline">
				<tbody>
						<tr class="row0">
								<th class="col0">Code </th>
								<th class="col1 leftalign"> Meaning                                                                </th>
						</tr>
						<tr class="row1">
								<td class="col0 leftalign"> D    </td>
								<td class="col1 leftalign"> Uninterruptible sleep (usually IO)                                     </td>
						</tr>
						<tr class="row2">
								<td class="col0 leftalign"> R    </td>
								<td class="col1 leftalign"> Running or runnable (on run queue)                                     </td>
						</tr>
						<tr class="row3">
								<td class="col0 leftalign"> S    </td>
								<td class="col1 leftalign"> Interruptible sleep (waiting for an event to complete)                 </td>
						</tr>
						<tr class="row4">
								<td class="col0 leftalign"> T    </td>
								<td class="col1"> Stopped, either by a job control signal or because it is being traced. </td>
						</tr>
						<tr class="row5">
								<td class="col0 leftalign"> W    </td>
								<td class="col1 leftalign"> paging (not valid since the 2.6.xx kernel)                             </td>
						</tr>
						<tr class="row6">
								<td class="col0 leftalign"> X    </td>
								<td class="col1 leftalign"> dead (should never be seen)                                            </td>
						</tr>
						<tr class="row7">
								<td class="col0 leftalign"> Z    </td>
								<td class="col1 leftalign"> Defunct (“zombie”) process, terminated but not reaped by its parent.   </td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
For BSD formats and when the stat keyword is used, additional characters may
be displayed:

</p>
		<table class="inline">
				<tbody>
						<tr class="row0">
								<th class="col0"> Code </th>
								<th class="col1 leftalign"> Meaning                                                                </th>
						</tr>
						<tr class="row1">
								<td class="col0 leftalign"> &lt;    </td>
								<td class="col1 leftalign"> high-priority (not nice to other users)                                </td>
						</tr>
						<tr class="row2">
								<td class="col0 leftalign"> N    </td>
								<td class="col1 leftalign"> low-priority (nice to other users)                                     </td>
						</tr>
						<tr class="row3">
								<td class="col0 leftalign"> L    </td>
								<td class="col1 leftalign"> has pages locked into memory (for real-time and custom IO)             </td>
						</tr>
						<tr class="row4">
								<td class="col0 leftalign"> s    </td>
								<td class="col1 leftalign"> is a session leader                                                    </td>
						</tr>
						<tr class="row5">
								<td class="col0 leftalign"> l    </td>
								<td class="col1 leftalign"> is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)          </td>
						</tr>
						<tr class="row6">
								<td class="col0 leftalign"> +    </td>
								<td class="col1 leftalign"> is in the foreground process group                                     </td>
						</tr>
				</tbody>
		</table>
		<br />
		<b>Process in D state</b>
		<br />
		<p>If there are a lot of processes in D state in your system, then something is wrong with it.
</p>
		<p>What is <b>D state</b> and a process state in general? A process in Linux can be in several states: running, 
sleeping, etc. Running process runs on a CPU just now, sleeping process waits for its turn on CPU
or for some other event. Using <tt>ps</tt> command you can obtain information about state of each process in the system: STAT column shows that: <br /></p>
		<pre># ps a
  PID TTY      STAT   TIME COMMAND
 4975 tty1     Ss+    0:00 /sbin/mingetty tty1
 4976 tty2     Ss+    0:00 /sbin/mingetty tty2
 6202 pts/0    Ss+    0:01 -bash
10312 pts/1    Ss     0:00 -bash
  639 pts/1    R+     0:00 ps a<br /><br /></pre>
		<p>First big <b>S</b> stands for Sleeping, <b>R</b> stands for running 
("+" means that the process is foreground and small "s" means that the 
process is session leader, but it is not relevant for this article).
</p>
		<p>
				<b>D</b> state occurs then the process is in uninterruptible 
sleep. This state is bad, because you can't do anything with the process
 in D state. Fortunately, process normally remains in such state not for
 so long. But if you have a heap of D state processes then some logic in
 system is disrupt. If that is happening, the very important thing is to
 determine where this unlucky sleep occurs. It is easy to do with ps 
command with <i>l</i> option. WCHAN column shows the name of the kernel function where the process is sleeping: <br /></p>
		<pre># ps axl | grep D
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
vass     13478  7.2  0.0   1732   624 pts/1    D+   17:36   0:00 find ./<br /><br />http://wiki.preshweb.co.uk/doku.php?id=linux:psflags<br />http://wiki.openvz.org/Processes_in_D_state<br /></pre>
<img src ="http://www.blogjava.net/lihao336/aggbug/351927.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-06-08 17:38 <a href="http://www.blogjava.net/lihao336/archive/2011/06/08/351927.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell heredoc</title><link>http://www.blogjava.net/lihao336/archive/2011/05/26/351120.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 26 May 2011 10:12:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/26/351120.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/351120.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/26/351120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/351120.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/351120.html</trackback:ping><description><![CDATA[一个<i class="FIRSTTERM">here document</i>就是一段带有特殊目的的代码段. 它使<a href="http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/abs-3.9.1_cn/html/io-redirection.html#IOREDIRREF"></a>用IO重定向的形式将一个命令序列传递到一个交互程序或者命令中, 比如frp，cat或者<i class="FIRSTTERM">ex</i>文本编辑器. <br />interactive-program &lt;&lt;delimiter<br />command #1<br />command #2<br />...<br />delimiter<br /><br />默认情况下，变量会被替换：<br /> $ cat &lt;&lt; EOF<br /> &gt; Working dir $PWD<br /> &gt; EOF<br /> Working dir /home/user<br /><br />如果delimiter用双引号引起来，则不会有变量替换：<br /> $ cat &lt;&lt; "EOF"<br /> &gt; Working dir $PWD<br /> &gt; EOF<br /> Working dir $PWD<br /><br />重定向 符号 &lt;&lt; 可以使用 &lt;&lt;- ，在这种情况下，heredoc 文本中的前导 tab 字符会被删除，但是空格不会被删除！<br /><br />注意：<br />结束标记前一定不能有任何空格或者tab，否则执行失败！<br /><br />heredoc 另外一个比较有用的是显示消息块，如Usage信息：<br /><font><font color="#000000"><pre class="PROGRAMLISTING">cat &lt;&lt;End-of-message
-------------------------------------
This is line 1 of the message.
This is line 2 of the message.
This is line 3 of the message.
This is line 4 of the message.
This is the last line of the message.
-------------------------------------
End-of-message</pre></font></font><br />参考：<br />http://tldp.org/LDP/abs/html/here-docs.html<br />http://febird.iteye.com/blog/588509<br />http://en.wikipedia.org/wiki/Here_document<img src ="http://www.blogjava.net/lihao336/aggbug/351120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-26 18:12 <a href="http://www.blogjava.net/lihao336/archive/2011/05/26/351120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell逐行处理文本</title><link>http://www.blogjava.net/lihao336/archive/2011/05/17/350418.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Tue, 17 May 2011 08:59:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/17/350418.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/350418.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/17/350418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/350418.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/350418.html</trackback:ping><description><![CDATA[对输入的文本按行读取并进行处理，可使用如下代码： <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: #008080; ">1</span>&nbsp;<span style="color: #000000; ">cat&nbsp;data.dat&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;read&nbsp;line<br />
</span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">do<br />
</span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">File:&nbsp;${line}</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">done<br />
</span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;<br />
</span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">while</span><span style="color: #000000; ">&nbsp;read&nbsp;line<br />
</span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">do<br />
</span><span style="color: #008080; ">8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">File:&nbsp;${line}</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br />
</span><span style="color: #008080; ">9</span>&nbsp;<span style="color: #000000; ">done&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;data.dat</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: #008080; ">1</span>&nbsp;<span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;line&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;$(cat&nbsp;data.dat)<br /></span><span style="color: #008080; ">2</span>&nbsp;<span style="color: #000000; ">do<br /></span><span style="color: #008080; ">3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">File:&nbsp;${line}</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">4</span>&nbsp;<span style="color: #000000; ">done<br /></span><span style="color: #008080; ">5</span>&nbsp;<span style="color: #000000; ">&nbsp;<br /></span><span style="color: #008080; ">6</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;line&nbsp;</span><span style="color: #0000FF; ">in</span><span style="color: #000000; ">&nbsp;`cat&nbsp;data.dat`<br /></span><span style="color: #008080; ">7</span>&nbsp;<span style="color: #000000; ">do<br /></span><span style="color: #008080; ">8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #800000; ">"</span><span style="color: #800000; ">File:&nbsp;${line}</span><span style="color: #800000; ">"</span><span style="color: #000000; "><br /></span><span style="color: #008080; ">9</span>&nbsp;<span style="color: #000000; ">done</span></div><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; ">如输入文本行中包括空格，那么会以空格来区分开多个元素，结果就不是按行读取了。<br /><br />当然如果只是单纯的数据或文本的按行读取和显示的话，使用awk命令会更为方便。</span></div><br /><div>http://witmax.cn/shell-read-line.html</div><img src ="http://www.blogjava.net/lihao336/aggbug/350418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-17 16:59 <a href="http://www.blogjava.net/lihao336/archive/2011/05/17/350418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Upgrade Alsa(1.0.24) on Ubuntu10.04</title><link>http://www.blogjava.net/lihao336/archive/2011/05/15/350281.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Sun, 15 May 2011 09:37:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/15/350281.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/350281.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/15/350281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/350281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/350281.html</trackback:ping><description><![CDATA[问题现象：<br />
笔记本外放有声音，插上耳机没有声音<br />
<br />
系统声卡信息为：<br />
$ lspci -v|grep -i audio<br />
00:1b.0 Audio device: Intel Corporation 5 Series/3400 Series Chipset High Definition Audio (rev 05)<br />
$ cat /proc/asound/card0/codec* | grep Codec<br />
Codec: IDT 92HD81B1X5<br />
Codec: Intel  G45 DEVIB<br />
<br />
google一通，有帖子说要修改 /etc/modprobe.d/alsa-base.conf<br />
加上：<br />
alias snd-card-0 snd-hda-intel<br />
alias sound-slot-0 snd-hda-intel<br />
options snd-hda-intel model=hp(这里需要找到和你机器匹配的mode)<br />
options snd-hda-intel enable_msi=1<br />
<br />
重启后不管用。<br />
<br />
查看机器上的alsa驱动的版本：<br />
cat /proc/asound/version<br />
显示版本为1.0.21，怀疑是不是版本太低了，于是尝试更新alsa驱动版本，搜索到这篇帖子：<br />
http://monespaceperso.org/blog-en/2010/05/02/upgrade-alsa-1-0-23-on-ubuntu-lucid-lynx-10-04/<br />
升级alsa驱动为1.0.24版本后，故障排除。<br />
$ cat /proc/asound/version<br />
Advanced Linux Sound Architecture Driver Version 1.0.24.<br />
Compiled on May 15 2011 for kernel 2.6.32-31-generic (SMP).<br />
<br />
只是不知道为什么设备信息变成了：<br />
$ cat /proc/asound/card0/codec* | grep Codec<br />
Codec: IDT 92HD81B1X5<br />
Codec: Intel IbexPeak HDMI<br />
<br />
<img src ="http://www.blogjava.net/lihao336/aggbug/350281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-15 17:37 <a href="http://www.blogjava.net/lihao336/archive/2011/05/15/350281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>tar命令小结</title><link>http://www.blogjava.net/lihao336/archive/2011/05/14/350239.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Sat, 14 May 2011 06:03:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/14/350239.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/350239.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/14/350239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/350239.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/350239.html</trackback:ping><description><![CDATA[默认情况下，tar命令可以用来将文件打包为.tar包或者用来解开.tar包。tar命令也可以调用其它压缩算法从而支持gzip,bzip2等等。<br />
tar命令有几种主要模式：<br />
* 打包：<br />
tar cf allfile.tar *.jpg<br /><br />
* 解包到指定的目录：<br />
tar xf allfile.tar -C ~/Pictures<br /><br />
* 列出tar包中的所有文件：<br />
tar tf allfile.tar<br /><br />
* 往已有的tar包中增加新文件：<br />
tar rf allfile.tar *.png<br /><br />
使用tar命令处理其它压缩算法<br />
* gzip(.tar.gz或者.tgz)<br />
tar zcf allfile.tar.gz *.jpg<br />
tar zxf allfile.tar.gz -C ~/Pictures<br /><br />
* bzip2(.tar.bz2或者.bz2)<br />
tar jcf allfile.tar.bz2 *.jpg<br />
tar jxf allfile.tar.bz2 -C ~/Pictures<br /><br />
归档里面的所有文件均是相对引用，归档解压缩（释放）在了当前目录。归档文件总是释放到当前目录，为的是防止破坏文件系统中重名的文件。<br />
如果想覆盖的话，在归档和解压时请使用-P参数：<br />
tar zcvf mysql.tar.gz -P /var/lib/mysql<br />
tar -Pzxvf mysql.tar.gz(这会覆盖本地的/var/lib/mysql目录)<br /><br />Tar炸弹<br /><p>攻击者利用绝对路径，或者“tar -cf bomb.tar 
*”的方式创建的tar文件，然后诱骗受害者在根目录下解压，或者使用绝对路径解压。可能使受害系统上已有的文件被覆盖掉，或者导致当前工作目录凌乱不
堪，这就是所谓的“tar炸弹”。因此，要养成良好的解压习惯：</p><ul><li>解压前用“t”查看tar的文件内容。</li><li>拒绝使用绝对路径。</li><li>新建一个临时子目录，然后在这个子目录里解压。</li></ul><br /><img src ="http://www.blogjava.net/lihao336/aggbug/350239.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-14 14:03 <a href="http://www.blogjava.net/lihao336/archive/2011/05/14/350239.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hide title bar firefox 4.0.1 on Ubuntu linux</title><link>http://www.blogjava.net/lihao336/archive/2011/05/11/350040.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 11 May 2011 14:25:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/11/350040.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/350040.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/11/350040.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/350040.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/350040.html</trackback:ping><description><![CDATA[Google一通，发现所谓lHideChrome，Hide Caption之类插件都是浮云，最后发现一个给力的，如下：<br />
下载userChromeJS插件：http://downloads.mozdev.org/userchromejs/userChromeJS-1.3.xpi<br />
编辑：<br />
~/.mozilla/firefox/XXXXXX.default/chrome/userChrome.js：<br />
<br />
(function() {<br />
var win_ctrl = document.getElementById("window-controls");<br />
win_ctrl.setAttribute("fullscreencontrol", "false");<br />
win_ctrl.setAttribute("hidden", "false");<br />
<br />
var mainWindow = document.getElementById("main-window");<br />
mainWindow.setAttribute("hidechrome", "true");<br />
<br />
})(); <br />
<br />
That's all.
<img src ="http://www.blogjava.net/lihao336/aggbug/350040.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-11 22:25 <a href="http://www.blogjava.net/lihao336/archive/2011/05/11/350040.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>禁用touchpad</title><link>http://www.blogjava.net/lihao336/archive/2011/05/04/349460.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Tue, 03 May 2011 17:13:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/05/04/349460.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/349460.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/05/04/349460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/349460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/349460.html</trackback:ping><description><![CDATA[<br />
xinput --list<br />
<br />
查找触摸板的id：<br />
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]<br />
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]<br />
⎜   ↳ USB Optical Mouse                       	id=10	[slave  pointer  (2)]<br />
⎜   ↳ PS/2 Synaptics TouchPad                 	id=13	[slave  pointer  (2)]<br />
⎜   ↳ Macintosh mouse button emulation        	id=14	[slave  pointer  (2)]<br />
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]<br />
↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]<br />
↳ Power Button                            	id=6	[slave  keyboard (3)]<br />
↳ Video Bus                               	id=7	[slave  keyboard (3)]<br />
↳ Video Bus                               	id=8	[slave  keyboard (3)]<br />
↳ Power Button                            	id=9	[slave  keyboard (3)]<br />
↳ HP Webcam-101                           	id=11	[slave  keyboard (3)]<br />
↳ AT Translated Set 2 keyboard            	id=12	[slave  keyboard (3)]<br />
<br />
触摸板的ID为13，<br />
禁用：<br />
代码:<br />
xinput set-prop 13 "Device Enabled" 0<br />
<br />
启用：<br />
代码:<br />
xinput set-prop 13 "Device Enabled" 1<br />
<img src ="http://www.blogjava.net/lihao336/aggbug/349460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-05-04 01:13 <a href="http://www.blogjava.net/lihao336/archive/2011/05/04/349460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell字符串比较</title><link>http://www.blogjava.net/lihao336/archive/2011/04/13/348234.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 13 Apr 2011 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/04/13/348234.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/348234.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/04/13/348234.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/348234.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/348234.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="border-collapse: separate; color: #000000; font-family: 'WenQuanYi Micro Hei'; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-align: -webkit-auto; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; 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; font-size: medium; "><span class="Apple-style-span" style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 14px; line-height: 23px; ">比较两个字符串是否相等的办法是：<span class="Apple-converted-space">&nbsp;</span><br />
if [ "$test"x = "test"x ]; then<br />
这里的关键有几点：<br />
1 使用单个等号，也可以使用两个等号<br />
2 注意到等号两边各有一个空格：这是unix shell的要求<br />
3 注意到"$test"x最后的x，这是特意安排的，因为当$test为空的时候，上面的表达式就变成了x = testx，显然是不相等的。而如果没有这个x，表达式就会报错：[: =: unary operator expected<br />
<br />
以上在android shell下不能运行，android shell不认识。<br />
</span></span>
<img src ="http://www.blogjava.net/lihao336/aggbug/348234.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-04-13 18:04 <a href="http://www.blogjava.net/lihao336/archive/2011/04/13/348234.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu安装sun-java5-jdk</title><link>http://www.blogjava.net/lihao336/archive/2011/03/17/346459.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 17 Mar 2011 04:58:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/03/17/346459.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/346459.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/03/17/346459.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/346459.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/346459.html</trackback:ping><description><![CDATA[Ubuntu 9.10以上版本中，Ubuntu去除了对sun-java5-jdk的支持，如果必须安装sun-java5-jdk。那么可以采用如下方法：<br />
<br />
1.编辑/etc/apt/sources.list文件，将安装源更改为Ubuntu 9.04的安装源为：<br />
<br />
deb http://archive.Ubuntu.com/ubuntu/ jaunty main restricted universe multiverse<br />
deb http://archive.Ubuntu.com/ubuntu/ jaunty-security main restricted universe multiverse<br />
deb http://archive.Ubuntu.com/ubuntu/ jaunty-updates main restricted universe multiverse<br />
deb http://archive.Ubuntu.com/ubuntu/ jaunty-proposed main restricted universe multiverse<br />
deb http://archive.Ubuntu.com/ubuntu/ jaunty-backports main restricted universe multiverse<br />
deb-src http://archive.Ubuntu.com/ubuntu/ jaunty main restricted universe multiverse<br />
deb-src http://archive.Ubuntu.com/ubuntu/ jaunty-security main restricted universe multiverse<br />
deb-src http://archive.Ubuntu.com/ubuntu/ jaunty-updates main restricted universe multiverse<br />
deb-src http://archive.Ubuntu.com/ubuntu/ jaunty-proposed main restricted universe multiverse<br />
<br />
2. sudo apt-get install sun-java5-jdk<br />
<img src ="http://www.blogjava.net/lihao336/aggbug/346459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-03-17 12:58 <a href="http://www.blogjava.net/lihao336/archive/2011/03/17/346459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]ioctl函数的作用</title><link>http://www.blogjava.net/lihao336/archive/2011/03/03/345548.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 02 Mar 2011 16:28:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/03/03/345548.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/345548.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/03/03/345548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/345548.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/345548.html</trackback:ping><description><![CDATA[<strong>特殊的read,write,   当你用read，write不能完成某一功能时，就用ioctl</strong><br />
<br />
[转载]来源http://www.linuxeden.com/edu/doctext.php?docid=1860<br />
<br />
我这里说的ioctl函数是在驱动程序里的，因为我不知道还有没有别的场合用到了ioctl，<br />
所以就规定了我们讨论的范围。为什么要写篇文章呢，是因为我前一阵子被ioctl给搞混<br />
了，这几天才弄明白它，于是在这里清理一下头脑。 <br />
<br />
一、 什么是ioctl。 <br />
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理，就<br />
是对设备的一些特性进行控制，例如串口的传输波特率、马达的转速等等。它的调用个数<br />
如下： <br />
int ioctl(int fd, ind cmd, &#8230;)； <br />
其中fd就是用户程序打开设备时使用open函数返回的文件标示符，cmd就是用户程序对设<br />
备的控制命令，至于后面的省略号，那是一些补充参数，一般最多一个，有或没有是和<br />
cmd的意义相关的。 <br />
ioctl函数是文件结构中的一个属性分量，就是说如果你的驱动程序提供了对ioctl的支<br />
持，用户就可以在用户程序中使用ioctl函数控制设备的I/O通道。 【所以说这些cmd不能和内核中的相同，否则就有冲突了】<br />
<br />
二、 ioctl的必要性 <br />
如果不用ioctl的话，也可以实现对设备I/O通道的控制，但那就是蛮拧了。例如，我们可<br />
以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过，如果有的话，<br />
那么后面就跟着控制命令（一般在socket编程中常常这样做）。但是如果这样做的话，会<br />
导致代码分工不明，程序结构混乱，程序员自己也会头昏眼花的。 <br />
所以，我们就使用ioctl来实现控制的功能。要记住，用户程序所作的只是通过命令码告<br />
诉驱动程序它想做什么，至于怎么解释这些命令和怎么实现这些命令，这都是驱动程序要<br />
做的事情。 <br />
<br />
三、 ioctl如何实现 <br />
这是一个很麻烦的问题，我是能省则省。要说清楚它，没有四五千字是不行的，所以我这<br />
里是不可能把它说得非常清楚了，不过如果有读者对用户程序怎么和驱动程序联系起来感<br />
兴趣的话，可以看我前一阵子写的《write的奥秘》。读者只要把write换成ioctl，就知<br />
道用户程序的ioctl是怎么和驱动程序中的ioctl实现联系在一起的了。 <br />
我这里说一个大概思路，因为我觉得《Linux设备驱动程序》这本书已经说的非常清楚<br />
了，但是得化一些时间来看。 <br />
在驱动程序中实现的ioctl函数体内，实际上是有一个switch{case}结构，每一个case对<br />
应一个命令码，做出一些相应的操作。怎么实现这些操作，这是每一个程序员自己的事<br />
情，因为设备都是特定的，这里也没法说。关键在于怎么样组织命令码，因为在ioctl中<br />
命令码是唯一联系用户程序命令和驱动程序支持的途径。 <br />
命令码的组织是有一些讲究的，因为我们一定要做到命令和设备是一一对应的，这样才不<br />
会将正确的命令发给错误的设备，或者是把错误的命令发给正确的设备，或者是把错误的<br />
命令发给错误的设备。这些错误都会导致不可预料的事情发生，而当程序员发现了这些奇<br />
怪的事情的时候，再来调试程序查找错误，那将是非常困难的事情。 <br />
所以在Linux核心中是这样定义一个命令码的组织结构： <br />
____________________________________<br />
| 设备类型 | 序列号 | 方向 |数据尺寸|<br />
|----------|--------|------|--------|<br />
| 8 bit | 8 bit |2 bit |8~14 bit|<br />
|----------|--------|------|--------|<br />
<br />
这样一来，<strong>一个命令就变成了一个整数形式的命令码。但是命令码非常的不直观，所以<br />
Linux Kernel中提供了一些宏，这些宏可根据便于理解的字符串生成命令码，或者是从<br />
命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数<br />
据传送方向和数据传输尺寸。</strong><br />
<br />
这些宏我就不在这里解释了，具体的形式请读者察看Linux核心源代码中的和，文件里给<br />
除了这些宏完整的定义。这里我只多说一个地方，那就是"幻数"。 <br />
幻数是一个字母，数据长度也是8，所以就用一个特定的字母来标明设备类型，这和用一<br />
个数字是一样的，只是更加利于记忆和理解。就是这样，再没有更复杂的了。 <br />
更多的说了也没有，读者还是看一看源代码吧，推荐各位阅读《Linux 设备驱动程序》所<br />
带源代码中的short一例，因为它比较短小，功能比较简单，可以看明白ioctl的功能和细<br />
节。 <br />
<br />
四、 cmd参数如何得出 <br />
这里确实要说一说，cmd参数在用户程序端由一些宏根据设备类型、序列号、传送方向、<br />
数据尺寸等生成，这个整数通过系统调用传递到内核中的驱动程序，再由驱动程序使用解<br />
码宏从这个整数中得到设备的类型、序列号、传送方向、数据尺寸等信息，然后通过<br />
switch{case}结构进行相应的操作。 <br />
要透彻理解，只能是通过阅读源代码，我这篇文章实际上只是一个引子。Cmd参数的组织<br />
还是比较复杂的，我认为要搞熟它还是得花不少时间的，但是这是值得的，驱动程序中最<br />
难的是对中断的理解。 <br />
<br />
五、 小结 <br />
ioctl其实没有什么很难的东西需要理解，关键是理解cmd命令码是怎么在用户程序里生成<br />
并在驱动程序里解析的，程序员最主要的工作量在switch{case}结构中，因为对设备的<br />
I/O控制都是通过这一部分的代码实现的。 <br />
<br />
参考资料： <br />
1．《Linux 设备驱动程序》，鲁宾尼著，中国电力出版社。 <br />
2．《write的奥秘》，coly，真情流露(202.204.7.235)-&gt;电脑技术-&gt;Linux技术。
<img src ="http://www.blogjava.net/lihao336/aggbug/345548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-03-03 00:28 <a href="http://www.blogjava.net/lihao336/archive/2011/03/03/345548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]基于FrameBuffer的直接写屏</title><link>http://www.blogjava.net/lihao336/archive/2011/03/03/345547.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 02 Mar 2011 16:26:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/03/03/345547.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/345547.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/03/03/345547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/345547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/345547.html</trackback:ping><description><![CDATA[<br />
1.将FrameBuffer配置成800x600x16色的显示模式<br />
在/boot/grub/menu.lst中的kernel加入vga=0x314<br />
//test.c<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">#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;">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;">stat.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;">fcntl.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv){<br />
&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fb_fd</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">fbdev</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/dev/fb0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((fd_fd</span><span style="color: #000000;">=</span><span style="color: #000000;">open(fbdev,O_RDWR))</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">open&nbsp;FrameBuffer&nbsp;device&nbsp;failed.</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;}<br />
&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">open&nbsp;FrameBuffer&nbsp;device&nbsp;successfully!</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;close(fb_fd);<br />
}</span></div>
<br />
编译后执行一下，看看当前内核是否支持FrameBuffer机制.<br />
设备打开成功后要获取相当的参数，使用ioctl，会填充以下结构体，<br />
在linux/fb.h中定义的<br />
struct fb_fix_screeninfo<br />
struct fb_var_screeninfo<br />
struct fb_cmap<br />
从fs.h中可看出<br />
<br />
#define FBIOGET_VSCREENINFO 0x4600<br />
#define FBIOGET_FSCREENINFO 0x4602<br />
<br />
我们就用这两条命令获取相当的参数信息<br />
//test.c<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">#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;">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;">stat.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;">fcntl.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;">fb.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">**</span><span style="color: #000000;">argv){<br />
&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fb_fd</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">env</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">/dev/fb0</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br />
&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fb_fix_screeninfo&nbsp;fb_fixinfo;<br />
&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fb_var_screeninfo&nbsp;fb_varinfo;<br />
&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((fb_fd</span><span style="color: #000000;">=</span><span style="color: #000000;">open(env,O_RDWR))</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Error:open&nbsp;FrameBuffer&nbsp;device:%s</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,env);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">{<br />
&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">OK:open&nbsp;FrameBuffer&nbsp;device:%s</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,env);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;}<br />
&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(ioctl(fb_fd,FBIOGET_FSCREENINFO,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">fb_fixinfo)</span><span style="color: #000000;">==-</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Error:FBIOGET_FSCREENINFO</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">goto</span><span style="color: #000000;">&nbsp;fail;<br />
&nbsp;}<br />
&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ioctl&nbsp;FBIOGET_FSCREENINFO&nbsp;ok</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">id=%s</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.id);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">smem_start=%#x</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.smem_start);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">mem_len=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.smem_len);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">type=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.type);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">type_aux=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.type_aux);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">visual=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.visual);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">xpanstep=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.xpanstep);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ypanstep=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.ypanstep);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ywrapstep=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.ywrapstep);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">line_length=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.line_length);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">mmio_start=%#x</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.mmio_start);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">mmio_len=%#x</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.mmio_len);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">accel=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.accel);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[0]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.reserved[0]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[1]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.reserved[1]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[2]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_fixinfo.reserved[2]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(ioctl(fb_fd,FBIOGET_VSCREENINFO,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">fb_varinfo)</span><span style="color: #000000;">==-</span><span style="color: #000000;">1</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">Error:ioctl:FBIOGET_VSCREENINFO</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #0000ff;">goto</span><span style="color: #000000;">&nbsp;fail;<br />
&nbsp;}<br />
&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ioctl&nbsp;FBIOGET_VSCREENINFO&nbsp;ok</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">xres=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.xres);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">yres=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.yres);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">xres_virtual=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.xres_virtual);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">yres_virtual=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.yres_virtual);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">xoffset=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.xoffset);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">yoffset=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.yoffset);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">bits_per_pixel=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.bits_per_pixel);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">grayscale=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.grayscale);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">red=%#x</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.red);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">green=%#x</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.green);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">blue=%#x</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.blue);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">transp=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.transp);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">nonstd=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.nonstd);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">activate=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.activate);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">height=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.height);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">width=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.width);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">accel_flags=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.accel_flags);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">pixclock=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.pixclock);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">left_margin=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.left_margin);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">right_margin=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.right_margin);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">upper_margin=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.upper_margin);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">lower_margin=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.lower_margin);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">hsync_len=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.hsync_len);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">vsync_len=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.vsync_len);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">sync=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.sync);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">vmode=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.vmode);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">rotate=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.rotate);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[0]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.reserved[0]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[1]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.reserved[1]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[2]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.reserved[2]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[3]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.reserved[3]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">reserved[4]=%d</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">,fb_varinfo.reserved[4]);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;<br />
&nbsp;close(fb_fd);<br />
&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 />
fail:<br />
&nbsp;close(fb_fd);<br />
&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
}</span></div>
<br />
从输出结果来看xres=800,yres=600,从这里可以看出这个FrameBuffer的最大值为800x600<br />
得到framebuffer的信息后，我们开辟一段内存，然后映射framebuffer的内存,<br />
这样当向这段内存写入信息时，framebuffer中就会写入相同的数据，也就会有数据表示的图像显示在屏幕上。<br />
例：在屏幕上显示一个渐变窗体<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #000000;">#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;">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;">stat.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;">fcntl.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;">fb.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;">errno.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;">mman.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: #0000ff;">string</span><span style="color: #000000;">.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;">ioctl.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flush_screen(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">buf,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">framebuf,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;width,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;height);<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;argc,&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">argv[])<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fb_fd</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fb_fix_screeninfo&nbsp;fb_fixinfo;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fb_var_screeninfo&nbsp;fb_varinfo;<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;">fb_addr;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;fb_size;<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;">buffer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">((fb_fd</span><span style="color: #000000;">=</span><span style="color: #000000;">open(</span><span style="color: #000000;">"</span><span style="color: #000000;">/dev/fb0</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;O_RDWR))</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">0</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">open&nbsp;framebuffer&nbsp;device&nbsp;failed.</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">open&nbsp;framebuffer&nbsp;device&nbsp;ok</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(ioctl(fb_fd,&nbsp;FBIOGET_FSCREENINFO,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">fb_fixinfo)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ioctl&nbsp;FBIOGET_FSCREENINFO&nbsp;failed.</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ioctl&nbsp;FBIOGET_FSCREENINFO&nbsp;ok</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(ioctl(fb_fd,&nbsp;FBIOGET_VSCREENINFO,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">fb_varinfo)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ioctl&nbsp;FBIOGET_VSCREENINFO&nbsp;failed.</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">ioctl&nbsp;FBIOGET_VSCREENINFO&nbsp;ok</span><span style="color: #000000;">"</span><span style="color: #000000;">n</span><span style="color: #000000;">"</span><span style="color: #000000;">);</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fb_size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fb_varinfo.yres&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fb_fixinfo.line_length;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">整个framebuffer的大小</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fb_addr&nbsp;</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;">)mmap(NULL,&nbsp;fb_size,&nbsp;PROT_READ</span><span style="color: #000000;">|</span><span style="color: #000000;">PROT_WRITE,MAP_SHARED,&nbsp;fb_fd,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">将framebuffer的物理地址映射到进程地址空间</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)malloc(fb_varinfo.yres&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fb_fixinfo.line_length);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">申请一个缓冲区，采用双缓冲方式</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</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;i</span><span style="color: #000000;">&lt;=</span><span style="color: #000000;">0xff</span><span style="color: #000000;">;i</span><span style="color: #000000;">+=</span><span style="color: #000000;">0x0f</span><span style="color: #000000;">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(buffer,i,fb_varinfo.yres&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;fb_fixinfo.line_length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flush_screen(buffer,fb_addr,fb_varinfo.xres,fb_varinfo.yres);<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">fb_addr)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;free(buffer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
}<br />
<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;flush_screen(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">buf,</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">framebuf,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;width,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;height)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">t_data&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;buf;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">t_fb_addr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;framebuf;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;bytew</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;width</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;">height&nbsp;</span><span style="color: #000000;">&gt;=</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;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(t_fb_addr,t_data,bytew);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_fb_addr&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;width;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t_data&nbsp;</span><span style="color: #000000;">+=</span><span style="color: #000000;">&nbsp;width;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</span></div>
<br />
编译后，运行看一下结果，尽量在字符模式下运行<br />
vi /etc/inittab将运行级别改为3<br />
重启后，运行一下看看结果。<br />
<br />
参考链接：<br />
<strong><a href="">http://www.blogjava.net/lihao336/admin/EditPosts.aspx?postid=345547</a></strong><br />
<img src ="http://www.blogjava.net/lihao336/aggbug/345547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-03-03 00:26 <a href="http://www.blogjava.net/lihao336/archive/2011/03/03/345547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Linux的帧缓冲设备(Framebuffer)简介</title><link>http://www.blogjava.net/lihao336/archive/2011/03/03/345544.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 02 Mar 2011 16:19:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/03/03/345544.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/345544.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/03/03/345544.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/345544.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/345544.html</trackback:ping><description><![CDATA[Linux的帧缓冲设备(Framebuffer)简介<br />
<br />
帧 缓冲（framebuffer）是Linux为显示设备提供的一个接口，把显存抽象后的一种设备，他允许上层应用程序在图形模式下直接对显示缓冲区进行读 写操作。这种操作是抽象的，统一的。用户不必关心物理显存的位置、换页机制等等具体细节。这些都是由Framebuffer设备驱动来完成的。<br />
帧缓冲驱动的应用广泛，在linux的桌面系统中，Xwindow服务器就是利用帧缓冲进行窗口的绘制。尤其是通过帧缓冲可显示汉字点阵，成为Linux汉化的唯一可行方案。 &nbsp;<br />
&nbsp;&nbsp;&nbsp; Linux FrameBuffer 本质上只是提供了对图形设备的硬件抽象，在开发者看来，FrameBuffer 是一块显示缓存，往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。所以说FrameBuffer就是一块白板。例如对于初始化为16 位色的FrameBuffer 来说， FrameBuffer中的两个字节代表屏幕上一个点，从上到下，从左至右，屏幕位置与内存地址是顺序的线性关系。<br />
&nbsp;&nbsp;&nbsp; 帧缓存可以在系统存储器(内存)的任意位置，视频控制器通过访问帧缓存来刷新屏幕。 帧缓存也叫刷新缓存 Frame buffer 或 refresh buffer, 这里的帧(frame)是指整个屏幕范围。 &nbsp;<br />
&nbsp;&nbsp;&nbsp; 帧缓存有个地址，是在内存里。我们通过不停的向frame buffer中写入数据， 显示控制器就自动的从frame buffer中取数据并显示出来。全部的图形都共享内存中同一个帧缓存。<br />
&nbsp;&nbsp;&nbsp; CPU指定显示控制器工作，则显示控制器根据CPU的控制到指定的地方去取数据 和 指令， 目前的数据一般是从显存里取， 如果显存里存不下，则从内存里取， 内存也放不下，则从硬盘里取，当然也不是内存放不下，而是为了节省内存的话，可以放在硬盘里，然后通过 指令控制显示控制器去取。帧缓存 Frame Buffer，里面存储的东西是一帧一帧的， 显卡会不停的刷新Frame Buffer, 这每一帧如果不捕获的话， 则会被丢弃，也就是说是实时的。这每一帧不管是保存在内存还是显存里， 都是一个显性的信息，这每一帧假设是800x600的分辨率， 则保存的是800x600个像素点，和颜色值。<br />
&nbsp;&nbsp;&nbsp; 显示器可以显示无限种颜色，目前普通电脑的显卡可以显示32位真彩、24位真彩、16位增强色、256色。除256色外，大家可以根据自己的需要在显卡的允许范围之内随意选择。很多用户有一种错误概念，认为256色是最高级的选项，而实际上正好相反。256色是最低级的选项，它已不能满足彩色图像的显示需要。16位不是16种颜色，而是2的16次平方(256&#215;256)种颜色，但256色就是256(2的8次平方)种颜色。所以16位色要比256色丰富得多。 <br />
&nbsp;&nbsp;&nbsp; 帧缓冲设备对应的设备文件为 /dev/fb*，如果系统有多个显示卡，Linux下还可支持多个帧缓冲设备，最多可达32 个，分别为/dev/fb0到/dev/fb31，而/dev/fb则为当前缺省的帧缓冲设备，通常指向/dev/fb0。当然在嵌入式系统中支持一个显 示设备就够了。帧缓冲设备为标准字符设备，主设备号为29，次设备号则从0到31。分别对应/dev/fb0-/dev/fb31。通过/dev/fb， 应用程序的操作主要有这几种： &nbsp;<br />
1． 读/写（read/write）/dev/fb：相当于读/写屏幕缓冲区。例如用 cp /dev/fb0 tmp命令可将当前屏幕的内容拷贝到一个文件中，而命令cp tmp &gt; /dev/fb0 则将图形文件tmp显示在屏幕上。 <br />
2．映射（map）操作：<strong><span style="color: #ff0000;">由于Linux工作在保护模式，每个应用程序都有自己的虚拟地址空间，在应用程序中是不能直接访问物理缓冲区地址的。为此， Linux在文件操作 file_operations结构中提供了mmap函数，可将文件的内容映射到用户空间。对于帧缓冲设备，则可通过映射操作，可将屏幕缓冲区的物理地址 映射到用户空间的一段虚拟地址中，之后用户就可以通过读写这段虚拟地址访问屏幕缓冲区，在屏幕上绘图了</span></strong>。实际上，使用帧缓冲设备的应用程序都是通过映射操作来显示图形的。由于映射操作都是由内核来完成，下面我们将看到，帧缓冲驱动留给开发人员的工作并不多。<br />
3． I/O控制：对于帧缓冲设备，对设备文件的ioctl操作可读取/设置显示设备及屏幕的参数，如分辨率，显示颜色数，屏幕大小等等。ioctl的操作是由底层的驱动程序来完成的。 &nbsp;<br />
在应用程序中，操作/dev/fb的一般步骤如下：<br />
&nbsp; <br />
<strong>1． 打开/dev/fb设备文件。 &nbsp;<br />
2． 用ioctrl操作取得当前显示屏幕的参数，如屏幕分辨率，每个像素点的比特数。根据屏幕参数可计算屏幕缓冲区的大小。 &nbsp;<br />
3． 将屏幕缓冲区映射到用户空间。 &nbsp;<br />
4． 映射后就可以直接读写屏幕缓冲区，进行绘图和图片显示了。 </strong><br />
&nbsp;<br />
典型程序段如下： &nbsp;<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><span style="color: #008080;">&nbsp;1</span>&nbsp;<span style="color: #000000;">#include<br />
</span><span style="color: #008080;">&nbsp;2</span>&nbsp;<span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br />
</span><span style="color: #008080;">&nbsp;3</span>&nbsp;<span style="color: #000000;">{<br />
</span><span style="color: #008080;">&nbsp;4</span>&nbsp;<span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;fbfd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;5</span>&nbsp;<span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fb_var_screeninfo&nbsp;vinfo;<br />
</span><span style="color: #008080;">&nbsp;6</span>&nbsp;<span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;fb_fix_screeninfo&nbsp;finfo;<br />
</span><span style="color: #008080;">&nbsp;7</span>&nbsp;<span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;screensize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">&nbsp;8</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">打开设备文件</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">&nbsp;9</span>&nbsp;<span style="color: #000000;">fbfd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;open(</span><span style="color: #000000;">"</span><span style="color: #000000;">/dev/fb0</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;O_RDWR);<br />
</span><span style="color: #008080;">10</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">取得屏幕相关参数</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">11</span>&nbsp;<span style="color: #000000;">ioctl(fbfd,&nbsp;FBIOGET_FSCREENINFO,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">finfo);<br />
</span><span style="color: #008080;">12</span>&nbsp;<span style="color: #000000;">ioctl(fbfd,&nbsp;FBIOGET_VSCREENINFO,&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">vinfo);<br />
</span><span style="color: #008080;">13</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">计算屏幕缓冲区大小</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">14</span>&nbsp;<span style="color: #000000;">screensize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;vinfo.xres&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;vinfo.yres&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;vinfo.bits_per_pixel&nbsp;</span><span style="color: #000000;">/</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">8</span><span style="color: #000000;">;<br />
</span><span style="color: #008080;">15</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">映射屏幕缓冲区到用户地址空间</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">16</span>&nbsp;<span style="color: #000000;">fbp</span><span style="color: #000000;">=</span><span style="color: #000000;">(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">*</span><span style="color: #000000;">)mmap(</span><span style="color: #000000;">0</span><span style="color: #000000;">,screensize,PROT_READ</span><span style="color: #000000;">|</span><span style="color: #000000;">PROT_WRITE,MAP_SHARED,&nbsp;fbfd,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
</span><span style="color: #008080;">17</span>&nbsp;<span style="color: #008000;">/*</span><span style="color: #008000;">下面可通过fbp指针读写缓冲区</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
</span><span style="color: #008080;">18</span>&nbsp;<span style="color: #000000;">}</span></div>
<br />
<img src ="http://www.blogjava.net/lihao336/aggbug/345544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-03-03 00:19 <a href="http://www.blogjava.net/lihao336/archive/2011/03/03/345544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用mutt发送邮件</title><link>http://www.blogjava.net/lihao336/archive/2011/01/25/343466.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 24 Jan 2011 18:14:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2011/01/25/343466.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/343466.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2011/01/25/343466.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/343466.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/343466.html</trackback:ping><description><![CDATA[1.安装msmtp<br />
配置~/.msmtprc<br />
account default<br />
host smtp.yourprovider.example<br />
from you@yourprovider.example<br />
<br />
auth login<br />
user JoeExample<br />
password Secret<br />
<br />
可使用msmtp --host=smtp.yourprovider.example --serverinfo 来查看server的信息<br />
<br />
2.安装mutt<br />
配置～/.muttrc<br />
<br />
set sendmail="/usr/bin/msmtp"<br />
set from=you@yourprovider.example<br />
set editor=vim<br />
<br />
<img src ="http://www.blogjava.net/lihao336/aggbug/343466.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2011-01-25 02:14 <a href="http://www.blogjava.net/lihao336/archive/2011/01/25/343466.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux Shell History (快速使用Linux命令)</title><link>http://www.blogjava.net/lihao336/archive/2010/10/11/334367.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 11 Oct 2010 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/10/11/334367.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/334367.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/10/11/334367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/334367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/334367.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/10/11/334367.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/334367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-10-11 15:44 <a href="http://www.blogjava.net/lihao336/archive/2010/10/11/334367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用linnm为emacs添加行号</title><link>http://www.blogjava.net/lihao336/archive/2010/10/08/333953.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Fri, 08 Oct 2010 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/10/08/333953.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/333953.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/10/08/333953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/333953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/333953.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/10/08/333953.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/333953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-10-08 09:35 <a href="http://www.blogjava.net/lihao336/archive/2010/10/08/333953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BASH 中的字符串处理</title><link>http://www.blogjava.net/lihao336/archive/2010/09/24/332773.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Fri, 24 Sep 2010 13:21:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/09/24/332773.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/332773.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/09/24/332773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/332773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/332773.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/09/24/332773.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/332773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-09-24 21:21 <a href="http://www.blogjava.net/lihao336/archive/2010/09/24/332773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell /bin/bash^M: bad interpreter错误解决</title><link>http://www.blogjava.net/lihao336/archive/2010/06/30/324872.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 30 Jun 2010 05:26:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/06/30/324872.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/324872.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/06/30/324872.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/324872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/324872.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/06/30/324872.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/324872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-06-30 13:26 <a href="http://www.blogjava.net/lihao336/archive/2010/06/30/324872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>僵死（Zombie）进程</title><link>http://www.blogjava.net/lihao336/archive/2010/06/27/324594.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Sun, 27 Jun 2010 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/06/27/324594.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/324594.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/06/27/324594.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/324594.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/324594.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/06/27/324594.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/324594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-06-27 10:53 <a href="http://www.blogjava.net/lihao336/archive/2010/06/27/324594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu网络配置相关</title><link>http://www.blogjava.net/lihao336/archive/2010/06/24/324355.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 24 Jun 2010 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/06/24/324355.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/324355.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/06/24/324355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/324355.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/324355.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/06/24/324355.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/324355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-06-24 20:24 <a href="http://www.blogjava.net/lihao336/archive/2010/06/24/324355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件与目录权限</title><link>http://www.blogjava.net/lihao336/archive/2010/06/18/323760.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 17 Jun 2010 16:23:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/06/18/323760.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/323760.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/06/18/323760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/323760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/323760.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/06/18/323760.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/323760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-06-18 00:23 <a href="http://www.blogjava.net/lihao336/archive/2010/06/18/323760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell 快捷键</title><link>http://www.blogjava.net/lihao336/archive/2010/06/17/323758.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Thu, 17 Jun 2010 14:48:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/06/17/323758.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/323758.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/06/17/323758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/323758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/323758.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/06/17/323758.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/323758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-06-17 22:48 <a href="http://www.blogjava.net/lihao336/archive/2010/06/17/323758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>卸载KDE</title><link>http://www.blogjava.net/lihao336/archive/2010/05/29/322240.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Sat, 29 May 2010 12:54:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/29/322240.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/322240.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/29/322240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/322240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/322240.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/29/322240.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/322240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-29 20:54 <a href="http://www.blogjava.net/lihao336/archive/2010/05/29/322240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调整Close/Maximize/Minimize 按钮的位置</title><link>http://www.blogjava.net/lihao336/archive/2010/05/19/321412.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 19 May 2010 12:52:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/19/321412.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/321412.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/19/321412.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/321412.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/321412.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/19/321412.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/321412.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-19 20:52 <a href="http://www.blogjava.net/lihao336/archive/2010/05/19/321412.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>恢复远程会话--screen工具</title><link>http://www.blogjava.net/lihao336/archive/2010/05/19/321380.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 19 May 2010 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/19/321380.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/321380.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/19/321380.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/321380.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/321380.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/19/321380.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/321380.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-19 15:10 <a href="http://www.blogjava.net/lihao336/archive/2010/05/19/321380.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下C语言编译器gcc不认识bool类型</title><link>http://www.blogjava.net/lihao336/archive/2010/05/12/320735.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Wed, 12 May 2010 10:28:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/12/320735.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/320735.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/12/320735.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/320735.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/320735.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/12/320735.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/320735.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-12 18:28 <a href="http://www.blogjava.net/lihao336/archive/2010/05/12/320735.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>umount 时出现"Device is busy"的解法 [转]</title><link>http://www.blogjava.net/lihao336/archive/2010/05/11/320536.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 10 May 2010 16:06:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/11/320536.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/320536.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/11/320536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/320536.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/320536.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/11/320536.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/320536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-11 00:06 <a href="http://www.blogjava.net/lihao336/archive/2010/05/11/320536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在emacs下进入shell环境</title><link>http://www.blogjava.net/lihao336/archive/2010/05/09/320419.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Sun, 09 May 2010 13:45:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/09/320419.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/320419.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/09/320419.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/320419.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/320419.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/09/320419.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/320419.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-09 21:45 <a href="http://www.blogjava.net/lihao336/archive/2010/05/09/320419.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu 10.04 中文字体问题</title><link>http://www.blogjava.net/lihao336/archive/2010/05/03/319977.html</link><dc:creator>calvin</dc:creator><author>calvin</author><pubDate>Mon, 03 May 2010 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/lihao336/archive/2010/05/03/319977.html</guid><wfw:comment>http://www.blogjava.net/lihao336/comments/319977.html</wfw:comment><comments>http://www.blogjava.net/lihao336/archive/2010/05/03/319977.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lihao336/comments/commentRss/319977.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lihao336/services/trackbacks/319977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/lihao336/archive/2010/05/03/319977.html'>阅读全文</a><img src ="http://www.blogjava.net/lihao336/aggbug/319977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lihao336/" target="_blank">calvin</a> 2010-05-03 22:57 <a href="http://www.blogjava.net/lihao336/archive/2010/05/03/319977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>