﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Only C/C++</title><link>http://www.cppblog.com/cc/</link><description>半亩方塘 天光云影</description><language>zh-cn</language><lastBuildDate>Sun, 14 Mar 2010 14:28:52 GMT</lastBuildDate><pubDate>Sun, 14 Mar 2010 14:28:52 GMT</pubDate><ttl>60</ttl><item><title>UNIX下编译SQLite3.3.6 </title><link>http://www.cppblog.com/cc/archive/2009/09/18/96655.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 18 Sep 2009 09:41:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/09/18/96655.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/96655.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/09/18/96655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/96655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/96655.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt">&nbsp; 虽然现在最新的版本已经新了不少，不过这个功能也可以了，刚好需要在HPUX，AIX以及Solaris都使用它，Redhat下面自带，所以在UNIX下面要编译了一下，这里把Makefile文件做了一些调整，编译通过了。<br><br>解压缩之后不需要再执行 Configure命令了，直接make就可以了，最后会在当前目录下的<strong style="COLOR: #3366ff">.libs</strong>中生成相关的库，连接程序的时候加上这些库就可以了。<br><br>&nbsp;&nbsp;&nbsp;<u>&nbsp;</u><a href="http://www.cppblog.com/Files/cc/sqlite-3.3.6_aix.tar.gz.zip"><u>SQLite3.3.6 下载</u>&nbsp;</a> （<strong style="COLOR: #ff0000">AIX 5.2</strong> &nbsp;XLC++V7测试通过）<br>&nbsp;&nbsp;&nbsp; <a href="http://www.cppblog.com/Files/cc/sqlite-3.3.6_HPUX.tar.gz.zip"><u>SQLite3.3.6 下载</u>&nbsp;</a> （<strong style="COLOR: #ff0000">HPUX 11.23</strong>&nbsp; aCC测试通过）</span><img src ="http://www.cppblog.com/cc/aggbug/96655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-09-18 17:41 <a href="http://www.cppblog.com/cc/archive/2009/09/18/96655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>*.bff文件的安装</title><link>http://www.cppblog.com/cc/archive/2009/09/17/96509.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 17 Sep 2009 03:51:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/09/17/96509.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/96509.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/09/17/96509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/96509.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/96509.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; 今天装了一台AIX5.2的环境，还要装编译器，不过手里只有XLC++.V7版本的，以前在AIX5.2跟5.3的系统上都装过很多遍了，直接使用simt工具，选好程序路径就可以了，基本上以为不会有什么问题，但是今天在装的过程中却遇到了一些意想不到的问题。<br>&nbsp;&nbsp; <br>&nbsp;&nbsp; 系统装好之后，先打了补丁，然后开始装编译器，但是在装的过程中，提示xlmass.lib 4.3.0.0找不到，安装程序目录下面只有xlmass.lib 4.1.0.0的版本，由此造成后面几个关键包也安装不成功，最终导致安装失败。我不停的在光盘里面找啊找，希望能找到4.3.0.0版本的，可是还是没有找到，问题好像进入了死胡同了。<br><br>安装过程实际需要的是下面的版本<br>
<div align=center src_cetemp="/images/cppblog_com/cc/2009_9/xlmass.jpg"><img height=132 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2009_9/xlmass.jpg" width=676 border=0><br></div>
<br>怎么搞呢，有事情问baidu，google，查了半天，终于找到了IBM的XLC++的网页<br><a href="http://www-01.ibm.com/support/docview.wss?rs=0&amp;uid=swg24019560">http://www-01.ibm.com/support/docview.wss?rs=0&amp;uid=swg24019560</a>，是XLC++V7在AIX5.2上面的运行库，里面就有xlmass相关的包，而且是4.4.0.0版本的，比要求的要高了，不知道行不行，不管了，下来再说。tar.Z文件，先用uncompress解压缩，然后再tar xvf就可以了，出来一堆*.bff文件，还真没有用过这个东西，继续baidu，原来在smit工具里面打开就可以了。<br>超级用户模式下，smit installp-&gt;安装软件，选择bff文件所在的路径即可，然后就是安装了，安装过程中提示有错误，但是我要的这几个包好像提交成功了，所以也不管了，装过之后再正常安装XLC++，装完运行xlc命令，大功告成阿。</span><img src ="http://www.cppblog.com/cc/aggbug/96509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-09-17 11:51 <a href="http://www.cppblog.com/cc/archive/2009/09/17/96509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重装系统后ORACLE的恢复的几种方法(转载)</title><link>http://www.cppblog.com/cc/archive/2009/08/19/93812.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Wed, 19 Aug 2009 04:48:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/08/19/93812.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/93812.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/08/19/93812.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/93812.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/93812.html</trackback:ping><description><![CDATA[文章出自：http://www.goceanedu.com.cn/Read_1861.htm <br><br>我的电脑突然挂了，不得不重装系统，不过我的ORACLE装在了D盘，所有的文件都还在，我相信一定能够恢复，直到搞定工作，我才开始整我的数据库，花了两天时间，终于恢复了，庆祝一下，同时总结一下，希望有遇到同样问题的朋友能够快速搞定此类问题 <br><br>第一种： <br>首先，备份数据库(X:\oracle\oradata)下的数据文件，重新命名即可(否则装数据库的时候会提示sid已存在)。重新安装数据库，当然数据库的名字就是你要恢复的名字。安装完成后，打开控制面板，停止oracle的服务。把(X:\oracle\oradata)下新生成的文件改名，把原先目录下的文件恢复名字。再重新启动oracle服务和监听。用sys/as dba 登陆数据库，可能会提示权限不够（ora-01031）修改（X:\oracle\ora92\network\admin )文件夹下的sqlnet.ora文件，添加SQLNET.AUTHENTICATION_SERVICES= (NTS)，增加权限。登陆进去后，打开table提示不能打开。打开common页，执行命令alert database open；这时再刷新table，发现原先的表可以打开了。恢复成功了。再用原先数据库的普通用户进入。发现一切正常。至此，大功告成。 <br><br>第二种：1、首先，将原来的ORACLE文件夹改名，原来的路径是D:/oracle。我暂时改成D:/oracle_old。找来ORACLE（我用的是ORACLE 9I）安装光盘，将ORACLE安装在原来安装的目录下，这样恢复起来更加方便，主要是注册表的内容不用修改。 2、安装完了之后，系统中又有一个可以使用的ORACLE了。这个时候要做的就是将原来的文件和数据恢复过来。第一步，先关闭ORACLE的所有已经启动的项目，在&#8220;服务&#8221;里面逐一关闭。然后，将安装目录改名。我现在用的是D:/oracle。改成D:/oracle_new。再将D:/oracle_old改成D:/oracle。 这样理论上说从物理层面恢复了ORACLE了。但是我们发现，现在还不能启动ORACLE的监听程序和服务程序。我们还要从逻辑上解决。 <br>3、在dos环境下执行一个删除命令：oradim -delete -sid mm，其中mm为创建oracle时候创建的实例 建议执行这个命令后重新启动机器，重启后就可以建立和原来实例名相同的实例。当然你懒，不重新启动也可以，但是你的实例名就不能和原来的一样了。 <br>4、在dos环境下执行命令 oradim -new -sid mm -startmode a -pfile "D:\oracle\admin\mm\pfile\initmm.ora "创建一个新的实例，其中 &#8220;mm&#8220;为新数据库的名称。 <br>5、启动服务，先打开数据库，然后可以用以前的用户名和密码登陆进去。 要补充的是，一般的ORACLE数据库的监听程序都是用电脑的名称来识别地址的，而不是127.0.0.1或者localhost。所以，如果我们安装系统的时候用的是不同的电脑名称（比如我原来用的是wm_mm。重新安装后用的是wenming_mm），那么我们还有一个工作要做，就是修改文件 listener.ora。将里面的相关的东西改过来就可以了。 <br>需要耐心、细心，可能在一步里有一个细小的差别就会出些古怪的错误提示，有时需要根据错误提示采取策略，总之原理是，先装一个一模一样的ORACLE，安装目录、数据库名称都一样，这样保证注册表里不用更改；再覆盖物理文件，最后重新实例化，打开数据库就可以进去了。 <br><br>注：恢复必须要有以下文件 a、初始化参数文件INIT.ORA b、所有数据文件 .dbf c、所有重做日志文件（联机日志、归档日志）redo d、所有控制文件 crtl e、internal密码文件 <br><br><img src ="http://www.cppblog.com/cc/aggbug/93812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-08-19 12:48 <a href="http://www.cppblog.com/cc/archive/2009/08/19/93812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solaris环境下编译头文件的注意事项</title><link>http://www.cppblog.com/cc/archive/2009/07/29/91597.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Wed, 29 Jul 2009 07:45:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/07/29/91597.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/91597.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/07/29/91597.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/91597.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/91597.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 18pt">&nbsp;&nbsp;&nbsp;最近在Solaris上编译程序的时候，发现它的编译器有个奇怪的习惯，就是头文件的最后一行要加上一行回车行，不知道是什么回事，否则就会产生警告，在Solaris上装的就是sun公司自己的sunstudio开发工具，在HPUX跟AIX上都没有这个问题，应该是编译器的事情吧。<br>下面截个图给大家看看，<br></span><br>
<div align=center src_cetemp="/images/cppblog_com/cc/2009_7/error.jpg"><img height=111 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2009_7/error.jpg" width=906 border=0></div><img src ="http://www.cppblog.com/cc/aggbug/91597.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-07-29 15:45 <a href="http://www.cppblog.com/cc/archive/2009/07/29/91597.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简单介绍UNIX下编写定时器程序</title><link>http://www.cppblog.com/cc/archive/2009/06/02/86548.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 02 Jun 2009 07:46:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/06/02/86548.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/86548.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/06/02/86548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/86548.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/86548.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚好写程序的时候要使用定时器，就是定时的做一些操作，网上查了一下，自己也学着写了写，网上倒是说的好多种，我在这里就不做过多介绍了，就说我用的这个，使用<span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: ˎ̥; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><font face=宋体><strong style="COLOR: #0000ff">setitimer</strong>函数。<br><br><strong>函数原型</strong><br></font><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue);<br></span><br><font face=宋体><strong>参数说明</strong><br><br>&nbsp;&nbsp;<em style="COLOR: red">&nbsp;参数which</em><br><em>&nbsp; 参数 which是定时器类型</em><br></font>
<table class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; WIDTH: 100%; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black 1.5pt; mso-yfti-tbllook: 32; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: 1.5pt solid black; mso-border-insidev: 1.5pt solid black" cellSpacing=0 cellPadding=0 width="100%" border=1>
    <tbody>
        <tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
            <td style="BORDER-RIGHT: #ece9d8 1pt inset; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8 1pt inset; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: inset #ECE9D8 .75pt; mso-border-bottom-alt: solid black .25pt; mso-border-right-alt: inset #ECE9D8 .75pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong style="mso-bidi-font-weight: normal"><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">取值</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: #ece9d8 1pt inset; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: inset #ECE9D8 .75pt; mso-border-bottom-alt: solid black .25pt; mso-border-right-alt: inset #ECE9D8 .75pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong style="mso-bidi-font-weight: normal"><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">含义</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></strong></p>
            </td>
            <td style="BORDER-RIGHT: #ece9d8 1pt inset; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1.5pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: inset #ECE9D8 .75pt; mso-border-bottom-alt: solid black .25pt; mso-border-right-alt: inset #ECE9D8 .75pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><strong style="mso-bidi-font-weight: normal"><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">信号发送</span></strong><strong style="mso-bidi-font-weight: normal"><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 1">
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>ITIMER_REAL<o:p></o:p></font></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">定时真实时间，与</span><font face=宋体><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm">alarm</span><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">类型相同。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></font></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>SIGALRM<o:p></o:p></font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 2">
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>ITIMER_VIRT<o:p></o:p></font></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">定时进程在用户态下的实际执行时间。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>SIGVTALRM<o:p></o:p></font></span></p>
            </td>
        </tr>
        <tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes">
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1.5pt solid; WIDTH: 26.4%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt" vAlign=top width="26%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>ITIMER_PROF<o:p></o:p></font></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 49.86%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="49%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">定时进程在用户态和核心态下</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><br></span><span style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: 宋体; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial">的实际执行时间。</span><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><o:p></o:p></span></p>
            </td>
            <td style="BORDER-RIGHT: black 1.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ffffff; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ffffff; WIDTH: 23.74%; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1.5pt solid; BACKGROUND-COLOR: transparent; mso-border-top-alt: solid black 1.5pt; mso-border-left-alt: solid black 1.5pt" vAlign=top width="23%">
            <p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm"><font face=宋体>SIGPROF<o:p></o:p></font></span></p>
            </td>
        </tr>
    </tbody>
</table>
<br><font face=宋体>&nbsp;</font>
<p align=left><span style="FONT-SIZE: 12pt"><font face=宋体>&nbsp;&nbsp; </font>这三种定时器定时完成时给进程发送的信号各不相同，其中ITIMER_REAL类定时器发送SIGALRM信号，ITIMER_VIRT类定时器发送SIGVTALRM信号，<span lang=EN-US style="BORDER-RIGHT: windowtext 1pt; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt; PADDING-LEFT: 0cm; FONT-SIZE: 12pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt; COLOR: black; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt; FONT-FAMILY: Arial; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-border-alt: none windowtext 0cm">ITIMER_PROF</span>类定时器发送SIGPROF信号。</span></p>
<font face="宋体, MS Song">&nbsp;&nbsp;<span style="FONT-SIZE: 14pt"><em style="COLOR: red">&nbsp;参数 value</em><br>&nbsp;&nbsp;&nbsp;结构itimerval描述了定时器的组成。<br></span>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;itimerval&nbsp;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;&nbsp;it_interval;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;下次定时取值&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;&nbsp;it_value;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;本次定时设置值&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000"></span></div>
</font></span><span style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp; <span style="FONT-SIZE: 12pt">结构timeval描述的是精确到微秒的结构。<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">1</span>&nbsp;<span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;timeval&nbsp;<br></span><span style="COLOR: #008080">2</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tv_sec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;秒（1000000微秒）&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tv_usec;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">&nbsp;微妙&nbsp;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">5</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">6</span>&nbsp;<span style="COLOR: #000000"></span></div>
</span></span><font style="FONT-SIZE: 12pt" face=宋体 size=5><br>&nbsp;&nbsp; itimerval结构中的it_value是代表首次定时的时间，而it_interval代表下一次定时的时间，执行完第一次之后，it_interval中的时间会赋值给it_value，周而复始。如果it_value值被设置为0，则定时器停止定时；如果it_value值不为0但it_interval值为0，则定时器在一次定时后终止。<br>&nbsp;&nbsp;&nbsp;setitimer执行成功返回0，否则返回-1<br><br><em>参数ovalue<br></em>&nbsp; 该参数可以使用空值NULL，如果不为空的话，返回的是上一个时刻的定时器状态。<br><br>下面写的一个简单的例子程序。<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000">#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></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unistd.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">signal.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">sys</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;doAction(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sig)</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">你要做的事情</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">让一切痛苦随风而去&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,n</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGALRM,doAction);<br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;setMyTimer(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;val)<br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;itimerval&nbsp;value;<br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_value.tv_sec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">val;<br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_value.tv_usec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_interval.tv_sec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">val;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">val秒</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;value.it_interval.tv_usec</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;signal(SIGALRM,&nbsp;doAction);<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;setitimer(ITIMER_REAL,</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">value,NULL);<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">}<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(&nbsp;</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&nbsp;)<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(argc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;{<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</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: #008000">//</span><span style="COLOR: #008000">第二个参数是定时器的时长的，单位是秒</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">33</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;val</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">atoi(argv[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br></span><span style="COLOR: #008080">34</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,val);<br></span><span style="COLOR: #008080">35</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setMyTimer(val);<br></span><span style="COLOR: #008080">36</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">37</span>&nbsp;<span style="COLOR: #000000">}</span></div>
</font><br>代码就不解释了，就是启动的时候获得第二个参数，用作定时器的时间，然后打印出&#8220;让一切痛苦随风去 0&#8221;，如此循环。<br>在AIX5.2下，使用XLC++V7.0编译通过。<br><br>运行效果如下<br><img height=225 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2009_6/tk.jpg" width=234 border=0><br><img src ="http://www.cppblog.com/cc/aggbug/86548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-06-02 15:46 <a href="http://www.cppblog.com/cc/archive/2009/06/02/86548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主流UNIX命令对比表</title><link>http://www.cppblog.com/cc/archive/2009/04/18/80396.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Sat, 18 Apr 2009 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/04/18/80396.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/80396.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/04/18/80396.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/80396.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/80396.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 18pt" align=center><br><br><a href="http://www.cppblog.com/Files/cc/unix_os.rar"><u>主流UNIX命令对比表下载</u></a></p><img src ="http://www.cppblog.com/cc/aggbug/80396.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-04-18 21:43 <a href="http://www.cppblog.com/cc/archive/2009/04/18/80396.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XMananger不能登录AIX的问题分析</title><link>http://www.cppblog.com/cc/archive/2009/04/13/79538.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 13 Apr 2009 13:33:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2009/04/13/79538.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/79538.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2009/04/13/79538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/79538.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/79538.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 我在使用AIX的过程中，有时候会遇到机器在正常运转，能ping通，telnet也可以上去，但是使用XMananger的时候却上不去，下面总结了我遇到的几种情况，附带一些解决方法，仅供参考。<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一种：磁盘满<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们在写程序的时候，经常会出现一些程序死掉的问题，在Windows系统中，程序死掉就死掉了，重启一下就行了，但是在UNIX环境下，默认情况下程序死掉了都会产生一个core文件，core文件中是程序的内存映射部分，该文件的主要作用是用来帮我们查找问题的故障原因，调试用的。&nbsp;&nbsp;&nbsp;具体的调试需要使用dbx工具，这里不作介绍。在这种情况下，可以设定系统只生成一个core文件，后来生成的core文件会覆盖前面的，这里就需要修改.cshrc文件中的参数，这里使用的是cshell，&nbsp;&nbsp;打开.cshrc文件之后，我们找到如下几行，如果没有的话，自己可以手工填入。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#setenv CORE_NAMING true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setenv CORE_COMPRESS true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setenv CORE_PATH true<br>&nbsp;前面加一个<span style="COLOR: #0000ff">#</span>号代表是注释掉，所以这一行就不起作用了，生成的core文件都叫core，而不再带有日期标记，所以默认就会只生成一个core文件了，但是这种情况下以前的core文件会被覆盖，所以调试以前的程序就不方便了，可能也不知道以前有哪些程序死掉了。<br><br>&nbsp;&nbsp; &nbsp;第二种：hosts文件缺少内容 <br>一般来说，/etc/hosts文件中会有本地主机的IP信息，就算少，也应该有<span style="COLOR: #0000ff"> 127.0.0.1 localhost</span>这样的条目信息，如果没有的话，远程登录上来的时候，可能会进入登录界面，但是输入用户名密码登录之后，界面就会停止，或者问题对话框，点击确定之后就退出系统了，这种情况下要检查hosts文件是否有对应的 IP 与主机名信息，如果没有，需要手工加入。<br><br>&nbsp;&nbsp; 第三种：CDE桌面进程未启动<br>&nbsp; 在系统运行过程中，CDE桌面进程可能死机会宕掉，或者由于其他原因没有启动，所以需要telnet上主机，然后手工启动。<br>启动命令如下：<br><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # /etc/rc.dt<br>&nbsp;</strong><img src ="http://www.cppblog.com/cc/aggbug/79538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2009-04-13 21:33 <a href="http://www.cppblog.com/cc/archive/2009/04/13/79538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX中的inittab 文件（转）</title><link>http://www.cppblog.com/cc/archive/2008/09/08/61305.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 08 Sep 2008 06:32:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/09/08/61305.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/61305.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/09/08/61305.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/61305.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/61305.html</trackback:ping><description><![CDATA[<div id=art style="MARGIN: 15px" width="100%">
<div><font color=#ff0000 size=3><strong>AIX中的inittab 文件（转）原文地址<a href="http://blog.chinaunix.net/u/20198/showart_437679.html">http://blog.chinaunix.net/u/20198/showart_437679.html</a></strong></font></div>
<div><strong><font color=#ff0000 size=3></font></strong></div>
<div><font size=2>/etc/inittab 文件控制着初始化过程。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>/etc/inittab 文件为 init 命令提供脚本作为一个普通进程调度程序。构成 init 命令进程调度活动的主要（多数）进程是 /etc/getty 线进程（line process），发起（启动）专用线进程。被 init 命令特别调度的其他进程为后台进程（Daemon）和shell。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>/etc/inittab 文件由 位置相关［position-dependent ］的条目组成，格式如下：</font></div>
<div style="FONT-SIZE: 12pt"><font size=2></font>&nbsp;</div>
<div style="FONT-SIZE: 12pt"><font color=#0000ff size=2>Identifier:RunLevel:Action:Command</font></div>
<div style="FONT-SIZE: 12pt">&nbsp;</div>
<div style="FONT-SIZE: 12pt"><font size=2>每一个条目都被一个换行字符分隔。一个换行字符前面一个反斜杠 (\) 表示一个条目的延续。/etc/inittab 文件中的条目数目没有限制（而不是指条目的最大长度）。条目的最大长度是 1024 个字符。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>条目字段有：<br><strong>Identifier</strong>： 标识唯一对象的一个 1-4 位字符的字段。<br><strong>RunLevel</strong>： 该条目运行的级别。<br>运行级别有下列属性：<br>&nbsp;&nbsp; - 运行级别有效地符合系统进程的配置。<br>&nbsp;&nbsp; - 由 init 命令启动的每一个进程都被分配一个或多个该进程可存在于之的运行级别。<br>&nbsp;&nbsp; - 运行级别由 0-9 的数字来表示。例如，如果系统运行于级别 1，只有在运行级别字段有 1 的那些条目被启动。<br>&nbsp;&nbsp; - 请求 init 命令改变运行级别时，条目中运行级别字段与目标运行级别不匹配的所有进程都会收到一条警告信号 (SIGTERM)，在进程被删除符号［kill signal (SIGKILL)］强行终止前，有20秒的宽限期。<br>&nbsp;&nbsp; -&nbsp;运行级别字段可为一个进程定义多个运行级别，可以0-9的任意组合。如果没有指定运行级别，进程假定在所有的运行级别有效。<br>&nbsp;&nbsp; - 还有其他四个值会出现在运行级别字段，即使他们并不是真正的运行级别：a, b, c 和 h。在运行级别字段有这些字符的条目仅仅在telinit 命令请求时才运行（与当前的系统运行级别无关）。他们不同于init命令的运行级别，init命令永远不能进入a, b, c, h 运行级别。并且，所有这些进程的运行请求都不改变当前的运行级别。此外，init 命令改变级别时，由a, b, c 命令启动的进程并不断开（killed）。只有当 /etc/inittab 文件中他们的行在action字段标记为 off，他们的行从 /etc/inittab 文件中完全删除，或者init 命令进入单用户模式，这些进程才会被中断（killed）。<br><strong>Action</strong>: 告知 init 命令如何处理在 process 字段指定的进程。init 命令可识别的 actions 如下：<br>&nbsp; <strong>respawn</strong>： 如果进程不存在，则启动进程。却不等待进程终止（继续扫描 /etc/inittab 文件）。如进程死掉，则重启该进程。如进程存在，继续扫描 /etc/inittab 文件。<br>&nbsp; <strong>wait</strong>： 当 init 命令进入匹配某条目的运行级别时，启动该进程并等待该进程的终止。当init命令处于同样的运行级别时，所有对 /etc/inittab 文件随后的读取都会导致 init 命令忽略该条目。<br>&nbsp; <strong>once</strong>： 当 init 命令进入匹配某条目的运行级别时，启动该进程，并且不等待终止。当进程死掉时，也不重启该进程。当系统进入一个新的运行级别时，该进程仍然从之前运行级别的变化运行，程序也不重启。<br>&nbsp; <strong>boot</strong>： 只在系统引导过程中运行的条目，这些进程是系统启动过程中，init 命令从 /etc/inittab 文件中读取的。启动该进程，不等待进程终止，并且进程死掉时，也不重启进程。有意义的指导依次为，运行级别应为默认，或者必须与系统引导时 init 命令的运行级别匹配。此 action 对于系统硬件重启后的初始化功能非常有用。<br>&nbsp;<strong> bootwait</strong>： 系统引导后，init 命令从单用户到多用户状态，第一次运行的条目。启动该进程，并等其终止，进程死时，不重启该进程。如果 initdefault为 2 ，则系统引导后直接运行该进程。<br>&nbsp; <strong>powerfail</strong>： 只有当 init 命令收到一个电源故障信号(SIGPWR)的时候，才执行与此条目相关的进程。<br>&nbsp; <strong>powerwait</strong>： 只有当 init 命令收到一个电源故障信号(SIGPWR)的时候，才执行与此条目相关的进程。并等该进程终止，才继续处理 /etc/inittab 文件。<br>&nbsp; <strong>off</strong>： 如果与该条目相关的进程当前正在运行，发送一个警告信号(SIGTERM)，然后等待 20 秒才用 kill 信号（SIGKILL）终止该进程。如果进程不在运行，忽略该条目。<br>&nbsp; <strong>ondemand</strong>： 功能上与 respawn 相同，不过，此 action 应用 a, b, 或 c 值，而不用运行级别。<br>&nbsp; <strong>initdefault</strong>： init 命令只在 最初调用时才扫描与此 action 相关的条目。如果存在，init 命令使用该条目来决定初始进入的运行级别。一般情况下，使用run-level 字段中指定的最高运行级别来作为初始状态。如果运行级别字段为空，则认作0123456789；因此，init 命令进入运行级别 9 。另外，如果 init 命令在 /etc/inittab 文件中找不到initdefault 条目，则在引导时向用户请求一个初始的运行级别。<br>&nbsp;&nbsp;<strong>sysinit</strong>： 此类型的条目在登录前 init 命令正要访问控制台之前被执行。该条目只被用来初始化设备，init 命令可能会针对这些设备询问运行级别。这些条目被执行，并等待完成后才继续。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2><br><strong>Command</strong>： 可执行的壳（shell）命令。整个 command 字段以 exec 为前缀，并传给一个 forked sh成为 sh -c exec 命令。任何合法的 sh 命令语法都可出现在该字段。并可用 # 插入注释。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>&nbsp;</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>getty 命令覆写 /etc/inittab 文件中出现在它之前所有命令的输出。要在引导日志中记录这些命令的输出，可输送这些输出到 alog -tboot 命令。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>当 init 命令正在处理 inittab 条目时，stdin, stdout, 和 stderr 这些文件描述符（file descriptors）可能是不可用的。所有写入 stdout 或 stderr 的条目不起作用，除非把输出重定向到一个文件或者到 /dev/console。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2></font>&nbsp;</div>
<div style="FONT-SIZE: 12pt"><font color=#0000ff size=2>下列命令是唯一支持在 /etc/inittab 文件中修改记录的方法：<br>mkitab： 把记录添加到 /etc/inittab 文件。<br>lsitab： 列出 /etc/inittab 文件中的记录。<br>chitab： 修改 /etc/inittab 文件中的记录。<br>rmitab： 从 /etc/inittab 文件中删除记录。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2></font>&nbsp;</div>
<div style="FONT-SIZE: 12pt"><font size=2>例如，想在 /etc/inittab 文件中添加一条记录，以运行级别2（run level 2）运行 find 命令并使之一旦完成就再次启动。<br>1. 运行 ps 命令，只显示包含 find 的进程：<br># ps -ef | grep find<br>root 19750 13964 0 10:47:23 pts/0 0:00 grep find<br>#<br>2. 使用 mkitab 命令，在 /etc/inittab 文件中添加一个名为 xcmd 的记录：<br># mkitab "xcmd:2:respawn:find / -type f &gt; /dev/null 2&gt;&amp;1"<br>3. 使用 lsitab 命令显示新记录：<br># lsitab xcmd<br>xcmd:2:respawn:find / -type f &gt; /dev/null 2&gt;&amp;1<br>#<br>4. 查看进程：<br># ps -ef | grep find<br>root 25462 1 6 10:56:58 - 0:00 find / -type f<br>root 28002 13964 0 10:57:00 pts/0 0:00 grep find<br>#<br>5. 取消 find 命令进程：<br># kill 25462<br>6. 查看进程：<br># ps -ef | grep find<br>root 23538 13964 0 10:58:24 pts/0 0:00 grep find<br>root 28966 1 4 10:58:21 - 0:00 find / -type f<br>#</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>本例中，由于 action 字段被配置 respawn，故而每一次该命令一完成，一个新进程就会启动。</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>该进程将继续再生 （re-spawning），除非修改 action 字段，例如：<br>1. 把记录 xcmd 的 action 字段由 respawn 修改为 once：<br># chitab "xcmd:2:once:find / -type f &gt; /dev/null 2&gt;&amp;1"<br>2. 查看进程：<br># ps -ef | grep find<br>root 20378 13964 0 11:07:20 pts/0 0:00 grep find<br>root 28970 1 4 11:05:46 - 0:03 find / -type f<br>3. 取消 find 命令进程：<br># kill 28970<br>4. 查看进程：<br># ps -ef | grep find<br>root 28972 13964 0 11:07:33 pts/0 0:00 grep find<br>#</font></div>
<div style="FONT-SIZE: 12pt"><font size=2>要从 /etc/inittab 文件中删除该记录，可使用 rmitab 命令。例如：<br># rmitab xcmd<br># lsitab xcmd<br>#</font></div>
<div style="FONT-SIZE: 12pt"><font color=#0000ff size=2>/etc/inittab 条目的次序</font></div>
<div style="FONT-SIZE: 12pt"><font color=#0000ff size=2>/etc/inittab 文件中的基本进程条目次序安装如下：<br>1. initdefault<br>2. sysinit<br>3. Powerfailure Detection (powerfail)<br>4. Multiuser check (rc)<br>5. /etc/firstboot (fbcheck)<br>6. System Resource Controller (srcmstr)<br>7. Start TCP/IP daemons (rctcpip)<br>8. Start NFS daemons (rcnfs)<br>9. cron<br>10.pb cleanup (piobe)<br>11.getty for the console (cons)</font></div>
<div style="FONT-SIZE: 12pt"><font color=#0000ff size=2></font>&nbsp;</div>
<div style="FONT-SIZE: 12pt"><font size=2>系统资源控制器 (SRC)必须在 /etc/inittab 文件的开头附近就被启动，因为启动其他的进程需要SRC进程（Daemon）。<br>由于NFS需要TCP/IP进程（Daemon）才能正常运行，所以TCP/IP进程必须在NFS进程之前被启动。<br>/etc/inittab 文件中的条目按相互依赖性排序，就是说，如果一个进程（process2）需要另外一个进程（process1）存在才能正常运行，那么在 /etc/inittab文件中，process1的条目应该在process2的条目之前。</font></div>
</div><img src ="http://www.cppblog.com/cc/aggbug/61305.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-09-08 14:32 <a href="http://www.cppblog.com/cc/archive/2008/09/08/61305.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crontab命令详解（转帖）</title><link>http://www.cppblog.com/cc/archive/2008/09/08/61304.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 08 Sep 2008 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/09/08/61304.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/61304.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/09/08/61304.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/61304.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/61304.html</trackback:ping><description><![CDATA[crontab命令的功能是在一定的时间间隔调度一些命令的执行。在/etc目录下有一个crontab文件，这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。 <br><br>crontab命令有三种形式的命令行结构： <br><br>crontab&nbsp;[-u&nbsp;user]&nbsp;[file] <br><br>crontab&nbsp;[-u&nbsp;user]&nbsp;[-e|-l|-r] <br><br>crontab&nbsp;-l&nbsp;-u&nbsp;[-e|-l|-r]&nbsp;第一个命令行中，file是命令文件的名字。如果在命令行中指定了这个文件，那么执行crontab命令，则将这个文件拷贝到crontabs目录下；如果在命令行中没有制定这个文件，crontab命令将接受标准输入（键盘）上键入的命令，并将他们也存放在crontab目录下。 <br><br>命令行中-r选项的作用是从/usr/spool/cron/crontabs目录下删除用户定义的文件crontab； <br><br>命令行中-l选项的作用是显示用户crontab文件的内容。 <br><br>使用命令crontab&nbsp;-u&nbsp;user&nbsp;-e命令编辑用户user的cron(c)作业。用户通过编辑文件来增加或修改任何作业请求。 <br><br>执行命令crontab&nbsp;-u&nbsp;user&nbsp;-r即可删除当前用户的所有的cron作业。 <br><br>作业与它们预定的时间储存在文件/usr/spool/cron/crontabs/username里。username使用户名，在相应的文件中存放着该用户所要运行的命令。命令执行的结果，无论是标准输出还是错误输出，都将以邮件形式发给用户。文件里的每一个请求必须包含以spaces和tabs分割的六个域。前五个字段可以取整数值，指定何时开始工作，第六个域是字符串，称为命令字段，其中包括了crontab调度执行的命令。 <br><br>第一道第五个字段的整数取值范围及意义是： <br><br>0～59&nbsp;表示分 <br><br>1～23&nbsp;表示小时 <br><br>1～31&nbsp;表示日 <br><br>1～12&nbsp;表示月份 <br><br>0～6&nbsp;表示星期（其中0表示星期日） <br><br>/usr/lib/cron/cron.allow表示谁能使用crontab命令。如果它是一个空文件表明没有一个用户能安排作业。如果这个文件不存在，而有另外一个文件/usr/lib/cron/cron.deny,则只有不包括在这个文件中的用户才可以使用crontab命令。如果它是一个空文件表明任何用户都可安排作业。两个文件同时存在时cron.allow优先，如果都不存在，只有超级用户可以安排作业。<br><img src ="http://www.cppblog.com/cc/aggbug/61304.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-09-08 14:18 <a href="http://www.cppblog.com/cc/archive/2008/09/08/61304.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT Designer中安装QWT插件</title><link>http://www.cppblog.com/cc/archive/2008/09/05/60987.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 05 Sep 2008 04:54:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/09/05/60987.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/60987.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/09/05/60987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/60987.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/60987.html</trackback:ping><description><![CDATA[<span style="FONT-SIZE: 14pt">&nbsp; QWT是一套非常不错的开发库，它能结合QT开发，做出非常好的<font style="FONT-SIZE: 14pt" size=2>曲线，刻度，表盘等效果来。<br><br>&nbsp; qwt的下载以及动态链接库的编译等这里就不做介绍了。在源码目录下可以找到designer目录，其中有插件的源码，编译完之后就会生成qwtplugin.dll和qwtplugin.lib，把他们拷贝到<font face=Arial>$(QTDIR)\plugins\designer目录下，重新启动QT Designer，就会看到ToolBox面板中多出了Qwt类，如下图所示。以上在QT3.3.4下测试通过，<a style="COLOR: red" href="http://www.cppblog.com/Files/cc/qwtplugin.rar"><u>qwtplugin.dll和qwtplugin.lib下载<br></u></a>
<div align=center src_cetemp="/images/cppblog_com/cc/2008_9/qwt.jpg"><img height=648 alt="" src="http://www.cppblog.com/images/cppblog_com/cc/2008_9/qwt.jpg" width=843 border=0></div>
</font></font></span><img src ="http://www.cppblog.com/cc/aggbug/60987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-09-05 12:54 <a href="http://www.cppblog.com/cc/archive/2008/09/05/60987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C实现转动的短棒</title><link>http://www.cppblog.com/cc/archive/2008/08/29/60340.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Fri, 29 Aug 2008 03:18:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/08/29/60340.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/60340.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/08/29/60340.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/60340.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/60340.html</trackback:ping><description><![CDATA[<p><font style="FONT-SIZE: 14pt; BACKGROUND-COLOR: #c7edcc">&nbsp;&nbsp;&nbsp;在UNIX环境下的文字界面工作时，如过程序在运行等待，可能就会看到转动的短棒，表示程序正在执行中，今天刚好看到资料，上面说了一下，我就按照意思写了一个，不知道别的是怎么实现的，反正下面的代码看似能工作了，不过正式使用可能还需要改进吧。<br><br></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</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><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_30_309_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_309_Open_Text.style.display='none'; Codehighlighter1_30_309_Closed_Image.style.display='inline'; Codehighlighter1_30_309_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_309_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_309_Closed_Text.style.display='none'; Codehighlighter1_30_309_Open_Image.style.display='inline'; Codehighlighter1_30_309_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_30_309_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_30_309_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;c;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_74_276_Open_Image onclick="this.style.display='none'; Codehighlighter1_74_276_Open_Text.style.display='none'; Codehighlighter1_74_276_Closed_Image.style.display='inline'; Codehighlighter1_74_276_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_74_276_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_74_276_Closed_Text.style.display='none'; Codehighlighter1_74_276_Open_Image.style.display='inline'; Codehighlighter1_74_276_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_74_276_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_74_276_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\\</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;c</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c\b</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;sleep(</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
</font><br><br>以上代码在DEV-CPP 4.9.9.2中测试通过<br><img src ="http://www.cppblog.com/cc/aggbug/60340.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-08-29 11:18 <a href="http://www.cppblog.com/cc/archive/2008/08/29/60340.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言获取目录中文件名</title><link>http://www.cppblog.com/cc/archive/2008/08/28/60292.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 28 Aug 2008 10:10:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/08/28/60292.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/60292.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/08/28/60292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/60292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/60292.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include&nbsp;&nbsp;&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">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">dirent.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#include&nbsp;&nbsp;&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">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;typedef&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList&nbsp;<br><img id=Codehighlighter1_103_176_Open_Image onclick="this.style.display='none'; Codehighlighter1_103_176_Open_Text.style.display='none'; Codehighlighter1_103_176_Closed_Image.style.display='inline'; Codehighlighter1_103_176_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_103_176_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_103_176_Closed_Text.style.display='none'; Codehighlighter1_103_176_Open_Image.style.display='inline'; Codehighlighter1_103_176_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_103_176_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_103_176_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;filename[</span><span style="COLOR: #000000">64</span><span style="COLOR: #000000">];&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">next;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">FILENODE;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_218_224_Open_Image onclick="this.style.display='none'; Codehighlighter1_218_224_Open_Text.style.display='none'; Codehighlighter1_218_224_Closed_Image.style.display='inline'; Codehighlighter1_218_224_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_218_224_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_218_224_Closed_Text.style.display='none'; Codehighlighter1_218_224_Open_Image.style.display='inline'; Codehighlighter1_218_224_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>FILENODE</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;&nbsp;getFiles(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">dir</span><span id=Codehighlighter1_218_224_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span><span id=Codehighlighter1_218_224_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000">文目录</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_227_838_Open_Image onclick="this.style.display='none'; Codehighlighter1_227_838_Open_Text.style.display='none'; Codehighlighter1_227_838_Closed_Image.style.display='inline'; Codehighlighter1_227_838_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_227_838_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_227_838_Closed_Text.style.display='none'; Codehighlighter1_227_838_Open_Image.style.display='inline'; Codehighlighter1_227_838_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_227_838_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_227_838_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;DIR&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">directory_pointer;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;dirent&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">entry;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;directory_pointer</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">opendir(dir);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;FileList&nbsp;start;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;FileList&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">filesNode;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;start.next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=&amp;</span><span style="COLOR: #000000">start;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;((entry</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">readdir(directory_pointer))</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)&nbsp;<br><img id=Codehighlighter1_498_732_Open_Image onclick="this.style.display='none'; Codehighlighter1_498_732_Open_Text.style.display='none'; Codehighlighter1_498_732_Closed_Image.style.display='inline'; Codehighlighter1_498_732_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_498_732_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_498_732_Closed_Text.style.display='none'; Codehighlighter1_498_732_Open_Image.style.display='inline'; Codehighlighter1_498_732_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_498_732_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_498_732_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)malloc(</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;FileList));&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;filename,entry</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;d_name);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;closedir(directory_pointer);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">start.next;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;filesNode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;main()&nbsp;<br><img id=Codehighlighter1_855_1186_Open_Image onclick="this.style.display='none'; Codehighlighter1_855_1186_Open_Text.style.display='none'; Codehighlighter1_855_1186_Closed_Image.style.display='inline'; Codehighlighter1_855_1186_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_855_1186_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_855_1186_Closed_Text.style.display='none'; Codehighlighter1_855_1186_Open_Image.style.display='inline'; Codehighlighter1_855_1186_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_855_1186_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_855_1186_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;FileList&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">filesNode;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;dir[</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">]</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">D:\\down</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">getFiles(dir);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(filesNode</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">NULL)<br><img id=Codehighlighter1_991_1031_Open_Image onclick="this.style.display='none'; Codehighlighter1_991_1031_Open_Text.style.display='none'; Codehighlighter1_991_1031_Closed_Image.style.display='inline'; Codehighlighter1_991_1031_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_991_1031_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_991_1031_Closed_Text.style.display='none'; Codehighlighter1_991_1031_Open_Image.style.display='inline'; Codehighlighter1_991_1031_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_991_1031_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_991_1031_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">没有成功</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(filesNode)&nbsp;<br><img id=Codehighlighter1_1059_1144_Open_Image onclick="this.style.display='none'; Codehighlighter1_1059_1144_Open_Text.style.display='none'; Codehighlighter1_1059_1144_Closed_Image.style.display='inline'; Codehighlighter1_1059_1144_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1059_1144_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1059_1144_Closed_Text.style.display='none'; Codehighlighter1_1059_1144_Open_Image.style.display='inline'; Codehighlighter1_1059_1144_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_1059_1144_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_1059_1144_Open_Text><span style="COLOR: #000000">{&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;filename);&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;filesNode</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">filesNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">&nbsp;next;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div><img src ="http://www.cppblog.com/cc/aggbug/60292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-08-28 18:10 <a href="http://www.cppblog.com/cc/archive/2008/08/28/60292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Broadcom NetXtrem II网卡Linux安装指南（转载）</title><link>http://www.cppblog.com/cc/archive/2008/05/29/51494.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 29 May 2008 09:01:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/05/29/51494.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/51494.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/05/29/51494.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/51494.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/51494.html</trackback:ping><description><![CDATA[<div class=postText>
<p align=center><strong><font face=宋体 color=#000080 size=4>Broadcom NetXtrem II网卡Linux安装指南<br></font></strong></p>
<p>&nbsp;
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%" bgColor=#ffffff colSpan=2><strong><font face=宋体></font></strong><strong><font face=宋体>适用机型:</font></strong></td>
        </tr>
        <tr vAlign=top>
            <td width="100%" colSpan=2><strong><font face=宋体 color=#000080>所有BladeCenter HS21; 所有BladeCenter LS21; 所有BladeCenter LS41; 所有System x3550; 所有System x3650; 所有System x3655; 所有System x3755</font></strong></td>
        </tr>
    </tbody>
</table>
<br>
<table cellSpacing=0 cellPadding=0 width="100%" border=0>
    <tbody>
        <tr vAlign=top>
            <td width="100%" bgColor=#ffffff colSpan=2><strong><font face=宋体>文档内容：</font></strong></td>
        </tr>
    </tbody>
</table>
<br><font face=宋体>Broadcom NetXtreme II GbE网卡驱动有两种格式：source RPM 和tar格式。文件名分别为bnx2-&lt;version&gt;.src.rpm 和 bnx2-&lt;version&gt;.tar.gz</font><br><font face=宋体>下载地址：http://www-1.ibm.com/support/docview.wss?uid=psg1MIGR-64538</font><br><br><strong><font face=宋体>Source RPM 驱动包的安装步骤</font></strong><br><font face=宋体>=============================</font><br><font face=宋体>1. 安装source RPM包：</font><br><font face=宋体>rpm -ivh bnx2-&lt;version&gt;.src.rpm</font><br><br><font face=宋体>2. 进入/usr/src路径并编译</font><br><font face=宋体>cd /usr/src/{redhat,OpenLinux,turbo,packages,rpm ..}</font><br><font face=宋体>rpm -bb SPECS/bnx2.spec</font><br><font face=宋体>或者</font><br><font face=宋体>rpmbuild -bb SPECS/bnx2.spec (针对RPM version 4.x.x)</font><br><font face=宋体>注意：不同内核的linux版本，其rpm路径不同</font><br><br><font face=宋体>3. 安装刚刚编译好的包</font><br><font face=宋体>rpm -ivh RPMS/i386/bnx2-&lt;version&gt;.i386.rpm</font><br><font face=宋体>驱动被安装到如下路径</font><br><br><font face=宋体>对于2.4.x kernels:</font><br><font face=宋体>/lib/modules/&lt;kernel_version&gt;/kernel/drivers/net/bnx2.o</font><br><font face=宋体>对于2.6.0 kernels:</font><br><font face=宋体>/lib/modules/&lt;kernel_version&gt;/kernel/drivers/net/bnx2.ko</font><br><br><font face=宋体>4. 加载驱动:</font><br><font face=宋体>insmod bnx2.o</font><br><font face=宋体>或</font><br><font face=宋体>insmod bnx2.ko (在 2.6.x kernels)</font><br><font face=宋体>或</font><br><font face=宋体>modprobe bnx2</font><br><font face=宋体>5. 配置网卡地址、网关等等</font><br><br><strong><font face=宋体>TAR驱动包的安装步骤</font></strong><br><font face=宋体>=============================</font><br><font face=宋体>1. 创建一个目录并将文件解包</font><br><font face=宋体>tar xvzf bnx2-&lt;version&gt;.tar.gz</font><br><br><font face=宋体>2. 编译驱动bnx2.o (或bnx2.ko)，生成可加载的模块</font><br><font face=宋体>cd src</font><br><font face=宋体>make</font><br><br><font face=宋体>3. 通过加载模块对其进行测试</font><br><font face=宋体>insmod bnx2.o</font><br><font face=宋体>或</font><br><font face=宋体>insmod bnx2.ko (在2.6.x kernels)</font><br><font face=宋体>或</font><br><font face=宋体>insmod bnx2</font><br><br><font face=宋体>4. 安装驱动</font><br><font face=宋体>make install</font><br><font face=宋体>驱动被安装的位置与RPM方式安装的位置一样</font><br><br><font face=宋体>5. 配置网卡地址、网关等等</font> </p>
</div><img src ="http://www.cppblog.com/cc/aggbug/51494.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-05-29 17:01 <a href="http://www.cppblog.com/cc/archive/2008/05/29/51494.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AIX环境下获取当前程序所在路径</title><link>http://www.cppblog.com/cc/archive/2008/04/03/46192.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 03 Apr 2008 10:04:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2008/04/03/46192.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/46192.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2008/04/03/46192.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/46192.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/46192.html</trackback:ping><description><![CDATA[<br><br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#include</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></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#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></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_49_206_Open_Image onclick="this.style.display='none'; Codehighlighter1_49_206_Open_Text.style.display='none'; Codehighlighter1_49_206_Closed_Image.style.display='inline'; Codehighlighter1_49_206_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_49_206_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_49_206_Closed_Text.style.display='none'; Codehighlighter1_49_206_Open_Image.style.display='inline'; Codehighlighter1_49_206_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()</span><span id=Codehighlighter1_49_206_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_49_206_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;buffer[</span><span style="COLOR: #000000">260</span><span style="COLOR: #000000">];<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;getcwd(&nbsp;buffer,&nbsp;sizeof(buffer)&nbsp;)&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;NULL&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perror(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">getcwd&nbsp;error</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;buffer&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
&nbsp;参考了msdn _getcwd 函数<img src ="http://www.cppblog.com/cc/aggbug/46192.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2008-04-03 18:04 <a href="http://www.cppblog.com/cc/archive/2008/04/03/46192.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix平台下的常用命令技巧之 tar包、压缩与解压缩 </title><link>http://www.cppblog.com/cc/archive/2007/11/12/36430.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Mon, 12 Nov 2007 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/11/12/36430.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/36430.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/11/12/36430.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/36430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/36430.html</trackback:ping><description><![CDATA[在Unix下常遇到一些解包、压包的问题。一般情况下将若干文件或文件夹打成tar包，是为了便于文件的传输和管理。例如，通过FTP从Unix平台下载目录结构较多的文件夹到Windows平台或另外一Unix平台，虽然文件夹不是太大，但由于每个文件很小，且非常多，每个文件都要进行文件头、尾检查校验。下载速度会非常慢。如果打成tar包，传输就会快很多。存档的文件夹打成tar包也容易管理。<br>值得注意的是：tar文件只是将文件或文件夹打包，并没有进行压缩。如果文本文件较多，对其压缩会节省很大的磁盘空间，传输将更快。压缩和解压缩方法可以参考下文给出的示例。<br>下面我以Sun Solaris 5.8（其他unix如linux、aix大体相同）为例，就常见的一些问题向各位同仁作一下介绍，供大家在工作中参考。因水平有限，仅做抛砖引玉，欢迎大家积极补充。<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>1、如何解开.tgz或.tar.gz文件？<br>2、如何解开.z或.Z文件？<br>3、如何解开.tar.Z文件？<br>4、如何安装、卸载、列出rpm包信息？（linux常用）<br>5、如何使用tar命令测试、展开、生成tgz包？<br>6、如何解开和生成tar文件？<br>7、如何象在PC上的ARJ那样的分解打包软件?<br>8、在Unix下如何压缩文件？<br>9、如何解开和生成其他包如.jar文件？<br>10、抛砖引玉，待同仁补充<br>&nbsp;<br>============================================================<br>1、如何才能解开.tgz或.tar.gz文件？<br>&nbsp;<br>1）方法一：<br>gzip -d filename.tar.gz&nbsp;&nbsp; 或 gzip -d filename.tgz<br>tar -xvf filename.tar<br>2）方法二：<br>解压并列表：<br>gzip -dc filename.tgz | tar xvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #解.tgz文件<br>gzip -dc filename.tar.gz | tar xvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #.tar.gz 同 .tgz文件<br>只列表不生成文件：<br>gzip -dc filename.tgz | tar tvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #解.tgz文件<br>gzip -dc filename.tar.gz | tar tvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #.tar.gz 同 .tgz文件<br>gzip的其他使用方法参见gzip -h<br>============================================================<br>2、如何才能解开.z或.Z文件？<br>&nbsp;<br>1）解.z 文件: gzcat filename.z<br>2）解.Z 文件：uncompress -c filename.Z<br>============================================================<br>3、如何解.tar.Z文件？<br>&nbsp;<br>1）解压并列表：<br>zcat filename.tar.Z | tar xvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #解.tar.Z文件<br>uncompress -c tast.tar.Z | xvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #uncompress -c 同 zcat<br>2）只列表不生成文件：<br>zcat filename.tar.Z | tar tvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #解.tar.Z文件<br>uncompress -c filename.tar.Z | tvf -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #uncompress -c 同 zcat<br>============================================================<br>4、如何安装、卸载、列出rpm包信息？（linux常用）<br>&nbsp;<br>1)安装rpm包时显示进度<br>&nbsp;&nbsp;&nbsp;&nbsp; 例如：用-vh参数，如rpm -ivh ipchains-1.3.6-1.i386.rpm<br>2)直接通过ftp来安装rpm包<br>&nbsp;&nbsp;&nbsp;&nbsp; 例如：rpm -i <a href="ftp://ftp.xxx.xxx/">ftp://ftp.xxx.xxx</a><br>3)校验所有的rpm包，查找丢失的文件<br>例如：rpm &#8211;Va<br>4)查找一个文件属于哪个rpm包<br>&nbsp;&nbsp;&nbsp;&nbsp; 例如：rpm -qf /usr/bin/who<br>5)列出一个rpm包的描述信息<br>&nbsp;&nbsp;&nbsp;&nbsp; 例如：rpm -qpi mon-0.37j-1.i386.rpm<br>6)列出一个rpm包的文件信息<br>例如：rpm -qpl mon-0.37j-1.i386.rpm<br>7)列出并过滤已经安装的包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：rpm &#8211;q |grep IBM<br>8)删除已安装的包<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例如：rpm &#8211;e 包名<br>9)其他rpm操作参见#rpm --help<br>============================================================<br>5、如何使用tar命令测试、展开、生成tgz包？<br>&nbsp;<br>tar zvfx filename.tgz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #在当前目录下展开这个包<br>tar zvft filename.tgz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #只测试不展开<br>tar zvfx filename.tgz -C /new-dir&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #展开后放到/new-dir目录下<br>tar zvfc filename.tgz /filename&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #把/filename目录下所有的文件及子目录打包成filename.tgz<br>============================================================<br>6、如何解开和生成tar文件？<br>&nbsp;<br>tar xvf filename.tar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #当先目录解包<br>tar tvf filename.tar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #只显示不生成文件<br>tar cvf filename.tar &lt;file or dir list&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #生成包<br>tar的参数很多，要仔细学习参见#tar -h <br>============================================================<br>7、如何象在PC上的ARJ那样的分解打包软件?<br>&nbsp;<br># split -b 100k big.file<br>&nbsp;&nbsp; 将big.file分解成若干500K的小文件 (名为xa, xb, xc, ...)<br># split -l 500 big.file<br>&nbsp;&nbsp; 将big.file分解成每个500 lines的小文件<br>其它使用方法参见split &#8211;h<br>&nbsp;<br>============================================================<br>8、在Unix下如何压缩文件？<br>&nbsp;<br>在unix下压缩方法有多种，可以参见gzip、gunzip、zcat、compress等工具文档，也可以参见上面所述的一些方法。下面仅以compress命令示例：<br>&nbsp;<br>例如：需要将/filename的文件打包并压缩，需要做以下步骤：<br>1）打包<br>tar cvf filename.tar ./dir<br>2）压缩<br>compress filename.tar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #生成filename.tar.Z文件<br>如果还原回原来的目录结构<br>1）解压缩<br>uncompress filename.tar.Z<br>3）解tar包<br>tar xvf filename.tar<br>&nbsp;<br>如果unix命令参数不熟悉，一般也可以通过ftp将压缩或打包文件传到PC上，利用Windows下的Winzip或rar等压缩工具解开。<br>&nbsp;<br>==========================================================<br>9、如何解开和生成其他包如.jar文件？<br>&nbsp;<br>在unix上生成和解开jar包和对tar包的操作差不多。<br>例如：<br>jar cvf filename.jar /dirname&nbsp;&nbsp;&nbsp; #将/dirname 打成jar包<br>jar xvf filename.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #解开jar包<br>jar tvf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename.jar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #只列表不解开jar包<br>&nbsp;<br>&nbsp;<br><img src ="http://www.cppblog.com/cc/aggbug/36430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-11-12 11:41 <a href="http://www.cppblog.com/cc/archive/2007/11/12/36430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT中求取中文字符串的长度</title><link>http://www.cppblog.com/cc/archive/2007/10/16/34371.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 16 Oct 2007 12:40:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/10/16/34371.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/34371.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/10/16/34371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/34371.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/34371.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 14pt">&nbsp;&nbsp;&nbsp;在使用QT编程的时候，我们处理字符串一般都使用的QT自带的QString类型，这个类型类似于STL中的string类型，还是非常好用的。不过QT的编码方式使用Unicode，我猜测真是由于这个原因，再使用QString的length()方法返回字符串长度的时候就会出现偏差，对于一般的西文字母是没有问题的，但是对于中文字符却有问题了，它把一个中文字符当作一个字节来处理了，所以像字符串&#8220;你好QT&#8221;的长度返回的是4，而不是6。<br><br>问题出现了，那么我们需要怎么解决呢，思路很简单，就是转换编码，然后再进行长度的求取，QT的文档里面有好多函数，试验了半天，终于找到一个合适的函数，顺利的完成了我的要求。该函数就是fromLocal8Bit ( const char * local8Bit, int len = -1 )<br><br><span style="FONT-SIZE: 14pt"><strong><em>QCString QString::local8Bit () const <br>以本地指定的格式返回字符串。在X11系统中，使用QTextCodec::codecForLocale()。 在Windows系统中，它是一种系统指定的编码方式。在Mac OS X中，使用uft8作为编码方式。<br></em></strong><br>&nbsp;有了上面的铺垫，下面就问题就好办了，要想求取带中文的字符串的长度，只需要稍微多走一步而已。假设有字符串str="QT你好",那么我们主要进行str.local8Bit().length(),这样结果就是6，符合我们的要求了，事情就是这样，此文完！</span></p><img src ="http://www.cppblog.com/cc/aggbug/34371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-10-16 20:40 <a href="http://www.cppblog.com/cc/archive/2007/10/16/34371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转帖】常见的几个Qt编程问题的处理</title><link>http://www.cppblog.com/cc/archive/2007/09/27/33041.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Thu, 27 Sep 2007 10:21:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/09/27/33041.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/33041.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/09/27/33041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/33041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/33041.html</trackback:ping><description><![CDATA[１、如果在窗体关闭前自行判断是否可关闭<br>答：重新实现这个窗体的closeEvent()函数，加入判断操作<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>void MainWindow::closeEvent(QCloseEvent *event)<br>{<br>&nbsp; &nbsp; &nbsp; if (maybeSave())<br>&nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; writeSettings();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="COLOR: blue">event-&gt;accept();</span><br>&nbsp; &nbsp; &nbsp; }<br>&nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="COLOR: blue">event-&gt;ignore();</span><br>&nbsp; &nbsp; &nbsp; }<br>}<br></blockquote><br><br>２、如何用打开和保存文件对话<br>答：使用QFileDialog<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="COLOR: blue">QString fileName = QFileDialog::getOpenFileName(this);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!fileName.isEmpty())</span><br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; loadFile(fileName);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br></blockquote><br><br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&nbsp; &nbsp; &nbsp; <span style="COLOR: blue">QString fileName = QFileDialog::getSaveFileName(this);<br>&nbsp; &nbsp; &nbsp; if (fileName.isEmpty())</span><br>&nbsp; &nbsp; &nbsp; {<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br>&nbsp; &nbsp; &nbsp; }<br></blockquote><br><br>３、如果创建Actions(可在菜单和工具栏里使用这些Action)<br>答：<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>newAct = new QAction(QIcon(":/images/new.png"), tr("&amp;New"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; newAct-&gt;setShortcut(tr("Ctrl+N"));<br>&nbsp; &nbsp; &nbsp; &nbsp; newAct-&gt;setStatusTip(tr("Create a new file"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(newAct, SIGNAL(triggered()), this, SLOT(newFile()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; openAct = new QAction(QIcon(":/images/open.png"), tr("&amp;Open..."), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; openAct-&gt;setShortcut(tr("Ctrl+O"));<br>&nbsp; &nbsp; &nbsp; &nbsp; openAct-&gt;setStatusTip(tr("Open an existing file"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(openAct, SIGNAL(triggered()), this, SLOT(open()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; saveAct = new QAction(QIcon(":/images/save.png"), tr("&amp;Save"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; saveAct-&gt;setShortcut(tr("Ctrl+S"));<br>&nbsp; &nbsp; &nbsp; &nbsp; saveAct-&gt;setStatusTip(tr("Save the document to disk"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(saveAct, SIGNAL(triggered()), this, SLOT(save()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; saveAsAct = new QAction(tr("Save &amp;As..."), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; saveAsAct-&gt;setStatusTip(tr("Save the document under a new name"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(saveAsAct, SIGNAL(triggered()), this, SLOT(saveAs()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; exitAct = new QAction(tr("E&amp;xit"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; exitAct-&gt;setShortcut(tr("Ctrl+Q"));<br>&nbsp; &nbsp; &nbsp; &nbsp; exitAct-&gt;setStatusTip(tr("Exit the application"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(exitAct, SIGNAL(triggered()), this, SLOT(close()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; cutAct = new QAction(QIcon(":/images/cut.png"), tr("Cu&amp;t"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; cutAct-&gt;setShortcut(tr("Ctrl+X"));<br>&nbsp; &nbsp; &nbsp; &nbsp; cutAct-&gt;setStatusTip(tr("Cut the current selection's contents to the "<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "clipboard"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(cutAct, SIGNAL(triggered()), textEdit, SLOT(cut()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; copyAct = new QAction(QIcon(":/images/copy.png"), tr("&amp;Copy"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; copyAct-&gt;setShortcut(tr("Ctrl+C"));<br>&nbsp; &nbsp; &nbsp; &nbsp; copyAct-&gt;setStatusTip(tr("Copy the current selection's contents to the "<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "clipboard"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(copyAct, SIGNAL(triggered()), textEdit, SLOT(copy()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; pasteAct = new QAction(QIcon(":/images/paste.png"), tr("&amp;Paste"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; pasteAct-&gt;setShortcut(tr("Ctrl+V"));<br>&nbsp; &nbsp; &nbsp; &nbsp; pasteAct-&gt;setStatusTip(tr("Paste the clipboard's contents into the current "<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "selection"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(pasteAct, SIGNAL(triggered()), textEdit, SLOT(paste()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; aboutAct = new QAction(tr("&amp;About"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; aboutAct-&gt;setStatusTip(tr("Show the application's About box"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));<br><br>&nbsp; &nbsp; &nbsp; &nbsp; aboutQtAct = new QAction(tr("About &amp;Qt"), this);<br>&nbsp; &nbsp; &nbsp; &nbsp; aboutQtAct-&gt;setStatusTip(tr("Show the Qt library's About box"));<br>&nbsp; &nbsp; &nbsp; &nbsp; connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt()));<br></blockquote><br>４、如果创建主菜单<br>答：采用上面的QAction的帮助，创建主菜单<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&nbsp; &nbsp; &nbsp; fileMenu = menuBar()-&gt;addMenu(tr("&amp;File"));<br>&nbsp; &nbsp; &nbsp; &nbsp; fileMenu-&gt;addAction(newAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; fileMenu-&gt;addAction(openAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; fileMenu-&gt;addAction(saveAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; fileMenu-&gt;addAction(saveAsAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; fileMenu-&gt;addSeparator();<br>&nbsp; &nbsp; &nbsp; &nbsp; fileMenu-&gt;addAction(exitAct);<br><br>&nbsp; &nbsp; &nbsp; &nbsp; editMenu = menuBar()-&gt;addMenu(tr("&amp;Edit"));<br>&nbsp; &nbsp; &nbsp; &nbsp; editMenu-&gt;addAction(cutAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; editMenu-&gt;addAction(copyAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; editMenu-&gt;addAction(pasteAct);<br><br>&nbsp; &nbsp; &nbsp; &nbsp; menuBar()-&gt;addSeparator();<br><br>&nbsp; &nbsp; &nbsp; &nbsp; helpMenu = menuBar()-&gt;addMenu(tr("&amp;Help"));<br>&nbsp; &nbsp; &nbsp; &nbsp; helpMenu-&gt;addAction(aboutAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; helpMenu-&gt;addAction(aboutQtAct);<br></blockquote><br><br>５、如果创建工具栏<br>答：采用上面的QAction的帮助，创建工具栏<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&nbsp; &nbsp; &nbsp; fileToolBar = addToolBar(tr("File"));<br>&nbsp; &nbsp; &nbsp; &nbsp; fileToolBar-&gt;addAction(newAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; fileToolBar-&gt;addAction(openAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; fileToolBar-&gt;addAction(saveAct);<br><br>&nbsp; &nbsp; &nbsp; &nbsp; editToolBar = addToolBar(tr("Edit"));<br>&nbsp; &nbsp; &nbsp; &nbsp; editToolBar-&gt;addAction(cutAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; editToolBar-&gt;addAction(copyAct);<br>&nbsp; &nbsp; &nbsp; &nbsp; editToolBar-&gt;addAction(pasteAct);<br></blockquote><br>６、如何使用配置文件保存配置<br>答：使用QSettings类<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&nbsp; &nbsp; &nbsp; QSettings settings("Trolltech", "Application Example");<br>&nbsp; &nbsp; &nbsp; &nbsp; QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint();<br>&nbsp; &nbsp; &nbsp; &nbsp; QSize size = settings.value("size", QSize(400, 400)).toSize();<br></blockquote><br><br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&nbsp; &nbsp; &nbsp; QSettings settings("Trolltech", "Application Example");<br>&nbsp; &nbsp; &nbsp; &nbsp; settings.setValue("pos", pos());<br>&nbsp; &nbsp; &nbsp; &nbsp; settings.setValue("size", size());<br></blockquote><br><br>７、如何使用警告、信息等对话框<br>答：使用QMessageBox类的静态方法<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>int ret = QMessageBox::warning(this, tr("Application"),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tr("The document has been modified.\n"<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "Do you want to save your changes?"),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QMessageBox::Yes | QMessageBox::Default,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QMessageBox::No,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; QMessageBox::Cancel | QMessageBox::Escape);<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (ret == QMessageBox::Yes)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return save();<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if (ret == QMessageBox::Cancel)<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return false;<br></blockquote><br><br>８、如何使通用对话框中文化<br>答：对话框的中文化<br>比如说，QColorDialog的与文字相关的部分，主要在qcolordialog.cpp文件中，我们可以从qcolordialog.cpp用 lupdate生成一个ts文件，然后用自定义这个ts文件的翻译，再用lrelease生成一个.qm文件，当然了，主程序就要改变要支持多国语言了，使用这个.qm文件就可以了。<br><br>另外，还有一个更快的方法，在源代码解开后有一个目录translations，下面有一些.ts, .qm文件，我们拷贝一个：<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>cp src/translations/qt_untranslated.ts ./qt_zh_CN.ts<br></blockquote><br>然后，我们就用Linguist打开这个qt_zh_CN.ts，进行翻译了，翻译完成后，保存后，再用lrelease命令生成qt_zh_CN.qm，这样，我们把它加入到我们的qt project中，那些系统的对话框，菜单等等其它的默认是英文的东西就能显示成中文了。<br><br>９、在Windows下Qt里为什么没有终端输出？<br>答：把下面的配置项加入到.pro文件中<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>win32:CONFIG += console<br></blockquote><br><br>10、Qt 4 for X11 OpenSource版如何静态链接？<br>答：编译安装的时候加上-static选项<br>
<h6 class=quote>Quote:</h6>
<blockquote>./configure -static&nbsp; ／／一定要加static选项<br>gmake<br>gmake install<br></blockquote><br>然后，在Makefile文件中加 static 选项或者在.pro文件中加上QMAKE_LFLAGS += -static，就可以连接静态库了。<br><br>11、想在源代码中直接使用中文，而不使用tr()函数进行转换，怎么办？<br>答：在main函数中加入下面三条语句，但并不提倡<br>
<h6 class=quote>Quote:</h6>
<blockquote>&nbsp; &nbsp; QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));<br>QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));<br>QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));<br></blockquote><br>或者<br>
<h6 class=quote>Quote:</h6>
<blockquote>&nbsp; &nbsp; QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));<br>QTextCodec::setCodecForCStrings(QTextCodec::codecForName("GBK"));<br>QTextCodec::setCodecForTr(QTextCodec::codecForName("GBK"));<br></blockquote><br>使用GBK还是使用UTF-8，依源文件中汉字使用的内码而定<br>这样，就可在源文件中直接使用中文，比如：<br>
<h6 class=quote>Quote:</h6>
<blockquote>QMessageBox::information(NULL, "信息", "关于本软件的演示信息", QMessageBox::Ok, QMessageBox::NoButtons);<br></blockquote><br><br>12、为什么将开发的使用数据库的程序发布到其它机器就连接不上数据库？<br>答：这是由于程序找不到数据库插件而致，可照如下解决方法：<br>在main函数中加入下面语句：<br>
<h6 class=quote>Quote:</h6>
<blockquote>QApplication::addLibraryPath(strPluginsPath");<br></blockquote><br>strPluginsPath是插件所在目录，比如此目录为/myapplication/plugins<br>则将需要的sql驱动，比如qsqlmysql.dll, qsqlodbc.dll或对应的.so文件放到<br>/myapplication/plugins/sqldrivers/<br>目录下面就行了<br>这是一种解决方法，还有一种通用的解决方法，即在可执行文件目录下写qt.conf文件，把系统相关的一些目录配置写到qt.conf文件里，详细情况情参考Qt Document Reference里的qt.conf部分<br><br><br>13、如何创建QT使用的DLL(.so)以及如何使用此DLL(.so)<br>答：创建DLL时其工程使用lib模板<br>
<h6 class=quote>Quote:</h6>
<blockquote>TEMPLATE=lib<br></blockquote><br>而源文件则和使用普通的源文件一样，注意把头文件和源文件分开，因为在其它程序使用此DLL时需要此头文件<br>在使用此DLL时，则在此工程源文件中引入DLL头文件，并在.pro文件中加入下面配置项：<br>
<h6 class=quote>Quote:</h6>
<blockquote>LIBS += -Lyourdlllibpath -lyourdlllibname<br></blockquote><br>Windows下和Linux下同样（Windows下生成的DLL文件名为yourdlllibname.dll而在Linux下生成的为libyourdlllibname.so<br><br>14、如何启动一个外部程序<br>答：可使用QProcess和QThread这两个类结合使用的方法来处理，以防止在主线程中调用而导致阻塞的情况<br>先从QThread继承一个类，重新实现run()函数：<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>class MyThread : public QThread<br>{<br>public:<br>&nbsp; &nbsp; void run();<br>};<br><br>void MyThread::run()<br>{<br>&nbsp; &nbsp; QProcess::execute("notepad.exe");<br>}<br></blockquote><br>这样，在使用的时候则可定义一个MyThread类型的成员变量，使用时调用其start()方法：<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>class ...............<br>{...........<br>MyThread thread;<br>............<br>};<br><br>.....................<br>thread.start();<br></blockquote><br><br>15、如何打印报表<br>答：Qt目前对报表打印支持的库还很少，不过有种变通的方法，就是使用XML+XSLT+XSL-FO来进行报表设计，XML输出数据，用XSLT将XML数据转换为XSL-FO格式的报表，由于现在的浏览器不直接支持XSL-FO格式的显示，所以暂时可用工具(Apache FOP, Java做的)将XSL-FO转换为PDF文档来进行打印，转换和打印由FOP来做，生成XSL-FO格式的报表可以由Qt来生成，也可以由其它内容转换过来，比如有工具(html2fo)将HTML转换为XSL-FO。<br><br>16、如何在系统托盘区显示图标<br>答：在4.2及其以上版本中使用QSystemTrayIcon类来实现<br><br>17、怎样将日志输出到文件中<br>答：（myer提供）<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>void myMessageOutput( QtMsgType type, const char *msg )<br>{<br>&nbsp; &nbsp; switch ( type ) {<br>&nbsp; &nbsp; &nbsp; &nbsp; case QtDebugMsg:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //写入文件；<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br>&nbsp; &nbsp; &nbsp; &nbsp; case QtWarningMsg:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;<br>&nbsp; &nbsp; &nbsp; &nbsp; case QtFatalMsg:<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; abort();<br>&nbsp; &nbsp; }<br>}<br><br>int main( int argc, char** argv )<br>{<br>&nbsp; &nbsp; QApplication app( argc, argv );<br>&nbsp; &nbsp; qInstallMsgHandler( myMessageOutput );<br>&nbsp; &nbsp; ......<br>&nbsp; &nbsp; return app.exec();<br>}<br></blockquote><br>qDebug(), qWarning(), qFatal()分别对应以上三种type。<br><br>18、如何将图像编译到可执行程序中去<br>答：使用.qrc文件<br>写.qrc文件，例如：<br>res.qrc<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>&lt;!DOCTYPE RCC&gt;&lt;RCC version="1.0"&gt;<br>&lt;qresource&gt;<br>&nbsp; &nbsp; &lt;file&gt;images/copy.png&lt;/file&gt;<br>&nbsp; &nbsp; &lt;file&gt;images/cut.png&lt;/file&gt;<br>&nbsp; &nbsp; &lt;file&gt;images/new.png&lt;/file&gt;<br>&nbsp; &nbsp; &lt;file&gt;images/open.png&lt;/file&gt;<br>&nbsp; &nbsp; &lt;file&gt;images/paste.png&lt;/file&gt;<br>&nbsp; &nbsp; &lt;file&gt;images/save.png&lt;/file&gt;<br>&lt;/qresource&gt;<br>&lt;/RCC&gt;<br></blockquote><br>然后在.pro中加入下面代码：<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>RESOURCES&nbsp; &nbsp; = res.qrc<br></blockquote><br><br>在程序中使用：<br>
<h6 class=quote>Quote:</h6>
<blockquote><br>...<br>:images/copy.png<br>...<br></blockquote><br><br>19、如何制作不规则形状的窗体或部件<br>答：请参考下面的帖子<br><a href="http://www.qtcn.org/bbs/read.php?tid=8681" target=_blank><font color=#2f5fa1>http://www.qtcn.org/bbs/read.php?tid=8681</font></a><img src ="http://www.cppblog.com/cc/aggbug/33041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-09-27 18:21 <a href="http://www.cppblog.com/cc/archive/2007/09/27/33041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>extern "C"转帖</title><link>http://www.cppblog.com/cc/archive/2007/09/19/32476.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Wed, 19 Sep 2007 06:18:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/09/19/32476.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/32476.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/09/19/32476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/32476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/32476.html</trackback:ping><description><![CDATA[<p>时常在cpp的代码之中看到这样的代码:&nbsp; </p>
<p>#ifdef __cplusplu* <br>**tern "C" { <br>#endif </p>
<p>//一段代码 </p>
<p>#ifdef __cplusplus <br>} <br>#endif&nbsp; </p>
<p>　　这样的代码到底是什么意思呢？首先，__cplusplus是cpp中的自定义宏，那么定义了这个宏的话表示这是一段cpp的代码，也就是说，上面的代码的含义是:如果这是一段cpp的代码，那么加入extern "C"{和}处理其中的代码。 </p>
<p>　　要明白为何使用extern "C"，还得从cpp中对函数的重载处理开始说起。在c++中，为了支持重载机制，在编译生成的汇编码中，要对函数的名字进行一些处理，加入比如函数的返回类型等等.而在C中，只是简单的函数名字而已，不会加入其他的信息.也就是说:C++和C对产生的函数名字的处理是不一样的. </p>
<p>　　比如下面的一段简单的函数，我们看看加入和不加入extern "C"产生的汇编代码都有哪些变化: </p>
<p>int f(void) <br>{ <br>return 1; <br>}&nbsp; </p>
<p>　　在加入extern "C"的时候产生的汇编代码是: </p>
<p>.file "test.cxx" <br>.text <br>.align 2 <br>.globl _f <br>.def _f; .scl 2; .type 32; .endef <br>_f: <br>pushl %ebp <br>movl %esp， %ebp <br>movl $1， %eax <br>popl %ebp <br>ret&nbsp; </p>
<p>　　但是不加入了extern "C"之后 </p>
<p>.file "test.cxx" <br>.text <br>.align 2 <br>.globl __Z1fv <br>.def __Z1fv; .scl 2; .type 32; .endef <br>__Z1fv: <br>pushl %ebp <br>movl %esp， %ebp <br>movl $1， %eax <br>popl %ebp <br>ret&nbsp; </p>
<p>　　两段汇编代码同样都是使用gcc -S命令产生的，所有的地方都是一样的，唯独是产生的函数名，一个是_f，一个是__Z1fv。 </p>
<p>　　明白了加入与不加入extern "C"之后对函数名称产生的影响，我们继续我们的讨论:为什么需要使用extern "C"呢？C++之父在设计C++之时，考虑到当时已经存在了大量的C代码，为了支持原来的C代码和已经写好C库，需要在C++中尽可能的支持C，而extern "C"就是其中的一个策略。&nbsp; <br>试想这样的情况:一个库文件已经用C写好了而且运行得很良好，这个时候我们需要使用这个库文件，但是我们需要使用C++来写这个新的代码。如果这个代码使用的是C++的方式链接这个C库文件的话，那么就会出现链接错误.我们来看一段代码:首先，我们使用C的处理方式来写一个函数，也就是说假设这个函数当时是用C写成的: </p>
<p>//f1.c <br>extern "C" <br>{ <br>void f1() <br>{ <br>return; <br>} <br>}&nbsp; </p>
<p>　　编译命令是:gcc -c f1.c -o f1.o 产生了一个叫f1.o的库文件。再写一段代码调用这个f1函数: </p>
<p>// test.cxx <br>//这个extern表示f1函数在别的地方定义，这样可以通过 <br>//编译，但是链接的时候还是需要 <br>//链接上原来的库文件. <br>extern void f1(); </p>
<p>int main() <br>{ <br>f1(); </p>
<p>return 0; <br>}&nbsp; </p>
<p>　　通过gcc -c test.cxx -o test.o 产生一个叫test.o的文件。然后，我们使用gcc test.o f1.o来链接两个文件，可是出错了，错误的提示是: </p>
<p>test.o(.text + 0x1f):test.cxx: undefine reference to 'f1()'&nbsp; </p>
<p>　　也就是说，在编译test.cxx的时候编译器是使用C++的方式来处理f1()函数的，但是实际上链接的库文件却是用C的方式来处理函数的，所以就会出现链接过不去的错误:因为链接器找不到函数。 </p>
<p>　　因此，为了在C++代码中调用用C写成的库文件，就需要用extern "C"来告诉编译器:这是一个用C写成的库文件，请用C的方式来链接它们。 </p>
<p>　　比如，现在我们有了一个C库文件，它的头文件是f.h，产生的lib文件是f.lib，那么我们如果要在C++中使用这个库文件，我们需要这样写: <br>extern "C" <br>{ <br>＃i nclude "f.h" <br>}&nbsp; </p>
<p>　　回到上面的问题，如果要改正链接错误，我们需要这样子改写test.cxx: </p>
<p>extern "C" <br>{ <br>extern void f1(); <br>} </p>
<p>int main() <br>{ <br>f1(); </p>
<p>return 0; <br>}&nbsp; </p>
<p>　　重新编译并且链接就可以过去了. </p>
<p>　　总结 </p>
<p>　　C和C++对函数的处理方式是不同的.extern "C"是使C++能够调用C写作的库文件的一个手段，如果要对编译器提示使用C的方式来处理函数的话，那么就要使用extern "C"来说明。 <br>&nbsp;</p>
<p>&nbsp;<br>&nbsp;<br>&nbsp;<br>作者：宋宝华&nbsp; e-mail:21cnbao@21cn.com　出处：太平洋电脑网</p>
<p>1.引言</p>
<p>C++语言的创建初衷是&#8220;a better C&#8221;，但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言，C++保留了一部分过程式语言的特点（被世人称为&#8220;不彻底地面向对象&#8221;），因而它可以定义不属于任何类的全局变量和函数。但是，C++毕竟是一种面向对象的程序设计语言，为了支持函数的重载，C++对全局函数的处理方式与C有明显的不同。</p>
<p>2.从标准头文件说起</p>
<p>某企业曾经给出如下的一道面试题：</p>
<p>面试题</p>
<p>为什么标准头文件都有类似以下的结构？</p>
<p>&nbsp;&nbsp; #ifndef __INCvxWorksh</p>
<p>&nbsp;&nbsp; #define __INCvxWorksh</p>
<p>&nbsp;&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; extern "C" {</p>
<p>&nbsp;&nbsp; #endif</p>
<p>&nbsp;&nbsp; /*...*/</p>
<p>&nbsp;&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; #endif</p>
<p>&nbsp;&nbsp; #endif /* __INCvxWorksh */</p>
<p>分析</p>
<p>显然，头文件中的编译宏&#8220;#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif&#8221; 的作用是防止该头文件被重复引用。</p>
<p>那么</p>
<p>&nbsp;&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; extern "C" {</p>
<p>&nbsp;&nbsp; #endif</p>
<p>&nbsp; #ifdef __cplusplus</p>
<p>&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp; #endif</p>
<p>的作用又是什么呢？我们将在下文一一道来。</p>
<p>3.深层揭密extern "C"</p>
<p>extern "C" 包含双重含义，从字面上即可得到：首先，被它修饰的目标是&#8220;extern&#8221;的；其次，被它修饰的目标是&#8220;C&#8221;的。让我们来详细解读这两重含义。</p>
<p>（1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被extern "C"限定的函数或变量是extern类型的；</p>
<p>extern是C/C++语言中表明函数和全局变量作用范围（可见性）的关键字，该关键字告诉编译器，其声明的函数和变量可以在本模块或其它模块中使用。记住，下列语句：</p>
<p>extern int a;</p>
<p>仅仅是一个变量的声明，其并不是在定义变量a，并未为a分配内存空间。变量a在所有模块中作为一种全局变量只能被定义一次，否则会出现连接错误。</p>
<p>通常，在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如，如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样，模块B中调用模块A中的函数时，在编译阶段，模块B虽然找不到该函数，但是并不会报错；它会在连接阶段中从模块A编译生成的目标代码中找到此函数。</p>
<p>与extern对应的关键字是static，被它修饰的全局变量和函数只能在本模块中使用。因此，一个函数或变量只可能被本模块使用时，其不可能被extern &#8220;C&#8221;修饰。</p>
<p>（2）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的；</p>
<p>未加extern &#8220;C&#8221;声明时的编译方式</p>
<p>首先看看C++中对类似C的函数是怎样编译的。</p>
<p>作为一种面向对象的语言，C++支持函数重载，而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如，假设某个函数的原型为：</p>
<p>void foo( int x, int y );</p>
<p>该函数被C编译器编译后在符号库中的名字为_foo，而C++编译器则会产生像_foo_int_int之类的名字（不同的编译器可能生成的名字不同，但是都采用了相同的机制，生成的新名字称为&#8220;mangled name&#8221;）。_foo_int_int这样的名字包含了函数名、函数参数数量及类型信息，C++就是靠这种机制来实现函数重载的。例如，在C++中，函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的，后者为_foo_int_float。</p>
<p>同样地，C++中的变量除支持局部变量外，还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名，我们以"."来区分。而本质上，编译器在进行编译时，与函数的处理相似，也为类中的变量取了一个独一无二的名字，这个名字与用户程序中同名的全局变量名字不同。</p>
<p>未加extern "C"声明时的连接方式</p>
<p>假设在C++中，模块A的头文件如下：</p>
<p>// 模块A头文件　moduleA.h</p>
<p>#ifndef MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp; int foo( int x, int y );</p>
<p>#endif</p>
<p>在模块B中引用该函数：</p>
<p>// 模块B实现文件　moduleB.cpp</p>
<p>＃i nclude "moduleA.h"</p>
<p>foo(2,3);</p>
<p>实际上，在连接阶段，连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号！</p>
<p>加extern "C"声明后的编译和连接方式</p>
<p>加extern "C"声明后，模块A的头文件变为：</p>
<p>// 模块A头文件　moduleA.h</p>
<p>#ifndef MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #define MODULE_A_H</p>
<p>&nbsp;&nbsp;&nbsp; extern "C" int foo( int x, int y );</p>
<p>#endif</p>
<p>在模块B的实现文件中仍然调用foo( 2,3 )，其结果是：</p>
<p>（1）模块A编译生成foo的目标代码时，没有对其名字进行特殊处理，采用了C语言的方式；</p>
<p>（2）连接器在为模块B的目标代码寻找foo(2,3)调用时，寻找的是未经修改的符号名_foo。</p>
<p>如果在模块A中函数声明了foo为extern "C"类型，而模块B中包含的是extern int foo( int x, int y ) ，则模块B找不到模块A中的函数；反之亦然。</p>
<p>所以，可以用一句话概括extern &#8220;C&#8221;这个声明的真实目的（任何语言中的任何语法特性的诞生都不是随意而为的，来源于真实世界的需求驱动。我们在思考问题时，不能只停留在这个语言是怎么做的，还要问一问它为什么要这么做，动机是什么，这样我们可以更深入地理解许多问题）：</p>
<p>实现C++与C及其它语言的混合编程。</p>
<p>明白了C++中extern "C"的设立动机，我们下面来具体分析extern "C"通常的使用技巧。</p>
<p>4.extern "C"的惯用法</p>
<p>（1）在C++中引用C语言中的函数和变量，在包含C语言头文件（假设为cExample.h）时，需进行下列处理：</p>
<p>extern "C"</p>
<p>{</p>
<p>＃i nclude "cExample.h"</p>
<p>}</p>
<p>而在C语言的头文件中，对其外部函数只能指定为extern类型，C语言中不支持extern "C"声明，在.c文件中包含了extern "C"时会出现编译语法错误。</p>
<p>笔者编写的C++引用C函数例子工程中包含的三个文件的源代码如下：</p>
<p>/* c语言头文件：cExample.h */</p>
<p>#ifndef C_EXAMPLE_H</p>
<p>#define C_EXAMPLE_H</p>
<p>extern int add(int x,int y);</p>
<p>#endif</p>
<p>/* c语言实现文件：cExample.c */</p>
<p>＃i nclude "cExample.h"</p>
<p>int add( int x, int y )</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;</p>
<p>}</p>
<p>// c++实现文件，调用add：cppFile.cpp</p>
<p>extern "C"</p>
<p>{</p>
<p>＃i nclude "cExample.h"</p>
<p>}</p>
<p>int main(int argc, char* argv[])</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add(2,3);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p>
<p>}</p>
<p>如果C++调用一个C语言编写的.DLL时，当包括.DLL的头文件或声明接口函数时，应加extern "C" {　}。</p>
<p>（2）在C中引用C++语言中的函数和变量时，C++的头文件需添加extern "C"，但是在C语言中不能直接引用声明了extern "C"的该头文件，应该仅将C文件中将C++中定义的extern "C"函数声明为extern类型。</p>
<p>笔者编写的C引用C++函数例子工程中包含的三个文件的源代码如下：</p>
<p>//C++头文件 cppExample.h</p>
<p>#ifndef CPP_EXAMPLE_H</p>
<p>#define CPP_EXAMPLE_H</p>
<p>extern "C" int add( int x, int y );</p>
<p>#endif</p>
<p>//C++实现文件 cppExample.cpp</p>
<p>＃i nclude "cppExample.h"</p>
<p>int add( int x, int y )</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x + y;</p>
<p>}</p>
<p>/* C实现文件 cFile.c</p>
<p>/* 这样会编译出错：＃i nclude "cExample.h" */</p>
<p>extern int add( int x, int y );</p>
<p>int main( int argc, char* argv[] )</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add( 2, 3 );&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p>
<p>}</p><img src ="http://www.cppblog.com/cc/aggbug/32476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-09-19 14:18 <a href="http://www.cppblog.com/cc/archive/2007/09/19/32476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说明以下关键字的作用 auto static register const volatile extern </title><link>http://www.cppblog.com/cc/archive/2007/09/11/32033.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Tue, 11 Sep 2007 15:33:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/09/11/32033.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/32033.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/09/11/32033.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/32033.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/32033.html</trackback:ping><description><![CDATA[<h3><font size=2>(1)auto </font></h3>
<p><font size=2>　　这个这个关键字用于声明<span class=hilite3>变量</span>的生存期为自动，即将不在任何类、结构、枚举、联合和函数中定义的<span class=hilite3>变量</span>视为全局<span class=hilite3>变量</span>，而在函数中定义的<span class=hilite3>变量</span>视为局部<span class=hilite3>变量</span>。这个关键字不怎么多写，因为所有的<span class=hilite3>变量</span>默认就是auto的。 </font></p>
<p><a name=register><font size=2></font></a></p>
<h3><font size=2>(2)register </font></h3>
<p><font size=2>　　这个关键字命令编译器<font color=red>尽可能</font>的将<span class=hilite3>变量</span>存在<span class=hilite1>C</span>PU内部寄存器中而不是通过内存寻址访问以提高效率。 </font><a name=static></a></p>
<h3><font size=2>(3)stati<span class=hilite1>c</span> </font></h3>
<p><font size=2>　　常见的两种用途: <br>　　　　1&gt;统计函数被调用的次数; <br>　　　　2&gt;减少局部数组建立和赋值的开销.<span class=hilite3>变量</span>的建立和赋值是需要一定的处理器开销的，特别是数组等含有较多元素的存储类型。在一些含有较多的<span class=hilite3>变量</span>并且被经常调用的函数中，可以将一些数组声明为stati<span class=hilite1>c</span>类型，以减少建立或者初始化这些<span class=hilite3>变量</span>的开销. </font></p>
<p><font size=2>　　详细说明: <br>　　　　1&gt;、<span class=hilite3>变量</span>会被放在程序的全局存储区中，这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈<span class=hilite3>变量</span>和堆<span class=hilite3>变量</span>的区别。 <br>　　　　2&gt;、<span class=hilite3>变量</span>用stati<span class=hilite1>c</span>告知编译器，自己仅仅在<span class=hilite3>变量</span>的作用范围内可见。这一点是它与全局<span class=hilite3>变量</span>的区别。 <br>　　　　<font color=red>3&gt;当stati<span class=hilite1>c</span>用来修饰全局<span class=hilite3>变量</span>时，它就改变了全局<span class=hilite3>变量</span>的作用域，使其不能被别的程序<span class=hilite2>extern</span>，限制在了当前文件里，但是没有改变其存放位置，还是在全局静态储存区。</font> </font>
<p><font size=2>　　使用注意: <br>　　　　1&gt;若全局<span class=hilite3>变量</span>仅在单个<span class=hilite1>C</span>文件中访问，则可以将这个<span class=hilite3>变量</span>修改为静态全局<span class=hilite3>变量</span>，以降低模块间的耦合度； <br>　　　　2&gt;若全局<span class=hilite3>变量</span>仅由单个函数访问，则可以将这个<span class=hilite3>变量</span>改为该函数的静态局部<span class=hilite3>变量</span>，以降低模块间的耦合度； <br>　　　　3&gt;设计和使用访问动态全局<span class=hilite3>变量</span>、静态全局<span class=hilite3>变量</span>、静态局部<span class=hilite3>变量</span>的函数时，需要考虑重入问题(只要输入数据相同就应产生相同的输出)。 </font><a name=const></a></p>
<h3><font size=2>(4)<span class=hilite1>c</span>onst </font></h3>
<p><font size=2>　　被<span class=hilite1>c</span>onst修饰的东西都受到强制保护，可以预防意外的变动，能提高程序的健壮性。它可以修饰函数的参数、返回值，甚至函数的定义体。 </font></p>
<p><font size=2>　　作用: <br>　　　　1&gt;修饰输入参数 <br>　　　　　　a.对于非内部数据类型的输入参数，应该将&#8220;值传递&#8221;的方式改为&#8220;<span class=hilite1>c</span>onst引用传递&#8221;，目的是提高效率。例如将void Fun<span class=hilite1>c</span>(A a) 改为void Fun<span class=hilite1>c</span>(<span class=hilite1>c</span>onst A &amp;a)。 <br>　　　　　　b.对于内部数据类型的输入参数，不要将&#8220;值传递&#8221;的方式改为&#8220;<span class=hilite1>c</span>onst引用传递&#8221;。否则既达不到提高效率的目的，又降低了函数的可理解性。例如void Fun<span class=hilite1>c</span>(int x) 不应该改为void Fun<span class=hilite1>c</span>(<span class=hilite1>c</span>onst int &amp;x)。 <br>　　　　2&gt;用<span class=hilite1>c</span>onst修饰函数的返回值 <br>　　　　　　a.如果给以&#8220;指针传递&#8221;方式的函数返回值加<span class=hilite1>c</span>onst修饰，那么函数返回值（即指针）的内容不能被修改，该返回值只能被赋给加<span class=hilite1>c</span>onst修饰的同类型指针。 <br>　　　　　　　如对于： <span class=hilite1>c</span>onst <span class=hilite1>c</span>har * GetString(void); <br>　　　　　　　如下语句将出现编译错误： <br>　　　　　　 　<span class=hilite1>c</span>har *str = GetString();//<span class=hilite1>c</span>annot <span class=hilite1>c</span>onvert from '<span class=hilite1>c</span>onst <span class=hilite1>c</span>har *' to '<span class=hilite1>c</span>har *'； <br>　　　　　　　正确的用法是： <br>　　　　　　　<span class=hilite1>c</span>onst <span class=hilite1>c</span>har *str = GetString(); <br>　　　　　　b.如果函数返回值采用&#8220;值传递方式&#8221;，由于函数会把返回值复制到外部临时的存储单元中，加<span class=hilite1>c</span>onst修饰没有任何价值。 如不要把函数int GetInt(void) 写成<span class=hilite1>c</span>onst int GetInt(void)。 <br>　　　　3&gt;<span class=hilite1>c</span>onst成员函数的声明中，<span class=hilite1>c</span>onst关键字只能放在函数声明的尾部,表示该类成员不修改对象. </font>
<p><font size=2>　　　说明： <br>　　　　<span class=hilite1>c</span>onst type m; //修饰m为不可改变 <br>　　　示例： <br>　　　　typedef <span class=hilite1>c</span>har * pStr; //新的类型pStr; <br>　　　　<span class=hilite1>c</span>har string[4] = "ab<span class=hilite1>c</span>"; <br>　　　　<span class=hilite1>c</span>onst <span class=hilite1>c</span>har *p1 = string； <br>　　　　p1++; //正确，上边修饰的是*p1,p1可变 <br>　　　　<span class=hilite1>c</span>onst pStr p2 = string; <br>　　　　p2++; //错误，上边修饰的是p2，p2不可变,*p2可变 <br>　　　同理，<span class=hilite1>c</span>onst修饰指针时用此原则判断就不会混淆了。 <br>　　　　<span class=hilite1>c</span>onst int *value; //*value不可变，value可变 <br>　　　　int* <span class=hilite1>c</span>onst value; //value不可变，*value可变 <br>　　　　<span class=hilite1>c</span>onst (int *) value; //(int *)是一种type,value不可变,*value可变 <br>　　　　　　　　　　　　　　//逻辑上这样理解，编译不能通过，需要tydef int* NewType; <br>　　　　<span class=hilite1>c</span>onst int* <span class=hilite1>c</span>onst value;//*value,value都不可变 </font><a name=volatile></a></p>
<h3><font size=2>(5)volatile </font></h3>
<p><font size=2>　　表明某个<span class=hilite3>变量</span>的值可能在外部被改变，优化器在用到这个<span class=hilite3>变量</span>时必须每次都小心地重新读取这个<span class=hilite3>变量</span>的值，而不是使用保存在寄存器里的备份。它可以适用于基础类型如：int,<span class=hilite1>c</span>har,long......也适用于<span class=hilite1>C</span>的结构和<span class=hilite1>C</span>++的类。当对结构或者类对象使用volatile修饰的时候，结构或者类的所有成员都会被视为volatile. <br>　　该关键字在多线程环境下经常使用，因为在编写多线程的程序时，同一个<span class=hilite3>变量</span>可能被多个线程修改，而程序通过该<span class=hilite3>变量</span>同步各个线程。 <br>　　简单示例： <br>　　　DWORD __std<span class=hilite1>c</span>all threadFun<span class=hilite1>c</span>(LPVOID signal) <br>　　　{ <br>　　　　　int* intSignal=reinterpret_<span class=hilite1>c</span>ast(signal); <br>　　　　　*intSignal=2; <br>　　　　　while(*intSignal!=1) <br>　　　　　sleep(1000); <br>　　　　　return 0; <br>　　　} <br>　　该线程启动时将intSignal 置为2，然后循环等待直到intSignal 为1 时退出。显然intSignal的值必须在外部被改变，否则该线程不会退出。但是实际运行的时候该线程却不会退出，即使在外部将它的值改为1，看一下对应的伪汇编代码就明白了： <br>　　　　　mov ax,signal <br>　　　　　label: <br>　　　　　if(ax!=1) <br>　　　　　goto label <br>　　对于<span class=hilite1>C</span>编译器来说，它并不知道这个值会被其他线程修改。自然就把它<span class=hilite1>c</span>a<span class=hilite1>c</span>he在寄存器里面。<span class=hilite1>C</span> 编译器是没有线程概念的,这时候就需要用到volatile。volatile 的本意是指：这个值可能会在当前线程外部被改变。也就是说，我们要在threadFun<span class=hilite1>c</span>中的intSignal前面加上volatile关键字，这时候，编译器知道该<span class=hilite3>变量</span>的值会在外部改变，因此每次访问该<span class=hilite3>变量</span>时会重新读取，所作的循环变为如下面伪码所示： <br>　　　　　label: <br>　　　　　mov ax,signal <br>　　　　　if(ax!=1) <br>　　　　　goto label </font></p>
<p><font size=2>　　<font color=red>注意：</font>一个参数既可以是<span class=hilite1>c</span>onst同时是volatile，是volatile因为它可能被意想不到地改变。它是<span class=hilite1>c</span>onst因为程序不应该试图去修改它。 </font><a name=extern></a></p>
<h3><font size=2>(6)<span class=hilite2>extern</span> </font></h3>
<p><font size=2>　　<span class=hilite2>extern</span> 意为&#8220;外来的&#8221;&#183;&#183;&#183;它的作用在于告诉编译器：有这个<span class=hilite3>变量</span>，它可能不存在当前的文件中，但它肯定要存在于工程中的某一个源文件中或者一个Dll的输出中。</font></p><img src ="http://www.cppblog.com/cc/aggbug/32033.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-09-11 23:33 <a href="http://www.cppblog.com/cc/archive/2007/09/11/32033.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>QT读取中文文件</title><link>http://www.cppblog.com/cc/archive/2007/08/25/30824.html</link><dc:creator>JetSun</dc:creator><author>JetSun</author><pubDate>Sat, 25 Aug 2007 12:28:00 GMT</pubDate><guid>http://www.cppblog.com/cc/archive/2007/08/25/30824.html</guid><wfw:comment>http://www.cppblog.com/cc/comments/30824.html</wfw:comment><comments>http://www.cppblog.com/cc/archive/2007/08/25/30824.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/cc/comments/commentRss/30824.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/cc/services/trackbacks/30824.html</trackback:ping><description><![CDATA[<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;虽然C++标准中有了文件读取的相关类，也很好用，但是在涉及到QT编程的时候却用起来不方便了，因为QT本身很多组件都是关联的自身的QString类型的字符串，所以再用C++本身String类型的时候就不是那么方便了，需要进行转化，这样给程序带来了复杂度，同时也带来了转化的开销，所以如果用QT开发，可以就用它本身所带的这些类型进行处理，形成一个系统，便于数据在程序之中的交互和共用。<br>&nbsp;&nbsp;&nbsp;QT很好，但是在处理中文或者其他语言的时候要注意编码格式，如果没有注意，读取文件的时候可能读出来的就是乱码或者干脆程序就死掉了，这是我们所不愿意看到的，下面就讲讲怎么样通过QT的类来读取中文文件。</span><br><br><span style="COLOR: #000000">介绍部分<br>&nbsp;&nbsp;&nbsp;我们需要用到几个头文件中的类：<br>#include&nbsp;&lt;qstring.h&gt;<br>#include&nbsp;&lt;qfile.h&gt;<br>#include&nbsp;&lt;qtextstream.h&gt;<br>#include&nbsp;&lt;qtextcodec.h&gt;<br></span><br>
<p style="COLOR: #000000"><span style="FONT-SIZE: 14pt"><strong>QString</strong></span><br><br>QString类提供了一个Unicode文本和经典的C以零结尾的字符数组的抽象。 <br>QString使用隐含共享，这使它非常有效率并且很容易使用。 <br>所有的QString的方法都使用const char *参数，const char *被解释为经典的C风格的以零结尾的ASCII字符串。所以const char *参数为0是合法的。如果const char *不是以零结尾的，结果是不确定的。把经典的C字符串复制到QString的函数将不会复制结尾的0字符。QString的QChar数组（可以通过unicode()返回）通常不以零结尾。如果你需要把QString传递到一个需要C的以零结尾的字符串，请使用latin1()。 <br>没有分配任何东西的QString是零，也就是长度和数据指针都为0。引用空字符串（&#8220;&#8221;，一个单一的'\0'字符）的QString是空。零和空这两个QString在方法中都是合法的。把(const char *) 0赋值给QString给定了一个零QString。为了方便，QString::null是一个零QString。当排序的时候，空字符串在最前面，然后是非空字符串，然后才是零字符串。我们建议使用if ( !str.isNull() )，而不是if ( !str )来检测非零字符串，关于解释说明也可以参考operator!()。 <br>注意如果你发现你正在混合使用QCString、QString和QByteArray，这将会导致很多不必要的复制并且也许会预示着你正在处理的真实自然数据是不确定的。如果数据是以零结尾的八位数据，请使用QCString；如果它是没有结尾的（也就是包含0）八位数据，请使用QByteArray；如果它是文本，请使用QString。 <br>字符串列表可以使用QStringList类来处理。你可以使用QStringList::split()来把一个字符串分割为一个字符串列表，并且可以使用QStringList::join()把一个字符串列表连接成一个使用随意间隔符的字符串。你也可以使用QStringList::grep()从一个字符串列表中获得包含特定子字符串或者包含匹配特定的regex的字符串列表。 <br>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br><span style="FONT-SIZE: 18pt"><strong>QFile<br></strong></span><br>QFile类是一个操作文件的输入/输出设备。 <br>QFile是用来读写二进制文件和文本文件的输入/输出设备。QFile可以自己单独被使用，但是如果和QDataStream或QTextStream一起使用将更加方便。 <br>文件名通常可以通过构造函数来传递，但也可以使用setName()来设置。你可以通过exists()来检查一个文件是否存在并且可以通过remove()来移去一个文件。 <br>文件可以用open()来打开、用close()来关闭、用flush()来刷新。数据通常可以使用QDataStream或者QTextStream进行读写，但你也可以使用readBlock()和readLine()来读，使用writeBlock()来写。QFile也支持getch()、 ungetch()和putch()。 <br>size()可以返回文件的大小。你可以通过使用at()函数得到当前文件位置或者移到一个新的文件位置。如果你到了文件的末尾，atEnd()返回真。handle()返回文件句柄。 <br>这里是一个使用QTextStream来一行一行地读取一个文本文件的代码段。它会把每一行带上一个行号打印出来。 </p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp; QStringList lines;<br>&nbsp;&nbsp;&nbsp; QFile file( "file.txt" );<br>&nbsp;&nbsp;&nbsp; if ( file.open( IO_ReadOnly ) ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTextStream stream( &amp;file );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QString line;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int n = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( !stream.eof() ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line = stream.readLine(); // 不包括&#8220;\n&#8221;的一行文本<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "%3d: %s\n", n++, line.latin1() );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lines += line;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file.close();<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp; <br>写文本也很容易（假设我们有一个行的字符串列表要写）： </p>
<p style="COLOR: #000000">&nbsp;&nbsp;&nbsp; QFile file( "file.txt" );<br>&nbsp;&nbsp;&nbsp; if ( file.open( IO_WriteOnly ) ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QTextStream stream( &amp;file );<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for ( QStringList::Iterator it = lines.begin(); it != lines.end(); ++it )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stream &lt;&lt; *it &lt;&lt; "\n";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file.close();<br>&nbsp;&nbsp;&nbsp; }<br>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&nbsp; <br><span style="FONT-SIZE: 18pt"><strong>QTextStream<br></strong></span><br>QTextStream类提供了使用QIODevice读写文本的基本功能。 <br>文本流类的功能界面和标准的C++的iostream类非常相似。iostream和QTextStream的不同点是我们的流操作在一个很容易被继承的QIODevice上，而iostream只能操作一个不能被继承的FILE *指针。 <br>Qt提供了几个和iostream相似的全局函数： <br>bin设置QTextStream来读/写二进制数字 <br>oct设置QTextStream来读/写八进制数字 <br>dec设置QTextStream来读/写十进制数字 <br>hex设置QTextStream来读/写十六进制数字 <br>endl强制换行 <br>flush强制QIODevice刷新任何被缓存的数据 <br>ws作为任何可用的控制符（在输入的时候） <br>reset重新设置QTextStream为它的缺省模式（请见reset()） <br>qSetW(int)设置字段宽度作为指定参数 <br>qSetFill(int)设置填充字符作为指定参数 <br>qSetPrecision(int)设置精确度作为指定参数 <br>警告：默认情况下，QTextStream在读取流的时候，会自动地检测流中的数字是十进制、八进制、十六进制或者二进制格式。具体情况是，一个以&#8220;0&#8221;为开头的数字是八进制的，比如顺序为&#8220;0100&#8221;将会被解释为64。 <br>QTextStream类读写文本，它不适合处理二进制数据（而QDataStream是适合的）。 <br>默认情况下，输出的是使用本地8位编码后的Unicode文本（比如，QString）。这些可以使用setEncoding()方法进行改变。对于输入，QTextStream会自动检测标准Unicode&#8220;字节顺序标记的&#8221;文本文件，否则会使用本地8位编码。 <br>QIODevice在构造函数中被设置，或者之后在setDevice()中使用。如果输入到达了atEnd()，返回真。数据可以使用operator&gt;&gt;()重载操作符读到适当类型的变量中，或者使用read()把它作为整个部分读到一个单一的字符串中，或者使用readLine()把一次读一行。使用skipWhiteSpace()可以忽略控制符。你可以使用flags()或setf()来设置流的标记。这个流也支持width()、precision()和 fill()，使用reset()可以重新恢复默认设置。 <br>也可以参考QDataStream、输入/输出和网络和文本相关类.<br>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br><br><span style="FONT-SIZE: 18pt"><strong>QTextCodec</strong></span><br><br>QTextCodec 类提供文本编码之间的转换。<br>QT使用Unicode来存储，绘制以及操作字符串。在很多情况下，你可能想要使用不同的编码方式来处理数据。例如大部分的日语文件都被存储在Shift-JIS或者 ISO2022的文件中，而俄罗斯的用户常常使用KOI8-R或者CP1251编码方式。QT提供了一个QTextCodec 类集合来从Unicode格式转化到相应的格式。</p>
<p style="COLOR: #000000" align=left>/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////<br><br>代码部分<br><br>#include &lt;qstring.h&gt;<br>#include &lt;qfile.h&gt;<br>#include &lt;qtextstream.h&gt;<br>#include &lt;qtextcodec.h&gt;</p>
<p style="COLOR: #000000" align=left>int main() <br>{&nbsp;&nbsp;&nbsp;<br>&nbsp;QFile file("test.txt");<br>&nbsp;if (file.open(IO_ReadOnly|IO_Raw))<br>&nbsp;{<br>&nbsp;&nbsp;QTextStream&nbsp;floStream(&amp;file);<br>&nbsp;&nbsp;QString line;<br><span style="BACKGROUND-COLOR: yellow">&nbsp;&nbsp;QTextCodec *codec=QTextCodec::codecForName("GBK");<br>&nbsp;&nbsp;floStream.setCodec(codec);</span>&nbsp;<br>&nbsp;&nbsp;while ( floStream.atEnd()==0 ) <br>&nbsp;&nbsp;{<br><span style="BACKGROUND-COLOR: yellow">&nbsp;&nbsp;&nbsp;line = codec-&gt;fromUnicode(floStream.readLine());</span><br>&nbsp;&nbsp;&nbsp;qWarning(line);<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;file.close();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;}<br>&nbsp;return 0;<br>}<br>代码中的主要改动就是黄底的部分<br>意思就是创立一个中文GBK编码样式，然后按照这种方式来把读入的文件流进行重新编码，这样中文就可以顺利输出了，不信你可以试一试，哈哈，先介绍这么多，下次有什么下次再写啦。<br></p><img src ="http://www.cppblog.com/cc/aggbug/30824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/cc/" target="_blank">JetSun</a> 2007-08-25 20:28 <a href="http://www.cppblog.com/cc/archive/2007/08/25/30824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>