﻿<?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++博客-colorful-随笔分类-linux program</title><link>http://www.cppblog.com/colorful/category/19275.html</link><description>zc qq:1337220912</description><language>zh-cn</language><lastBuildDate>Mon, 14 Apr 2014 05:42:28 GMT</lastBuildDate><pubDate>Mon, 14 Apr 2014 05:42:28 GMT</pubDate><ttl>60</ttl><item><title>linux shell 小盒子</title><link>http://www.cppblog.com/colorful/archive/2013/11/04/204082.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 04 Nov 2013 03:06:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/11/04/204082.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/204082.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/11/04/204082.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/204082.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/204082.html</trackback:ping><description><![CDATA[<div>-----------------------------------------------------------------------------<br />grep 一次排除多个<br />grep -v 'aaaa\|bbbb'&nbsp; // 排除aaaa和bbbb<br /><br />-----------------------------------------------------------------------------<br />查看文件数<br />ls |wc -l<br /><br />-----------------------------------------------------------------------------<br />查看文件夹大小<br />du -sh *<br />du -sh /home<br />du -sh <br /><br />------------------------------------------------------------------------------<br />查找最新的文件<br /><div><p> 	（1）将文件按从新到旧排列，取第一个。</p> <p> 	ls -t *.cpp | head -1</p> <p> 	（2）将文件按从旧到新排列，取最后一个。</p> <p> 	ls -rt *.cpp | tail -1</p></div><br />------------------------------------------------------------------------------<br /><div>linux下递归删除某个文件夹或文件</div><div>今天给学校部署校庆网站，做网站的同学传给我的网站文件夹里，有很多exe文件，而且这些exe的文件名都是原来的目录名，看起来是他的机器中了病毒。虽然exe文件在linux下无法运行，但是还是要删除这些exe文件。在网上找了一下，《linux下递归删除某个文件夹或文件》给了我满意的方法，让我可以一次性删除某目录及其子目录下所有的exe文件。<br /><br />find . -name '*.exe' -type f -print -exec rm -rf {} \;<br /><br />(1) "."&nbsp;&nbsp;&nbsp; 表示从当前目录开始递归查找<br />(2) &#8220; -name '*.exe' "根据名称来查找，要查找所有以.exe结尾的文件夹或者文件<br />(3) " -type f "查找的类型为文件<br />(4) "-print" 输出查找的文件目录名<br />(5) 最主要的是是-exec了，-exec选项后边跟着一个所要执行的命令，表示将find出来的文件或目录执行该命令。exec选项后面跟随着所要执行的命令或脚本，然后是一对儿{}，一个空格和一个\，最后是一个分号<br /><br />-----------------------------------------------------------------------------</div></div><img src ="http://www.cppblog.com/colorful/aggbug/204082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-11-04 11:06 <a href="http://www.cppblog.com/colorful/archive/2013/11/04/204082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>变量在shell脚本间的传递 </title><link>http://www.cppblog.com/colorful/archive/2013/09/11/203169.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Wed, 11 Sep 2013 05:37:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/09/11/203169.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/203169.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/09/11/203169.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/203169.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/203169.html</trackback:ping><description><![CDATA[<div>前几篇文章中已经介绍过局部变量和环境变量的含义，接下来我们来拓展下，看看变量怎样实现在shell脚本<br />中的传递shell脚本其实是用当前shell的子shell去执行的，所以在shell脚本中定义的普通变量只适用于当前<br />shell的子shell环境，也就是说在当前shell环境中不适用，也不适用于这个shell脚本的子shell。<br />在shell脚本中定义的环境变量可以传承给它的子shell，但是也不能传递给当前shell(不能逆向传递)<br />如果在一个脚本中需要执行另一个脚本，并且运用其中的变量，改如何申明变量呢，我们来看一个例子：<br />/root/test1.sh内容如下：<br />#!/bin/bash<br />aaa=yuanfaxiang<br />echo "test1:$aaa"<br /><br />/root/test2.sh内容如下：<br />#!/bin/bash<br />/root/test1.sh<br />echo "test2:$aaa"<br />执行test2.sh结果如下：<br />[root@centos ~]# sh test2.sh<br />test1:yuanfaxiang<br />test2:<br />从结果可以看出test1.sh没有把变量aaa的值传递给test2.sh<br /><br />我们把test2.sh改成：<br />#!/bin/bash<br />source /root/test1.sh<br />echo "test2:$aaa"<br />执行test2.sh结果如下：<br />[root@centos ~]# sh test2.sh<br />test1:yuanfaxiang<br />test2:yuanfaxiang<br />结果显示test2.sh继承了test1.sh中定义的变量aaa。<br />原因分析：在第一次执行test2.sh时，test1.sh被作为了test2.sh的子shell来执行，其中定义的变量只<br />在test1.sh中起效，不能逆向传递到test2.sh中；而在第二次执行中，采用source来执行test1.sh,意思<br />是直接把test1.sh在当前的test2.sh中执行，没有作为子shell去执行，test1.sh中定义的变量，就影响<br />到了test2.sh。<br /><br />如果我们再建一个test3.sh<br />#!/bin/bash<br />echo "test3:$aaa"<br /><br />把test2.sh改成：<br />#!/bin/bash<br />source /root/test1.sh<br />echo "test2:$aaa"<br />/root/test3.sh<br />执行test2.sh：<br />[root@shenji ~]# sh test2.sh<br />test1:yuanfaxiang<br />test2:yuanfaxiang<br />test3:<br />结果显示test3.sh没有继承test1.sh中申明的变量，因为source /root/test1.sh只是让test1.sh<br />中的变量在test2.sh中生效，aaa毕竟还是个普通局部变量，并不能被test3.sh这个子shell所继承，<br />所以我们可以想到环境变量，把aaa变成test2.sh这个脚本的环境变量，让test2.sh的子进程也能继承。<br /><br />将test1.sh改成：<br />#!/bin/bash<br />export aaa=yuanfaxiang<br />echo "test1:$aaa"<br />执行test2.sh后有如下结果：<br />[root@shenji ~]# sh test2.sh<br />test1:yuanfaxiang<br />test2:yuanfaxiang<br />test3:yuanfaxiang<br />在test1.sh中声明了环境变量也就是全局变量，在test2.sh中用source执行test1.sh，将变量带到了<br />test2.sh中，并使之成为test2.sh执行过程中的环境变量，可以被test2.sh的子进程继承，起到了顺向<br />传递效果。</div><img src ="http://www.cppblog.com/colorful/aggbug/203169.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-09-11 13:37 <a href="http://www.cppblog.com/colorful/archive/2013/09/11/203169.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 僵尸进程</title><link>http://www.cppblog.com/colorful/archive/2013/08/12/202486.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 12 Aug 2013 02:31:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/08/12/202486.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202486.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/08/12/202486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202486.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202486.html</trackback:ping><description><![CDATA[<div>http://blog.csdn.net/zhuying_linux/article/details/7336662<br /><div>http://blog.csdn.net/fengwei321123/article/details/9301409</div></div><div><h3><span><a href="http://blog.csdn.net/zhuying_linux/article/details/7336662">如何查看并杀死僵尸进程？         </a></span></h3></div><div><div id="article_content">  <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 最近工作过程中，发现好几台服务器出现僵死进程（如图）。</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px" align="center"> <a href="http://www.itdhz.com/content/plugins/kl_album/upload/201109/eddb14355e122454456ec0b9b240ee19201109301103481632044498.jpg" target="_blank" style="color:#0079b7; text-decoration:none; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:baseline"><img alt="点击查看原图" src="http://www.itdhz.com/content/plugins/kl_album/upload/201109/eddb14355e122454456ec0b9b240ee19201109301103481632044498.jpg" style="border-top-style:none; border-right-style:none; border-bottom-style:none; border-left-style:none; border-width:initial; border-color:initial; margin-top:0px; margin-right:8px; margin-bottom:0px; margin-left:8px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:top; border-width:initial; border-color:initial; max-width:540px" height="94" border="0" width="480" /></a>&nbsp;</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　用下面的命令找出僵死进程</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　<span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:baseline; background-color:#000000; color:#009900">ps  -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'</span></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　命令注解：<br /> 　　-A 参数列出所有进程<br /> 　　-o 自定义输出字段 我们设定显示字段为 stat（状态）, ppid（进程父id）, pid(进程id)，cmd（命令）这四个参数</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; vertical-align:baseline; color:#333333; line-height:22px"> </p> <pre name="code" id="best-answer-content"  mb10"="" style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:22px; font-size:14px; background-color:#fffcf6"> <span style="font-family:SimSun"> -C 用来指定所执行的命令名称，你这里也就是让ps仅仅显示php命令所产生的进程的信息</span></pre> <pre name="code" id="best-answer-content"  mb10"="" style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:22px; font-size:14px; background-color:#fffcf6"><span style="font-family:SimSun">    ps -C java -o lstart,pid,cmd【不过貌似打印的不全~】</span></pre> <pre name="code" id="best-answer-content"  mb10"="" style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; white-space:pre-wrap; word-wrap:break-word; zoom:1; line-height:22px; font-size:14px; background-color:#fffcf6"><span style="font-family:SimSun"><span style="color:#333333; font-family:Arial,Helvetica,sans-serif; line-height:20px; text-align:left">       ps -A -o lstart,pid,args |grep java【这个可以的~】</span> </span></pre> <span style="font-family:Arial,Helvetica,sans-serif">　　因为状态为 z或者Z 的进程为僵尸进程，所以我们使用grep抓取stat状态为zZ进程</span><br /> <span style="font-family:Arial,Helvetica,sans-serif">　　运行结果参考如下</span>  <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px" align="center"> <a href="http://www.itdhz.com/content/plugins/kl_album/upload/201109/2dd4d839ef85c9689b42290afea48c76201109301059261426872967.jpg" target="_blank" style="color:#0079b7; text-decoration:none; margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:baseline"><img alt="点击查看原图" src="http://www.itdhz.com/content/plugins/kl_album/upload/201109/2dd4d839ef85c9689b42290afea48c76201109301059261426872967.jpg" style="border-top-style:none; border-right-style:none; border-bottom-style:none; border-left-style:none; border-width:initial; border-color:initial; margin-top:0px; margin-right:8px; margin-bottom:0px; margin-left:8px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:top; border-width:initial; border-color:initial; max-width:540px" height="179" border="0" width="476" /></a></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　这里一共出现了9个僵死进程，我们需要把它们都干掉，执行下面的命令</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　<span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:baseline; background-color:#000000; color:#009900">kill  -9 8310</span></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　这时你再执行查找僵死的进程，发现所有僵死进程都没了．</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　<strong>补充：</strong></p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　最近又遇到了个问题，一台服务器上产生了100多少僵死进程，而且每一僵死进程的父进程都不一样，如果用上面的方法，一条一条的杀，那还不得累死我啊。<br /> 　　那么就应该想一条简单的命令，直接查找僵死进程，然后将父进程杀死~</p> <p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"> 　　&nbsp;<span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:baseline; background-color:#000000; color:#009900">ps  -A -o stat,ppid,pid,cmd | grep -e '^[Zz]' | awk '{print $2}' | xargs kill -9</span></p><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"><br /></p><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px">----------------------------------------------------------------------------------------------------------</p><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"></p><div><pre id="best-content-944679721"  mb-10"="">不能随便杀父进程.<br />ps -aux 先找到僵死进程ID,如5031<br />lsof -p 5031看看僵死在什么地方,一般地讲死锁在某个文件或关联在某个进程<br />去除死锁文件或杀死相关联进程先</pre></div>-----------------------------------------------------------------------------------------------------------<p>&nbsp;</p><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"></p><div><span style="font-size:18px">用ps和grep命令寻找僵尸进程<br /> ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'<br /> 命令注解：<br /> -A 参数列出所有进程<br /> -o 自定义输出字段 我们设定显示字段为 stat（状态）, ppid（进程父id）, pid(进程id)，cmd（命令）这四个参数<br /> 因为状态为 z或者Z的进程为僵尸进程，所以我们使用grep抓取stat状态为zZ进程<br /> 运行结果参考如下<br /> Z 12334 12339 /path/cmd<br /> 这时，我们可以使用 kill -HUP 12339来杀掉这个僵尸进程<br /> 运行后，可以再次运行ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz]'来确认是否已经将僵尸进程杀死<br /> 如果kill 子进程的无效，可以尝试kill 其父进程来解决问题，例如上面例子父进程pid是 12334，那么我们就运行<br /> kill -HUP 12334<br /> 来解决问题 </span></div><br /><p>&nbsp;</p><p style="margin-top:0px; margin-bottom:10px; padding-top:0px; padding-bottom:0px; font-size:14px; text-align:left; background-color:#f7f7f7; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-family:Arial,Helvetica,sans-serif; vertical-align:baseline; color:#333333; line-height:22px"><br /><span style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padding-left:0px; border-top-width:0px; border-right-width:0px; border-bottom-width:0px; border-left-width:0px; border-style:initial; border-color:initial; font-style:inherit; font-family:inherit; vertical-align:baseline; background-color:#000000; color:#009900"></span></p>  </div>  </div><img src ="http://www.cppblog.com/colorful/aggbug/202486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-08-12 10:31 <a href="http://www.cppblog.com/colorful/archive/2013/08/12/202486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux signal量</title><link>http://www.cppblog.com/colorful/archive/2013/08/12/202484.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 12 Aug 2013 01:09:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/08/12/202484.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202484.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/08/12/202484.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202484.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202484.html</trackback:ping><description><![CDATA[<div>转自：<a href="http://www.dbafree.net/?p=870">http://www.dbafree.net/?p=870</a><br /><div>http://news.cnblogs.com/n/146220/</div></div><div><p>我们可以使用kill -l查看所有的信号量解释，但是没有看到SIGNAL 0的解释。</p> <pre>[root@testdb~]# kill -l  1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL  5) SIGTRAP      6) SIGABRT      7) SIGBUS       </pre> <p><img src="http://www.dbafree.net/wp-includes/images/smilies/icon_cool.gif" alt="8)" /></p> <pre> SIGFPE  9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2 13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD 18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN 22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ 26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO 30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1 36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5 40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5 60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1 64) SIGRTMAX</pre> <p>网上搜了下，在这篇文档中找到了signal 0的解释，很不错:</p> <p><a href="http://www.linuxjournal.com/content/monitoring-processes-kill-0">http://www.linuxjournal.com/content/monitoring-processes-kill-0</a></p> <p>&#8220;signal 0&#8243; is kind of like a moral equivalent of &#8220;ping&#8221;.</p> <p>Using &#8220;kill -0 NNN&#8221; in a shell script is a good way to tell if PID &#8220;NNN&#8221; is alive or not:</p> <p>signal 0 is just used to check process is exists or not.</p> <p>在关其它的信号量说明,原文:<a href="http://hi.baidu.com/syqust/blog/item/cd8f6c633b8a617c0d33fa35.html">http://hi.baidu.com/syqust/blog/item/cd8f6c633b8a617c0d33fa35.html</a></p> <p>信号本质<br />信号是在软件层次上对中断机制的一种模拟，在原理上，一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是异步的，一个进程不必通过任何操作来等待信号的到达，事实上，进程也不知道信号到底什么时候到达。</p> <p>信号是进程间通信机制中唯一的异步通信机制，可以看作是异步通知，通知接收信号的进程有哪些事情发生了。信号机制经过POSIX实时扩展后，功能更加强大，除了基本通知功能外，还可以传递附加信息。</p> <p>使用kill -l就会显示出linux支持的信号列表。<br />其中列表中，编号为1 ~ 31的信号为传统UNIX支持的信号，是不可靠信号(非实时的)，编号为32 ~ 63的信号是后来扩充的，称做可靠信号(实时信号)。不可靠信号和可靠信号的区别在于前者不支持排队，可能会造成信号丢失，而后者不会。</p> <p>下面我们对编号小于SIGRTMIN的信号进行讨论（下面的编号 依次对应信号 的数值为1 &#8211; 31）。</p> <p>1) SIGHUP<br />本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。</p> <p>登录Linux时，系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序，包括前台进程组和后台进程组，一般都属于这个  Session。当用户退出Linux登录时，前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程，因此前台进   程组和后台有终端输出的进程就会中止。不过可以捕获这个信号，比如wget能捕获SIGHUP信号，并忽略它，这样就算退出了Linux登录，wget也  能继续下载。</p> <p>此外，对于与终端脱离关系的守护进程，这个信号用于通知它重新读取配置文件。</p> <p>2) SIGINT<br />程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出，用于通知前台进程组终止进程。</p> <p>3) SIGQUIT<br />和SIGINT类似, 但由QUIT字符(通常是Ctrl-\)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。</p> <p>4) SIGILL<br />执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。</p> <p>5) SIGTRAP<br />由断点指令或其它trap指令产生. 由debugger使用。</p> <p>6) SIGABRT<br />调用abort函数生成的信号。</p> <p>7) SIGBUS<br />非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。</p> <p><img src="http://www.dbafree.net/wp-includes/images/smilies/icon_cool.gif" alt="8)" /> SIGFPE<br />在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。</p> <p>9) SIGKILL<br />用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了，可尝试发送这个信号。</p> <p>10) SIGUSR1<br />留给用户使用</p> <p>11) SIGSEGV<br />试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.</p> <p><strong>&nbsp;信号 11，即表示程序中可能存在特定条件下的非法内存访问。</strong></p> <p>12) SIGUSR2<br />留给用户使用</p> <p>13) SIGPIPE<br />管道破裂。这个信号通常在进程间通信产生，比如采用FIFO(管道)通信的两个进程，读管道没打开或者意外终止就往管道写，写进程会收到SIGPIPE信号。此外用Socket通信的两个进程，写进程在写Socket的时候，读进程已经终止。</p> <p>14) SIGALRM<br />时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.</p> <p>15) SIGTERM<br />程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出，shell命令kill缺省产生这个信号。如果进程终止不了，我们才会尝试SIGKILL。</p> <p>17) SIGCHLD<br /><strong>子进程结束时, 父进程会收到这个信号。</strong></p> <p>如果父进程没有处理这个信号，也没有等待(wait)子进程，子进程虽然终止，但是还会在内核进程表中占有表项，这时的子进程称为僵尸进程。这种情   况我们应该避免(父进程或者忽略SIGCHILD信号，或者捕捉它，或者wait它派生的子进程，或者父进程先终止，这时子进程的终止自动由init进程  来接管)。</p> <p>18) SIGCONT<br />让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符</p> <p>19) SIGSTOP<br />停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.</p> <p>20) SIGTSTP<br />停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号</p> <p>21) SIGTTIN<br />当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.</p> <p>22) SIGTTOU<br />类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.</p> <p>23) SIGURG<br />有&#8221;紧急&#8221;数据或out-of-band数据到达socket时产生.</p> <p>24) SIGXCPU<br />超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。</p> <p>25) SIGXFSZ<br />当进程企图扩大文件以至于超过文件大小资源限制。</p> <p>26) SIGVTALRM<br />虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.</p> <p>27) SIGPROF<br />类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.</p> <p>28) SIGWINCH<br />窗口大小改变时发出.</p> <p>29) SIGIO<br />文件描述符准备就绪, 可以开始进行输入/输出操作.</p> <p>30) SIGPWR<br />Power failure</p> <p>31) SIGSYS<br />非法的系统调用。</p> <p>在以上列出的信号中，程序不可捕获、阻塞或忽略的信号有：SIGKILL,SIGSTOP<br />不能恢复至默认动作的信号有：SIGILL,SIGTRAP<br />默认会导致进程流产的信号有：SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ<br />默认会导致进程退出的信号有：SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM<br />默认会导致进程停止的信号有：SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU<br />默认进程忽略的信号有：SIGCHLD,SIGPWR,SIGURG,SIGWINCH</p> <p>此外，SIGIO在SVR4是退出，在4.3BSD中是忽略；SIGCONT在进程挂起时是继续，否则是忽略，不能被阻塞</p> <p>终止程序的时候在不得已的情况下不能用SIGKILL，因为SIGKILL不会对子进程进行处理，只是把对自己进行处理</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>Linux支持POSIX标准信号和实时信号。下面给出Linux Signal的简表，详细细节可以查看man 7 signal。</p> <p>&nbsp;</p> <p>默认动作的含义如下：</p> <p>Term&nbsp;&nbsp;&nbsp;&nbsp;终止进程</p> <p>&nbsp;</p> <table cellpadding="0" cellspacing="0" border="0"> <colgroup> <col width="101"> <col width="82"> <col width="98"> <col width="306"></colgroup> <tbody> <tr> <td><strong>信号</strong></td> <td><strong>取值</strong></td> <td><strong>默认动作</strong></td> <td><strong>含义（发出信号的原因）</strong></td> </tr> <tr> <td>SIGHUP</td> <td>1</td> <td>Term</td> <td>终端的挂断或进程死亡</td> </tr> <tr> <td>SIGINT</td> <td>2</td> <td>Term</td> <td>来自键盘的中断信号</td> </tr> <tr> <td>SIGQUIT</td> <td>3</td> <td>Core</td> <td>来自键盘的离开信号</td> </tr> <tr> <td>SIGILL</td> <td>4</td> <td>Core</td> <td>非法指令</td> </tr> <tr> <td>SIGABRT</td> <td>6</td> <td>Core</td> <td>来自abort的异常信号</td> </tr> <tr> <td>SIGFPE</td> <td>8</td> <td>Core</td> <td>浮点例外</td> </tr> <tr> <td>SIGKILL</td> <td>9</td> <td>Term</td> <td>杀死</td> </tr> <tr> <td>SIGSEGV</td> <td>11</td> <td>Core</td> <td>段非法错误(内存引用无效)</td> </tr> <tr> <td>SIGPIPE</td> <td>13</td> <td>Term</td> <td>管道损坏：向一个没有读进程的管道写数据</td> </tr> <tr> <td>SIGALRM</td> <td>14</td> <td>Term</td> <td>来自alarm的计时器到时信号</td> </tr> <tr> <td>SIGTERM</td> <td>15</td> <td>Term</td> <td>终止</td> </tr> <tr> <td>SIGUSR1</td> <td>30,10,16</td> <td>Term</td> <td>用户自定义信号1</td> </tr> <tr> <td>SIGUSR2</td> <td>31,12,17</td> <td>Term</td> <td>用户自定义信号2</td> </tr> <tr> <td>SIGCHLD</td> <td>20,17,18</td> <td>Ign</td> <td>子进程停止或终止</td> </tr> <tr> <td>SIGCONT</td> <td>19,18,25</td> <td>Cont</td> <td>如果停止，继续执行</td> </tr> <tr> <td>SIGSTOP</td> <td>17,19,23</td> <td>Stop</td> <td>非来自终端的停止信号</td> </tr> <tr> <td>SIGTSTP</td> <td>18,20,24</td> <td>Stop</td> <td>来自终端的停止信号</td> </tr> <tr> <td>SIGTTIN</td> <td>21,21,26</td> <td>Stop</td> <td>后台进程读终端</td> </tr> <tr> <td>SIGTTOU</td> <td>22,22,27</td> <td>Stop</td> <td>后台进程写终端</td> </tr> <tr> <td>SIGBUS</td> <td>10,7,10</td> <td>Core</td> <td>总线错误（内存访问错误）</td> </tr> <tr> <td>SIGPOLL</td> <td>Term</td> <td>Pollable事件发生(Sys V)，与SIGIO同义</td> </tr> <tr> <td>SIGPROF</td> <td>27,27,29</td> <td>Term</td> <td>统计分布图用计时器到时</td> </tr> <tr> <td>SIGSYS</td> <td>12,-,12</td> <td>Core</td> <td>非法系统调用(SVr4)</td> </tr> <tr> <td>SIGTRAP</td> <td>5</td> <td>Core</td> <td>跟踪/断点自陷</td> </tr> <tr> <td>SIGURG</td> <td>16,23,21</td> <td>Ign</td> <td>socket紧急信号(4.2BSD)</td> </tr> <tr> <td>SIGVTALRM</td> <td>26,26,28</td> <td>Term</td> <td>虚拟计时器到时(4.2BSD)</td> </tr> <tr> <td>SIGXCPU</td> <td>24,24,30</td> <td>Core</td> <td>超过CPU时限(4.2BSD)</td> </tr> <tr> <td>SIGXFSZ</td> <td>25,25,31</td> <td>Core</td> <td>超过文件长度限制(4.2BSD)</td> </tr> <tr> <td>SIGIOT</td> <td>6</td> <td>Core</td> <td>IOT自陷，与SIGABRT同义</td> </tr> <tr> <td>SIGEMT</td> <td>7,-,7</td> <td>Term</td> </tr> <tr> <td>SIGSTKFLT</td> <td>-,16,-</td> <td>Term</td> <td>协处理器堆栈错误(不使用)</td> </tr> <tr> <td>SIGIO</td> <td>23,29,22</td> <td>Term</td> <td>描述符上可以进行I/O操作</td> </tr> <tr> <td>SIGCLD</td> <td>-,-,18</td> <td>Ign</td> <td>与SIGCHLD同义</td> </tr> <tr> <td>SIGPWR</td> <td>29,30,19</td> <td>Term</td> <td>电力故障(System V)</td> </tr> <tr> <td>SIGINFO</td> <td>29,-,-</td> <td>与SIGPWR同义</td> </tr> <tr> <td>SIGLOST</td> <td>-,-,-</td> <td>Term</td> <td>文件锁丢失</td> </tr> <tr> <td>SIGWINCH</td> <td>28,28,20</td> <td>Ign</td> <td>窗口大小改变(4.3BSD, Sun)</td> </tr> <tr> <td>SIGUNUSED</td> <td>-,31,-</td> <td>Term</td> <td>未使用信号(will be SIGSYS)</td> </tr> </tbody> </table> <p>&nbsp;</p> <p>说明：</p> <p>一些信号的取值是硬件结构相关的（一般alpha和sparc架构用第一个值，i386、ppc和sh架构用中间值，mips架构用第三个值，&nbsp;-&nbsp;表示相应架构的取值未知）。</p> <p>&nbsp;</p> <p>蓝色的是POSIX.1-1990标准信号。</p> <p>SIGKILL和SIGSTOP信号不能被挂钩、阻塞或忽略。</p> <p>&nbsp;</p> <p>青色的是SUSv2和POSIX.1-2001定义的信号。</p> <p>在Linux  2.2（包括）内核之前，SIGSYS、SIGXCPU、SIGXFSZ和SIGBUS&nbsp;（SPARC和MIPS架构除外）的默认动作是终止进程，但没有 core dump。Linux 2.4遵循POSIX.1-2001要求，这些信号的默认动作改为：终止进程同时做core dump。</p> <p>&nbsp;</p> <p>橙色的是其他常见的信号。</p> <p>信号29在Alpha上为SIGINFO / SIGPWR&nbsp;，在Sparc上为SIGLOST。</p> <p>SIGEMT没有在POSIX.1-2001中说明，但是在大多数的Unices中仍然能见到，典型的默认动作是终止进程并做core dump。</p> <p>SIGPWR没有在POSIX.1-2001中说明，在使用它的一些Unices中典型的默认动作是忽略。</p> <p>SIGIO没有在POSIX.1-2001中说明，在使用它的一些Unices中典型的默认动作是忽略。</p> <p>&nbsp;</p> <p>进程可以通过使用sigaction和signal系统调用来改变信号的默认处理方式（使用signal的可移植性差）。进程可以选择下列3种信号处理方式中的一种：</p> <p>1、执行默认操作；</p> <p>2、忽略该信号；</p> <p>3、捕获该信号，但是通过信号句柄来调用自定义的处理函数。</p> <p>&nbsp;</p> <p>信号可能被阻塞。进程中的每个线程拥有独立的信号掩码，用来表示本线程的信号被阻塞。线程通过pthread_sigmask来设置它的信号掩码。单线程程序可以用sigprocmask来操作信号掩码。在多线程程序中，所有线程处理一个指定信号的默认行为都是一样的。</p> <p>&nbsp;</p> <p>&nbsp;</p> <p>补充:</p> <p>SIG_DFL,SIG_IGN 分别表示无返回值的函数指针，指针值分别是0和1，这两个指针值逻辑上讲是实际程序中不可能出现的函数地址值。</p> <p>SIG_DFL：默认信号处理程序<br />SIG_IGN：忽略信号的处理程序</p></div><img src ="http://www.cppblog.com/colorful/aggbug/202484.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-08-12 09:09 <a href="http://www.cppblog.com/colorful/archive/2013/08/12/202484.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让CentOS默认生成core dump</title><link>http://www.cppblog.com/colorful/archive/2013/07/31/202256.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Wed, 31 Jul 2013 02:34:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/31/202256.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202256.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/31/202256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202256.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202256.html</trackback:ping><description><![CDATA[<div><div>       <p>CentOS中默认设置了ulimit -c 0也就是默认程序不生成core  dump,这样很麻烦,每次启动程序前都要让用户先执行一次ulimit -c  ulimited,有时候用户忘记则不生成core,很不利于错误分析,所以研究了下如何让系统默认就生成core.</p> <p>在网上找了部分资料,看到了</p> <blockquote><p>CentOS 5中ulimit值调整并永久生效的方法</p> <p><a href="http://www.sunchis.com/html/os/linux/2011/0609/338.html">http://www.sunchis.com/html/os/linux/2011/0609/338.html</a></p></blockquote> <p>这篇文章,其中说通过编辑/etc/security/limits.conf文件可以实现ulimit的值设定,测试了nofile后的确可行,但是写入了</p> <p><code>* soft core unlimited<br /> * hard core unlimited</code></p><p><code><br /></code></p> <p>重新登陆却没有效果&nbsp; // ps by zc, 我到这里就有效果了<br /></p> <p><code>[root@localhost ~]# ulimit -a<br /> core file size &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(blocks, -c) 0</code></p> <p>通过研究,发现/etc/profile文件中有一句</p> <p><code># No core files by default<br /> ulimit -S -c 0 &gt; /dev/null 2&gt;&amp;1</code></p> <p>二话不说,把第二行用#注释掉后,即</p> <p><code># No core files by default<br /> #ulimit -S -c 0 &gt; /dev/null 2&gt;&amp;1</code></p> <p>保存重新登陆用户,再次查看,一切正常!</p> <p><code>[root@localhost ~]# ulimit -a<br /> core file size &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(blocks, -c) ulimited</code></p><p><br /><code></code></p><p><code>-----------------------------------------------------------------</code></p><p><code><div><div>1：设置系统允许生产core文件</div><div><span style="white-space: pre; ">	</span>在 ~/.bash_profile 中增加</div><div><span style="white-space: pre; ">		</span>ulimit -c unlimited</div><div></div><div><span style="white-space: pre; ">	</span>使用ulimit -a可以查看系统core文件的大小限制;</div><div><span style="white-space: pre; ">	</span>使用ulimit -c [kbytes]可以设置系统允许生成的core文件大小;</div><div><span style="white-space: pre; ">		</span>ulimit -c 0 不产生core文件</div><div><span style="white-space: pre; ">		</span>ulimit -c 100 设置core文件最大为100k</div><div><span style="white-space: pre; ">		</span>ulimit -c unlimited 不限制core文件大小</div></div><br /></code></p>            </div></div><img src ="http://www.cppblog.com/colorful/aggbug/202256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-31 10:34 <a href="http://www.cppblog.com/colorful/archive/2013/07/31/202256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>apache 开启多站点</title><link>http://www.cppblog.com/colorful/archive/2013/07/30/202245.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 30 Jul 2013 10:41:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/30/202245.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202245.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/30/202245.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202245.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202245.html</trackback:ping><description><![CDATA[<div><h2><br /></h2><p><div>http://zhangyong333revice.blog.163.com/blog/static/1131518832011101811237149/</div><div>http://hi.baidu.com/dspace/item/68b67705a9c53bd21ff046a1</div><div>http://zhb1208.iteye.com/blog/1432957</div><div>http://zhidao.baidu.com/question/285759208.html</div><div>http://michaelkang.blog.51cto.com/1553154/1065251</div><div>http://blog.sina.com.cn/s/blog_7e56997901016bw7.html</div><div>http://wenku.baidu.com/view/95b2361ca8114431b90dd8c0.html</div><div>http://www.cnblogs.com/see7di/archive/2011/06/15/2239756.html</div><div>http://zhidao.baidu.com/question/472396507.html</div><div>http://blog.csdn.net/yongshiok/article/details/6936960</div><div>http://www.xker.com/page/e2010/0925/98279.html</div><div>http://www.codesky.net/article/201101/149128.html</div><br /></p><h2>如何更改linux下的Apache端口号</h2>     <p>一、修改/etc/httpd/conf/httpd.conf文件中的监听端口号</p><p>Listen 80</p><p>把80修改成需要的号，如8000，即</p><p>Listen 8000<br />二、查看SELinux下http相关端口</p><p># semanage port -l|grep http<br />http_cache_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3128, 8080, 8118, 10001-10010<br />http_cache_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3130<br />http_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 80, 443, 488, 8008, 8009, 8443<br />pegasus_http_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5988<br />pegasus_https_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5989</p><p>发现8000不在其范围之内，所以需要另外添加，方法如下：</p><p># semanage port -a -t http_port_t -p tcp 8000</p><p>再次查看，</p><p># semanage port -l|grep http<br />http_cache_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3128, 8080, 8118, 10001-10010<br />http_cache_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; udp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3130<br />http_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8000, 80, 443, 488, 8008, 8009, 8443<br />pegasus_http_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5988<br />pegasus_https_port_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5989</p><p>三、在防火墙中开放新添加的端口</p><p>修改/etc/sysconfig/iptables文件，在文件中添加如一行：</p><p>-A INPUT -m state --state NEW -m tcp -p tcp --dport 8008 -j ACCEPT</p><p>四、重启防火墙和Apache</p><p># service iptables restart</p><p># service httpd restart</p><p>五、正常情况下，应该可以通过新端口访问WEB服务了。</p><p>注：</p><p>1、第二、三、四步骤是在系统已经开启SELinux和防火墙的情况下设置的，如果已经关闭此两个服务，修改端口后直接重启Apache即可；</p><p>2、修改的端口号可以是执行#semanage port -l|grep http后，默认已经有的端口，如8443，这样可以省略额外添加SELinux端口操作；</p><p>3、第三步操作可以图形界面下完成。</p><p>参考资料</p><p>1、Permission denied: make_sock: could not bind to address</p><p>&nbsp;http://emmune.blogspot.com/2009/07/permission-denied-makesock-could-not.html</p><p>不熟悉python、plone、zope，想用apache。80端口已经不在，就征用81端口凑合吧。修改httpd.conf后apachectl start，结果：<br />(13)Permission denied: make_sock: could not bind to address [::]:81<br />(13)Permission denied: make_sock: could not bind to address 0.0.0.0:81<br /><br />查一下SELinux下http相关端口 semanage port -l|grep http，结果：<br />http_cache_port_t              tcp      3128, 8080, 8118, 10001-10010<br />http_cache_port_t              udp      3130<br />http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443<br />pegasus_http_port_t            tcp      5988<br />pegasus_https_port_t           tcp      5989<br /><br />直接用man semanage最后例子中的一句<br /># Allow Apache to listen on port 81<br />semanage port -a -t http_port_t -p tcp 81<br />然后再apachectl start，OK。使用域名:81能够访问啦。<br /><br /><strong>注：semanage</strong><br />semanage  is used to configure certain elements of SELinux policy without  requiring modification to or recompilation from policy sources. This  includes the mapping from Linux usernames to SELinux user identities  (which controls the initial security context assigned to Linux users  when they login and bounds their authorized role set) as well as  security context mappings for various kinds of objects, such as network  ports, interfaces, and nodes(hosts) as well as the file context mapping.  See the EXAMPLES section below for some examples of common usage. Note  that the semanage login command deals with the mapping from Linux  usernames (logins) to SELinux user identities, while the semanage user  command deals with the mapping from SELinux user identities to  authorized role sets. In most cases, only the former mapping needs to be  adjusted by the administrator; the latter is principally defined by the  base policy and usually does not require modification.</p><p>2、linux 下apche无法监听端口解决办法 </p><p>http://www.zzxj.net/blog/fxs_2008/archive/2010/07/05/187.html</p>想建立一个测试用的虚拟主机，遇到了这个问题：<br />[root@localhost html]# service httpd start<br />Starting  httpd: httpd: Could not reliably determine the server's fully qualified  domain name, using localhost.termwikidev for ServerName<br />(13)Permission denied: make_sock: could not bind to address [::]:81<br />(13)Permission denied: make_sock: could not bind to address 0.0.0.0:81<br />no listening sockets available, shutting down<br />Unable to open logs<br /><br />解决办法：<br /><br />semanage port -l|grep http<br />semanage port -a -t http_port_t -p tcp 81<br /><br />这个两个命令一是查看，一个是添加，添加完再查看一遍，如果有81，则成功。另可能要以root用户运行。<br /><br />此外，如果要外网访问，还要打开linux的防火墙：<br /><br />[root@localhost html]# vim /etc/sysconfig/iptables<br />[root@localhost html]# service iptables restart<br /><br />重启apache.<br /><br />相关资料：<br /><br />starting  httpd 13 permission denied make_sock could not bind to  address2010年01月19日 星期二 11:33In Fedora Core 5/6 and RHEL 5. We have made  it easier to customize certain common parts of SELinux. In previous  releases of SELinux if you wanted to change simple things like which  port a daemon could listen to, you would need to write policy. Now we  have the semanage utility. <br /><br />SELinux assigns types to all network  ports on a system. By default all ports are less then 1024 are labeled  reserved_port_t and all ports &gt; 1024 are labeled port_t. If a port is  assigned to a particular type <br />say the http port 80, it has an  assigned type of http_port_t. If you want to look at all the assigned  ports in SELinux, you can use the semanage tool, semanage port -l. <br /><br />So if you executed <br /><br />semanage port -l | grep http<br />http_cache_port_t tcp 3128, 8080, 8118<br />http_cache_port_t udp 3130<br />http_port_t tcp 80, 443, 488, 8008, 8009, 8443<br />pegasus_http_port_t tcp 5988<br />pegasus_https_port_t tcp 5989<br /><br />Here we see http_port_t is assigned to ports 80, 443, 488, 8008, 8009, 8443<br /><br />The policy is written to allow httpd_t http_port_t:tcp_socket name_bind;<br /><br />This means the apache command can "bind" to an port that is labeled http_port_t.<br /><br />So lets say you want to run httpd on port 81.<br /><br />So you edit /etc/httpd/http.conf<br /><br />and change this line <br />Listen 80<br />to <br />Listen 81<br /><br /><br />Now restart the daemon.<br />service httpd restart<br />Stopping httpd: [ OK ]<br />Starting httpd: (13)Permission denied: make_sock: could not bind to address [::]:81<br />(13)Permission denied: make_sock: could not bind to address 0.0.0.0:81<br />no listening sockets available, shutting down<br />Unable to open logs<br />[FAILED]<br /><br />Now the daemon fails to start because it can not bind to port 81.<br /><br />This generates an AVC that looks like<br /><br />----<br />time-&gt;Tue Dec 12 17:37:49 2006<br />type=SYSCALL  msg=audit(1165963069.248:852): arch=40000003 syscall=102 success=no  exit=-13 a0=2 a1=bf96a830 a2=b5b1e8 a3=9e58b68 items=0 ppid=21133  pid=21134 auid=3267 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0  fsgid=0 tty=pts10 comm="httpd" exe="/usr/sbin/httpd"  subj=user_u:system_r:httpd_t:s0 key=(null)<br />type=AVC  msg=audit(1165963069.248:852): avc: denied { name_bind } for pid=21134  comm="httpd" src=81 scontext=user_u:system_r:httpd_t:s0  tcontext=system_u:object_r:reserved_port_t:s0 tclass=tcp_socket<br /><br />To fix this you can use semanage to add the port<br /><br />semanage port -a -t http_port_t -p tcp 81<br /><br />service httpd start<br />Starting httpd: [ OK ]</div><img src ="http://www.cppblog.com/colorful/aggbug/202245.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-30 18:41 <a href="http://www.cppblog.com/colorful/archive/2013/07/30/202245.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php socket connect Permission denied :13</title><link>http://www.cppblog.com/colorful/archive/2013/07/29/202222.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 29 Jul 2013 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/29/202222.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202222.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/29/202222.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202222.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202222.html</trackback:ping><description><![CDATA[<div><code><span>Hi there!<br /> <br /> For the TCP connections: socket_create(AF_INET, SOCK_STREAM, SOL_TCP);<br /> In case you're having problems in socket_connect() with  socket_strerror() = "Permission denied", you may be having a SELinux  config issue.<br /> <br /> Check if SELinux is enabled:<br /> # /usr/sbin/sestatus -v<br /> In case it is, you can just type the command:<br /> # setsebool httpd_can_network_connect=1<br /> <br /> That's it... I read you had to reboot, but I didn't and it worked fine anyway. More info, you may check:<br /> <a href="http://arkiv.netbsd.se/?ml=squirrelmail-users&amp;a=2005-11&amp;t=1523021" rel="nofollow" target="_blank">http://arkiv.netbsd.se/?ml=squirrelmail-users&amp;a=2005-11&amp;t=1523021</a></span></code></div><img src ="http://www.cppblog.com/colorful/aggbug/202222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-29 17:27 <a href="http://www.cppblog.com/colorful/archive/2013/07/29/202222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PHP的ntohl网络字节序函数及相关知识</title><link>http://www.cppblog.com/colorful/archive/2013/07/29/202219.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 29 Jul 2013 06:49:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/29/202219.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202219.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/29/202219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202219.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202219.html</trackback:ping><description><![CDATA[<div>http://n3yang.com/archives/2011/12/16/php-function-ntohl/</div><div>http://www.w3school.com.cn/php/func_misc_unpack.asp&nbsp;&nbsp;&nbsp; // php unpack 函数</div><br /><br /><div><p>最近项目中使用到了PHP与C服务器的socket通信，在做数据转换的时候，PHP没有提供对应将网络字节序和机器字节序相互转换的程序，但是根据函数的意义，我们可以做相应的转换来实现这一函数：</p> <div><div id="highlighter_566303"  php"=""><table cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div></td><td><div><div number1="" index0=""  alt2"=""><code keyword"="">function</code> <code plain"="">ntohl(</code><code variable"="">$str</code><code plain"="">){</code></div><div number2="" index1=""  alt1"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code variable"="">$arr</code> <code plain"="">= unpack(</code><code string"="">'I'</code><code plain"="">, pack(</code><code string"="">'N'</code><code plain"="">, </code><code variable"="">$str</code><code plain"="">));</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword"="">return</code> <code variable"="">$arr</code><code plain"="">[1];</code></div><div number4="" index3=""  alt1"=""><code plain"="">}</code></div></div></td></tr></tbody></table></div></div> <p><strong>函数的意义</strong><br /> 程序的作用是将网络字节序和机器字节序进行相互转换。在C/C++、Python、Delphi中都提供了相应的函数&#8220;ntohl&#8221;和&#8220;htonl&#8221;，如果是short类型就是&#8220;ntohs&#8221;和&#8220;htons&#8221;。下面是这些函数的意义：</p> <pre>ntohl()--"Network to Host Long" htonl()--"Host to Network Long" htons()--"Host to Network Short" ntohs()--"Network to Host Short"</pre> <p><strong>什么是主机字节序</strong><br /> 不同的机器字节序不相同，这与使用的CPU有关。不同的CPU在处理高位字节时所存储的顺序是不同的。<br /> 例如Intel x86结构下, short型数0&#215;1234表示为34 12, int型数0&#215;12345678表示为78 56 34 12<br /> 如IBM power PC结构下, short型数0&#215;1234表示为12 34, int型数0&#215;12345678表示为12 34 56 78</p> <p><strong>网络字节序</strong><br /> 正是由于每个主机的处理顺序有可能不同，所以在网络协议中规定数据从高到低顺序存储，目的是在不同架构的主机中可以正常通信，避免兼容性问题。</p></div><img src ="http://www.cppblog.com/colorful/aggbug/202219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-29 14:49 <a href="http://www.cppblog.com/colorful/archive/2013/07/29/202219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>独立安装php sockets模块</title><link>http://www.cppblog.com/colorful/archive/2013/07/28/202201.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sun, 28 Jul 2013 14:16:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/28/202201.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202201.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/28/202201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202201.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202201.html</trackback:ping><description><![CDATA[<div><div><strong><div>http://blog.chinaunix.net/uid-24426415-id-77267.html</div><br />在安装cacti的时候是需要使用到sockets模块的，如果在安装php的时候没有使用--with-sockets的话，这时就必须手动重新添加此模块。操作步骤如下</strong>：</div> <div>&nbsp;</div> <div>1。<strong>进入php源文件目录ext下，找到sockets目录。并进入此目录</strong></div> <div>&nbsp; #cd php-5.2.9/ext/sockets/</div> <div><br />2.<strong>在该目录下执行phpize命令，此命令在php目录的bin下</strong>。</div> <div># /usr/local/php/bin/phpize</div> <div>&nbsp;</div> <div>3。<strong>配置编译安装</strong></div> <div># ./configure --enable-sockets --with-php-config=/usr/local/php/bin/php-config<br /># make<br /># make install</div> <div>Installing shared extensions:&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/<br />提示so已经安装到目录下。</div> <div>&nbsp;</div> <div>4。<strong>修改配置在php.ini里，设置扩展目录</strong>：<br />extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/"<br />并添加扩展模块引用：<br />extension = sockets.so</div> <div>&nbsp;</div> <div>5.<strong>检查php.ini配置文件的正确性</strong></div> <div>/usr/local/php/bin/php -v<br />执行这个命令时，php会去检查配置文件是否正确，如果有配置错误，这里会报错，可以根据错误信息去排查</div> <div><br />6.<strong>通过/usr/local/php/bin/php -m命令查看是否安装sockets成功</strong></div> <div> <table style="width: 572px; height: 24px" border="1" cellpadding="1" cellspacing="1" width="572"> <tbody> <tr> <td> <p>monitor# /usr/local/php/bin/php -m<br />[PHP Modules]<br />ctype<br />date<br />dom<br />filter<br />gd<br />hash<br />iconv<br />json<br />libxml<br />mbstring<br />mysql<br />pcre<br />PDO<br />pdo_sqlite<br />posix<br />Reflection<br />session<br />SimpleXML<br />sockets<br />SPL<br />SQLite<br />standard<br />tokenizer<br />xml<br />xmlreader<br />xmlwriter<br />zlib</p> <p>[Zend Modules]<br /></p></td></tr></tbody></table></div> <div>&nbsp;</div> <div>7.<strong>重启apache生效</strong></div> <div>/usr/local/apache2/bin/apachectl restart</div></div><img src ="http://www.cppblog.com/colorful/aggbug/202201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-28 22:16 <a href="http://www.cppblog.com/colorful/archive/2013/07/28/202201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>php学习</title><link>http://www.cppblog.com/colorful/archive/2013/07/28/202199.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sun, 28 Jul 2013 13:28:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/28/202199.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202199.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/28/202199.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202199.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202199.html</trackback:ping><description><![CDATA[<div>http://wecoo.iteye.com/blog/1119812&nbsp; php安装<br /><div><p>安装php-5.3.4.tar.bz2首先要安装libxml2而且版本不低于2.6.11，这里我选择的libxml2-2.6.30.tar.bz2</p> <p>[root@localhost root]# tar xjvf libxml2-2.6.31.tar.bz2</p> <p>[root@localhost root]# cd libxml2-2.6.31</p> <p>[root@localhost libxml2-2.6.31]# ./configure --prefix=/usr/local/libxml2</p> <p>[root@localhost libxml2-2.6.31]# make</p> <p>[root@localhost libxml2-2.6.31]# make install</p> <p>到这里libxml2就安装完成了，下面开始安装PHP5.3</p> <p>[root@localhost libxml2-2.6.31]# cd</p> <p>[root@localhost root]# tar -xjvf php-5.3.4.tar.gz2</p> <p>[root@localhost root]# cd php-5.3.4</p> <p>[root@localhost php-5.3.4]# ./configure --prefix=/usr/local/php5 //安装位置</p> <p>--enable-mbstring //设置 php 支持多字节字符串</p> <p>--with-apxs2=/usr/local/apache2/bin/apxs //设置 apache 服务支持 apxs位置</p> <p>--width-libxml-dir=/usr/local/libxml2 //设置刚才安装的libxml2位置</p> <p>--with-mysql=/usr/mysql //设置 mysql 程序安装位置</p> <p>--with-config-file-path=/usr/local/php5 //设置 php 程序配置文件位置</p> <p>[root@localhost php-5.3.4]# make</p> <p>[root@localhost php-5.3.4]# make install</p> <p>[root@localhost php-5.3.4]# cp php.ini-development /usr/local/php5/php.ini</p> <p>在 APACHE里添加 php，使 APACHE 支持 PHP</p> <p>[root@localhost php-5.3.4]# vi /usr/local/apache2/conf/httpd.conf</p> <p>53 LoadModule php5_module modules/libphp5.so</p> <p>54 AddType application/x-httpd-php .php //或者在下面的meta中定义(搜索AddType就可以找到)</p> <p>167 </p> <p>168 DirectoryIndex index.php index.html</p> <p>169</p> <p>[root@localhost php-5.3.4]# service apache restart</p> <p>创建index.php在网站默认根目录下，输入网址访问测试</p></div></div>--------------------------------------------------------------<br />源码安装时提示找不到 libxml2<br />yum install libxml2 libxml2-devel<br /><br />----------------------------------------------------------------<br />php socket测试时 提示<br /><div>Warning: socket_create() Unable to create socket [1]: Operation not permitted </div>需要root权限，可用通过在root下 ／usr/local/php/bin/php ping.php 来运行<br /><div><span>The class is using <code>SOCK_RAW</code> to  create the socket. It might be you need root privilegues on your machine  to execute this code. If this any issue with your enviroment, then fall  back to <code>shell_exec</code></span></div><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><div> Unable to load dynamic library '/usr/lib/php/modules/pgsql.so' - libpq.so.5: failed to map segment from shared object:</div><div><p>在使用PHP编写web页面访问Postgres数据库时，遇到了apache &nbsp;没有正确加载pdo_pgsql.so的问题， 把它记录下来以备用。</p> <p><br /> </p> <p>通过web访问php页面时，页面没有反应， 查看http log时出现下面的错误：</p> <p>PHP Fatal error: Call to undefined function pg_connect()<br /> </p> <p>但是在命令行运行php程序访问postgres测试是成功的， 没有发现问题。</p> <p><br /> </p> <p>网上搜索，都是说php访问postgres 安装了php-pgsql就可以了。 但我已经通过yum安装了php-pgsql， 查看/etc/php.ini, /etc/php.d/pdo_pgsql.ini都是配置正确的。</p> <blockquote style="margin:0 0 0 40px; border:none; padding:0px"> <p>[root@localhost php.d]# cat pdo_pgsql.ini&nbsp;</p> <p>; Enable pdo_pgsql extension module</p> <p>extension=pdo_pgsql.so</p> </blockquote> <p>phpinfo（）也显示加载了pdo_pgsql.ini， pgsql.ini ， 但在PDO节里没有看到Postgres。</p> <p><br /> </p> <p>后来想到会不会是SElinux的问题， 把SElinux 关了，再重启apache，</p> <p>[root@localhost php.d]# setenforce 0<br /> </p> <p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;service httpd restart</p> <p>重启运行phpinfo(), &nbsp;就看到postgres 正确加载了。</p> <p>回过来查看以前apache 的error_log, 确实是php 在加载pdo_pgsql.so 时出现了由于访问权限引起的问题。</p> <p>PHP Warning: &nbsp;PHP Startup: Unable to load dynamic library  '/usr/lib/php/modules/pdo_pgsql.so' - libpq.so.5: failed to map segment  from shared object: Permission denied in Unknown on line 0<br /> PHP Warning: &nbsp;PHP Startup: Unable to load dynamic library  '/usr/lib/php/modules/pgsql.so' - libpq.so.5: failed to map segment from  shared object: Permission denied in Unknown on line 0<br /> </p> <p>把SElinux 关了后， 启动apache时就没有这个错误了，php也成功加载了pgsql。<br /> </p> <p>在实际应用中就需要关闭SElinux，或者重设libpq.so.5的权限。</p><p><br /></p><p>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－</p><p>／usr/bin/apxs: no such file or directory</p><p>yum install httpd-devel</p><p><br /></p><p><br /></p></div><img src ="http://www.cppblog.com/colorful/aggbug/202199.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-28 21:28 <a href="http://www.cppblog.com/colorful/archive/2013/07/28/202199.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux查找软件安装位置</title><link>http://www.cppblog.com/colorful/archive/2013/07/28/202193.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sun, 28 Jul 2013 08:17:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/28/202193.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202193.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/28/202193.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202193.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202193.html</trackback:ping><description><![CDATA[<div>以apache为例<br />如果以rpm包形式安装<br /> 1.rpm包形式（包括yum安装）可以<br /> rpm -aq|grep http&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; #查看是否安装了apache的包<br /> rpm -qi&nbsp; &nbsp;输入上一步获取的包名&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #了解一下这个apache包的信息<br /> rpm -ql&nbsp; &nbsp;输入包名&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; #此apache包中所有文件安装的位置<br /> <br /> 2，源码安装<br /> whereis&nbsp;&nbsp;httpd&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; #http文件的位置</div><img src ="http://www.cppblog.com/colorful/aggbug/202193.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-28 16:17 <a href="http://www.cppblog.com/colorful/archive/2013/07/28/202193.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 中如何卸载已安装的软件(转载)</title><link>http://www.cppblog.com/colorful/archive/2013/07/28/202185.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sun, 28 Jul 2013 02:56:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/28/202185.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202185.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/28/202185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202185.html</trackback:ping><description><![CDATA[<div><div> 																				<strong>Linux 中如何卸载已安装的软件.</strong> 																		</div> 																 														 														 																 																		<div>　　Linux软件的安装和卸载一直是困扰许多新用户的难题。在 Windows中，我们可以使用软件自带的安装卸载程序或在控制面板中的&#8220;添加/删除程序&#8221;来实现。与其相类似，在Linux下有一个功能强大的软件安装 卸载工具，名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工具是在命令行下使用的。在Shell的提示符后输入rpm，就可获得该命令的帮 助信息。<br /><p>　　<strong>软件的安装</strong></p><p>　　Linux下软件的安装主要有两种不同的形式。第一种安装文件名为xxx.tar.gz；另一种安装文件名为xxx.i386.rpm。以第一种方式发行的软件多为以源码形式发送的；第二种方式则是直接以二进制形式发送的。</p><p>　　对于第一种，安装方法如下：</p><p>　　1 .首先，将安装文件拷贝至你的目录中。例如，如果你是以root身份登录上的，就将软件拷贝至/root中。</p><p>　　#cp xxx.tar.gz /root</p><p>　　2 .由于该文件是被压缩并打包的,应对其解压缩。命令为：</p><p>　　#tar xvzf filename.tar.gz 如果是filename.tar.bz2格式的，应该是tar jxvf filename.tar.bz2来解压</p><p>　　3. 执行该命令后，安装文件按路径，解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中，有&#8220;Install&#8221;的文件。该文件为纯文本文件，详细讲述了该软件包的安装方法。</p><p>　　4.执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库，以及库的版本是否满足编译的需要等安装所需要的系统信息。为随后的编译工作做准备。命令为： #./configure</p><p>　　如果您想把软件安装到指定目录，应该用#./configure --prefix=/您自己指定的目录，比如我想把一个mlterm安装到/opt/mlterm目录中，应该如下输入</p><p>　　#./configure --prefix=/opt/mlterm</p><p>　　5.检查通过后，将生成用于编译的MakeFile文件。此时，可以开始进行编译了。编译的过程视软件的规模和计算机性能的不同，所耗费的时间也不同。命令为： #make。</p><p>　　6.成功编译后，键入如下的命令开始安装：</p><p>　　#make install</p><p>　　7.安装完毕，应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令：</p><p>　　#make clean</p><p>　　#make distclean</p><p>　　至此，软件的安装结束。</p><p>　　对于第二种，其安装方法要简单得多。</p><p>　　同第一种方式一样，将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下：</p><p>　　#rpm -i filename.i386.rpm</p><p>　　rpm将自动将安装文件解包，并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。</p><p>　　<strong>软件的卸载</strong></p><p>　　1.软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令：</p><p>　　#rpm -q -a</p><p>　　即可查询到当前系统中安装的所有的软件包。</p><p>　　2. 确定了要卸载的软件的名称，就可以开始实际卸载该软件了。键入命令：</p><p>　　#rpm -e [package name]</p><p>　　即可卸载软件。参数e的作用是使rpm进入卸载模式。对名为[package name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载，rpm将给予提示并停止卸载。你可以使用如下的命令来忽略依赖关系，直接开始卸载：</p><p>　　#rpm -e [package name] -nodeps</p><p>　　忽略依赖关系的卸载可能会导致系统中其它的一些软件无法使用</p><p>　　如果想知道rpm包安装到哪里了呢？</p><p>　　应该用 #rpm -ql [package name]</p><p>　　3.如何卸载用源码包安装的软件？</p><p>　　最好是看README和INSTALL ；一般的情况下都有说，但大多软件没有提供源码包的卸载方法；我们可以找到软件的安装点删除。主要看你把它安装在哪了。</p><p>　　比如：</p><p>　　如果安装软件时，指定个目录。这个问题也不会难；</p><p>　　比如用源码包安装gaim 的</p><p>　　#./configure --prefix=/opt/gaim</p><p>　　#make</p><p>　　#make install</p><p>　　如果安装mlterm</p><p>　　#./configure --prefix=/opt/mlterm</p><p>　　#make</p><p>　　#make install</p><p>　　把源码包安装的软件，都指定安装在 /opt目录中，这样不就知道了；</p><p>　　如果删除，就删除相应的软件目录；</p><p>　　有些软件要在解压安装目录中执行 make uninstall ，这样就卸载掉了。</p></div></div><img src ="http://www.cppblog.com/colorful/aggbug/202185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-28 10:56 <a href="http://www.cppblog.com/colorful/archive/2013/07/28/202185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> centOS 自动安装php </title><link>http://www.cppblog.com/colorful/archive/2013/07/27/202165.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 27 Jul 2013 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/27/202165.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202165.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/27/202165.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202165.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202165.html</trackback:ping><description><![CDATA[<div><div><p>centos下安装php</p><p>#yum install -y php</p><p>这个只安装PHP</p><p>建议安装运行库及MySQL的支持</p><p>#yum install -y php php-devel php-mysql&nbsp; &nbsp; &nbsp; &nbsp; // postgresql &nbsp; 是 php-pgsql <div></div></p><p>如果你的系统是CentOS 5.6那么上面这条命令安装的是<span style="color:#ff0000;">PHP 5.1,</span></p><p>要安装 PHP 5.3则执行下面的命令:</p><p>#yum install -y php53 php53-devel php53-mysql&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /></p><p>自动安装启动<br />#service httpd restart</p><pre name="code" id="content-10367362">会安装apache(也就是httpd),但是不会安装MySQL,MySQL需要单独安装. 安装MySQL命令: #yum install -y mysql mysql-devel mysql-server 这条命令包括MySQL的运行库及服务端</pre></div></div><img src ="http://www.cppblog.com/colorful/aggbug/202165.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-27 16:16 <a href="http://www.cppblog.com/colorful/archive/2013/07/27/202165.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CentOS 6.0 系统 LAMP(Apache+MySQL+PHP)安装步骤</title><link>http://www.cppblog.com/colorful/archive/2013/07/26/202145.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Fri, 26 Jul 2013 12:48:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/26/202145.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/202145.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/26/202145.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/202145.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/202145.html</trackback:ping><description><![CDATA[<div>http://down.chinaz.com/server/201109/1064_1.htm<br /><div>http://www.laozhe.net/articles/302.html</div></div><div><div><div>             	<h2>CentOS 6.0 系统 LAMP（Apache+MySQL+PHP） 安装步骤</h2>             </div>             <div> 				2011年09月3日&nbsp;&nbsp;                 <a href="http://www.laozhe.net/articles/category/system" title="查看 系统专区 中的全部文章" rel="category tag">系统专区</a>&nbsp;&nbsp; 				<a href="http://www.laozhe.net/articles/302.html#comments" title="《CentOS 6.0 系统 LAMP（Apache+MySQL+PHP） 安装步骤》上的评论">1条评论</a>&nbsp;&nbsp; 				4,316人围观过&nbsp;&nbsp;				            </div> 			            		<p>　　先来解释一下，什么是 LAMP。正如标题所言，LAMP 实际上就是  Linux、Apache、MySQL、PHP 四个名称的缩写，当然最后一个 &#8220;P&#8221; 还有其他说法是 Perl 或者  Python。不用多说了，本文讲解的就是 Linux、Apache、MySQL、PHP 这四个东西，所以就这样解释了。</p> <p>　　自己很早就在做网站，最初玩的是 ASP，后来主要研究 .Net，也用 .Net  搞过类似的开发。但是自己最主要还是想把网站做起来，于是乎就将主要精力花在了网站运营上了，当然建站就选用了市面上成熟的一些 CMS  或者是博客程序。目前的 CMS 和博客程序实际上都可以融入到一起，因为其内容的表现形式上相当的接近，故选择哪一块来做，完全看自己的特长了。</p> <p>　　由于 Linux 和 PHP 的免费，在国外是相当的流行。国内大部分主机都是  Windows 平台，而我学的 ASP 和 .Net 刚好能搭配运行起来。后来由于种种原因，我的网站都移民到了国外，而在国外找一个性价比好的  Windows 主机实在是件难事，不光语言上的阻碍，国外版权意识很好，所以很少有性价比好的 Windows 主机。我不得不转向了 Linux  平台。而且非常流行的 WordPress 吸引了我，故目前主要注意力就集中在 Linux 主机和 PHP 上。虽然自己对 PHP  基本不了解，呵呵。</p> <p>　　虽然 Linux 平台上好的组件不止 Apache 一个，例如俄罗斯人开发的 Nginx，还有性能超强的 LiteSpeed  等等，这两者我都用过，前者以高效、资源占用低为特点，据说腾讯网就是基于此运行的，后者是以性能强大著称，同样据说这是 WordPress  官方推荐的用来运行 WordPress 最佳组件。但是呢，各种网上资料表明，虽然 Apache 性能、资源占用不如其他组件，但是 Apache  开发的目标就是以稳定为主。任何一个网站难道不是希望能够稳定运行？所以我还是选择学习 Apache  来作为网站的服务器环境。学会了一个，其他就能够举一反三了。</p> <p>　　一般情况下，安装的都是最新的正式版，除非你有特殊需求，要安装指定的版本，本文暂不讨论。从最基础的开始，一点点完成一个可用的 Linux 主机。这里就开始介绍如何在 CentOS 6.0 上安装 LAMP 组件。经过如下语句安装，目前安装到的版本为：</p> <blockquote><p>PHP：5.3.2<br /> Apache：2.2.15<br /> MySQL：5.1.52</p></blockquote> <h3>一、安装 MySQL</h3> <p>　　首先来进行 MySQL 的安装。打开超级终端，输入：</p>   		<div id="crayon-51f2703c9f3e5364567735" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">yum install mysql mysql-server</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f3e5364567735-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f3e5364567735-1">yum install mysql mysql-server</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　安装完毕，让 MySQL 能够随系统自动启动：</p>   		<div id="crayon-51f2703c9f3f9682224267" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">chkconfig --levels 235 mysqld on /etc/init.d/mysqld start</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f3f9682224267-1">1</div><div crayon-striped-num"="" data-line="crayon-51f2703c9f3f9682224267-2">2</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f3f9682224267-1">chkconfig --levels 235 mysqld on</div><div crayon-striped-line"="" id="crayon-51f2703c9f3f9682224267-2">/etc/init.d/mysqld start</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　设置 MySQL 数据 root 账户的密码：</p>   		<div id="crayon-51f2703c9f400374705313" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">mysql_secure_installation</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f400374705313-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f400374705313-1">mysql_secure_installation</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　当出现如下提示时候直接按回车：</p> <blockquote><p>Enter current password for root</p></blockquote> <p>　　出现如下再次回车：</p> <blockquote><p>Set root password? [Y/n]</p></blockquote> <p>　　出现如下提示输入你需要设置的密码，回车后在输入一次确认：</p> <blockquote><p>New password:</p></blockquote> <p>　　接下来还会有四个确认，分别是：</p> <blockquote><ul><li>Remove anonymous users? [Y/n]</li><li>Disallow root login remotely? [Y/n]</li><li>Remove test database and access to it? [Y/n]</li><li>Reload privilege tables now? [Y/n]</li></ul> </blockquote> <p>　　直接回车即可。</p> <h3>二、安装 Apache 组件</h3> <p>　　由于 CentOS 已经封装了 Apache，直接运行安装：</p>   		<div id="crayon-51f2703c9f408579499523" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">yum install httpd</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f408579499523-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f408579499523-1">yum install httpd</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　同样配置系统让 Apache 随系统启动：</p>   		<div id="crayon-51f2703c9f40e990091331" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">chkconfig --levels 235 httpd on</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f40e990091331-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f40e990091331-1">chkconfig --levels 235 httpd on</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　配置完毕，启动 Apache：</p>   		<div id="crayon-51f2703c9f422936363763" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">/etc/init.d/httpd start</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f422936363763-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f422936363763-1">/etc/init.d/httpd start</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　此时已经可以访问你的服务器，不出意外的话，能够看到 &#8220;Apache 2 Test Page powered by CentOS&#8221;  的测试页面。注意，如果其他机器访问这台服务无法显示这个页面，而直接在这台服务器上可以访问的话，一般情况下是 CentOS  自带的防火墙禁止了。你只需要进入防火墙，将 &#8220;WWW&#8221; 对应的 &#8220;80&#8221; 端口打开即可。</p> <p><img style="display: block;" src="http://www.laozhe.net/wp-content/uploads/2011/09/CentOS6_LAMP_1.jpg"  imgwidth"=""  alt="" /></p> <p>　　注意：在 CentOS 中 Apache 的默认根目录是 /var/www/html，配置文件 /etc/httpd/conf/httpd.conf。其他配置存储在 /etc/httpd/conf.d/ 目录。</p> <h3>三、安装 PHP</h3> <p>　　输入如下指令安装 PHP:</p>   		<div id="crayon-51f2703c9f42a356038630" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">yum install php</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f42a356038630-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f42a356038630-1">yum install php</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　需要重新启动 Apache 服务：</p>   		<div id="crayon-51f2703c9f430160624519" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">/etc/init.d/httpd restart</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f430160624519-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f430160624519-1">/etc/init.d/httpd restart</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <h3>四、测试 PHP 相关信息</h3> <p>　　这步实际上可以省略，但是为了测试是否安装成功，你可以新建一个 PHP 页面进行测试，使用 vim 编辑器新建：</p>   		<div id="crayon-51f2703c9f437417856568" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">vi /var/www/html/info.php</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f437417856568-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f437417856568-1">vi /var/www/html/info.php</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　按 &#8220;i&#8221; 键进行编辑，输入：</p>   		<div id="crayon-51f2703c9f43d731941306" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">&lt;?php phpinfo(); ?&gt;</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f43d731941306-1">1</div><div crayon-striped-num"="" data-line="crayon-51f2703c9f43d731941306-2">2</div><div data-line="crayon-51f2703c9f43d731941306-3">3</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f43d731941306-1">&lt;?php</div><div crayon-striped-line"="" id="crayon-51f2703c9f43d731941306-2">phpinfo();</div><div id="crayon-51f2703c9f43d731941306-3">?&gt;</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　编辑完毕，按 &#8220;ESC&#8221; 键退出编辑模式，接着输入：</p>   		<div id="crayon-51f2703c9f443016091647" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">:wq</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f443016091647-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f443016091647-1">:wq</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　然后回车，即保存并退出。</p> <p>　　此时你可以访问你的站点地址，例如 &#8220;http://192.168.1.2/info.php&#8221;，查看是否能看到相关的 PHP 信息。</p> <p><img style="display: block;" src="http://www.laozhe.net/wp-content/uploads/2011/09/CentOS6_LAMP_2.jpg"  imgwidth"=""  alt="" /></p> <p>　　看到这样的图，就说明 PHP 安装成功了。</p> <h3>五、将 PHP 模块和 MySQL 模块关联起来</h3> <p>　　还需要将 PHP 和 MySQL 关联起来，才能正常工作。搜索模块：</p>   		<div id="crayon-51f2703c9f449018099008" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">yum search php</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f449018099008-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f449018099008-1">yum search php</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　安装相关模块：</p>   		<div id="crayon-51f2703c9f450476275213" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f450476275213-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f450476275213-1">yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　需要重启 Apache 模块才能生效：</p>   		<div id="crayon-51f2703c9f456637252618" crayon-theme-classic="" crayon-font-monaco="" crayon-os-pc=""  print-yes"="" data-settings=" minimize scroll-mouseover" style="margin-top: 12px; margin-bottom: 12px; float: none; clear: both; font-size: 12px ! important; line-height: 15px ! important; height: auto;"> 		 			 			 			<div><textarea wrap="off"  print-no"="" data-settings="dblclick" readonly="readonly" style="-moz-tab-size: 4; font-size: 12px ! important; line-height: 15px ! important; z-index: 0; opacity: 0; overflow: hidden;">/etc/init.d/httpd restart</textarea></div> 			<div style="position: relative; z-index: 1; overflow: hidden;"> 				<table> 					<tbody><tr> 				<td "="" data-settings="show"> 					<div style="font-size: 12px !important; line-height: 15px !important;"><div data-line="crayon-51f2703c9f456637252618-1">1</div></div> 				</td> 						<td><div style="font-size: 12px !important; line-height: 15px !important;"><div id="crayon-51f2703c9f456637252618-1">/etc/init.d/httpd restart</div></div></td> 					</tr> 				</tbody></table> 			</div> 		</div>  <p> </p> <p>　　再次刷新刚才建立的 &#8220;info.php&#8221; 页面，往下拉找到相关 MySQL 模块，看是否检测到相关信息。</p> <p><img style="display: block;" src="http://www.laozhe.net/wp-content/uploads/2011/09/CentOS6_LAMP_3.jpg"  imgwidth"=""  alt="" /></p> <p>　　如果看到如上图相关信息，则说明 MySQL 工作正常了。</p> <h3>六、总结</h3> <p>　　到这里就结束了，本文阐述了在 CentOS 6.0 系统下 LAMP 组件（Apache+MySQL+PHP） 的详细安装步骤，可以让更多新手熟悉服务器配置环境。</p> <p>　　但是到这里，还只是将环境配置完毕，很多东西还有欠缺，而且还是一些重要的问题，例如目录的权限配置问题，或者是管理上的问题，像建立 FTP 等。这些内容随后会慢慢谈到。</p>      </div></div><img src ="http://www.cppblog.com/colorful/aggbug/202145.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-26 20:48 <a href="http://www.cppblog.com/colorful/archive/2013/07/26/202145.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux top 命令详解 </title><link>http://www.cppblog.com/colorful/archive/2013/07/13/201764.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 13 Jul 2013 03:30:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/13/201764.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201764.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/13/201764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201764.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201764.html</trackback:ping><description><![CDATA[<div><p><strong><div>http://blog.csdn.net/sunboy_2050/article/details/6129177</div><br /></strong></p><p><strong>查看多核CPU命令</strong></p><p><span style="color:#0000ff">&nbsp;mpstat -P ALL</span>&nbsp; 和&nbsp; <span style="color:#0000ff">sar -P ALL</span>&nbsp;</p><p><img src="http://hi.csdn.net/attachment/201101/11/0_1294732951UBrP.gif" alt="" />&nbsp;</p><p><strong>说明：</strong><span style="color:#0000ff">sar -P ALL &gt; aaa.txt&nbsp;&nbsp; 重定向输出内容到文件 aaa.txt</span></p><p>&nbsp;</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top命令经常用来监控linux的系统状况，比如cpu、内存的使用，程序员基本都知道这个命令，但比较奇怪的是能用好它的人却很少，例如top监控视图中内存数值的含义就有不少的曲解。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">本文通过一个运行中的WEB服务器的top监控截图，讲述top视图中的各种数据的含义，还包括视图中各进程（任务）的字段的排序。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">&nbsp;</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px"><strong>top进入视图</strong></p><div id="attachment_1156"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1156"="" title="top视图 01" src="http://programmerdigest.cn/wp-content/uploads/2010/08/01.jpg" alt="top视图 01" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 01</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">【top视图 01】是刚进入top的基本视图，我们来结合这个视图讲解各个数据的含义。</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第一行：<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />10:01:23 &#8212; 当前系统时间<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />126 days, 14:29 &#8212; 系统已经运行了126天14小时29分钟（在这期间没有重启过）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />2 users &#8212; 当前有2个用户登录系统<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />load average: 1.15, 1.42, 1.44 &#8212; load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。</p></blockquote><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">load average数据是每隔5秒钟检查一次活跃的进程数，然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量，结果高于5的时候就表明系统在超负荷运转了。</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第二行：<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />Tasks &#8212; 任务（进程），系统现在共有183个进程，其中处于运行中的有1个，182个在休眠（sleep），stoped状态的有0个，zombie状态（僵尸）的有0个。</p></blockquote><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第三行：cpu状态<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />6.7% us &#8212; 用户空间占用CPU的百分比。<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />0.4% sy &#8212; 内核空间占用CPU的百分比。<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />0.0% ni &#8212; 改变过优先级的进程占用CPU的百分比<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />92.9% id &#8212; 空闲CPU百分比<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />0.0% wa &#8212; IO等待占用CPU的百分比<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />0.0% hi &#8212; 硬中断（Hardware IRQ）占用CPU的百分比<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />0.0% si &#8212; 软中断（Software Interrupts）占用CPU的百分比</p></blockquote><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">在这里CPU的使用比率和windows概念不同，如果你不理解用户空间和内核空间，需要充充电了。</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第四行：内存状态<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />8306544k total &#8212; 物理内存总量（8GB）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />7775876k used &#8212; 使用中的内存总量（7.7GB）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />530668k free &#8212; 空闲内存总量（530M）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />79236k buffers &#8212; 缓存的内存量 （79M）</p></blockquote><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第五行：swap交换分区<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />2031608k total &#8212; 交换区总量（2GB）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />2556k used &#8212; 使用的交换区总量（2.5M）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />2029052k free &#8212; 空闲交换区总量（2GB）<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />4231276k cached &#8212; 缓冲的交换区总量（4GB）</p></blockquote><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">这里要说明的是不能用windows的内存概念理解这些数据，如果按windows的方式此台服务器&#8220;危矣&#8221;：8G的内存总量只剩下530M的可用内存。Linux的内存管理有其特殊性，复杂点需要一本书来说明，这里只是简单说点和我们传统概念（windows）的不同。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">第 四行中使用中的内存总量（used）指的是现在系统内核控制的内存数，空闲内存总量（free）是内核还未纳入其管控范围的数量。纳入内核管理的内存不见 得都在使用中，还包括过去使用过的现在可以被重复利用的内存，内核并不把这些可被重新使用的内存交还到free中去，因此在linux上free内存会越 来越少，但不用为此担心。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">如果出于习惯去计算可用内存数，这里有个近似的计算公式：第四行的free + 第四行的buffers + 第五行的cached，按这个公式此台服务器的可用内存：530668+79236+4231276 = 4.7GB。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">对于内存监控，在top里我们要时刻监控第五行swap交换分区的used，如果这个数值在不断的变化，说明内核在不断进行内存和swap的数据交换，这是真正的内存不够用了。</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第六行是空行</p></blockquote><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">第七行以下：各进程（任务）的状态监控<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />PID &#8212; 进程id<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />USER &#8212; 进程所有者<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />PR &#8212; 进程优先级<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />NI &#8212; nice值。负值表示高优先级，正值表示低优先级<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />VIRT &#8212; 进程使用的虚拟内存总量，单位kb。VIRT=SWAP+RES<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />RES &#8212; 进程使用的、未被换出的物理内存大小，单位kb。RES=CODE+DATA<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />SHR &#8212; 共享内存大小，单位kb<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />S &#8212; 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />%CPU &#8212; 上次更新到现在的CPU时间占用百分比<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />%MEM &#8212; 进程使用的物理内存百分比<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />TIME+ &#8212; 进程使用的CPU时间总计，单位1/100秒<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />COMMAND &#8212; 进程名称（命令名/命令行）</p></blockquote><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px"><strong>多U多核CPU监控</strong></p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">在top基本视图中，按键盘数字&#8220;1&#8221;，可监控每个逻辑CPU的状况：</p><div id="attachment_1160"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1160"="" title="top视图 02" src="http://programmerdigest.cn/wp-content/uploads/2010/08/02.jpg" alt="top视图 02" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 02</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">观察上图，服务器有16个逻辑CPU，实际上是4个物理CPU。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px"><strong>进程字段排序</strong></p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">默 认进入top时，各进程是按照CPU的占用量来排序的，在【top视图  01】中进程ID为14210的java进程排在第一（cpu占用100%），进程ID为14183的java进程排在第二（cpu占用12%）。可通过 键盘指令来改变排序字段，比如想监控哪个进程占用MEM最多，我一般的使用方法如下：</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">1. 敲击键盘&#8220;b&#8221;（打开/关闭加亮效果），top的视图变化如下：</p><div id="attachment_1162"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1162"="" title="top视图 03" src="http://programmerdigest.cn/wp-content/uploads/2010/08/03.jpg" alt="top视图 03" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 03</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">我们发现进程id为10704的&#8220;top&#8221;进程被加亮了，top进程就是视图第二行显示的唯一的运行态（runing）的那个进程，可以通过敲击&#8220;y&#8221;键关闭或打开运行态进程的加亮效果。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">2. 敲击键盘&#8220;x&#8221;（打开/关闭排序列的加亮效果），top的视图变化如下：</p><div id="attachment_1164"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1164"="" title="top视图 04" src="http://programmerdigest.cn/wp-content/uploads/2010/08/04.jpg" alt="top视图 04" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 04</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">可以看到，top默认的排序列是&#8220;%CPU&#8221;。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">3. 通过&#8221;shift + &gt;&#8221;或&#8221;shift + &lt;&#8221;可以向右或左改变排序列，下图是按一次&#8221;shift + &gt;&#8221;的效果图：</p><div id="attachment_1165"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1165"="" title="top视图 05" src="http://programmerdigest.cn/wp-content/uploads/2010/08/05.jpg" alt="top视图 05" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 05</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">视图现在已经按照%MEM来排序了。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px"><strong>改变进程显示字段</strong></p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">1. 敲击&#8220;f&#8221;键，top进入另一个视图，在这里可以编排基本视图中的显示字段：</p><div id="attachment_1166"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1166"="" title="top视图 06" src="http://programmerdigest.cn/wp-content/uploads/2010/08/06.jpg" alt="top视图 06" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 06</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">这里列出了所有可在top基本视图中显示的进程字段，有&#8221;*&#8221;并且标注为大写字母的字段是可显示的，没有&#8221;*&#8221;并且是小写字母的字段是不显示的。如果要在基本视图中显示&#8220;CODE&#8221;和&#8220;DATA&#8221;两个字段，可以通过敲击&#8220;r&#8221;和&#8220;s&#8221;键：</p><div id="attachment_1167"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1167"="" title="top视图 07" src="http://programmerdigest.cn/wp-content/uploads/2010/08/07.jpg" alt="top视图 07" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 07</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">2. &#8220;回车&#8221;返回基本视图，可以看到多了&#8220;CODE&#8221;和&#8220;DATA&#8221;两个字段：</p><div id="attachment_1168"  alignnone"="" style="margin:0px; width:610px; font-family:Arial,Helvetica,sans-serif; padding:0px"><img wp-image-1168"="" title="top视图 08" src="http://programmerdigest.cn/wp-content/uploads/2010/08/08.jpg" alt="top视图 08" style="margin:0px; font-family:Arial,Helvetica,sans-serif; border-style:none; padding:0px" height="406" width="600" /><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top视图 08</p></div><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px"><strong>top命令的补充</strong></p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">top 命令是Linux上进行系统监控的首选命令，但有时候却达不到我们的要求，比如当前这台服务器，top监控有很大的局限性。这台服务器运行着 websphere集群，有两个节点服务，就是【top视图  01】中的老大、老二两个java进程，top命令的监控最小单位是进程，所以看不到我关心的java线程数和客户连接数，而这两个指标是java的 web服务非常重要的指标，通常我用ps和netstate两个命令来补充top的不足。</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">监控java线程数：<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />ps -eLf | grep java | wc -l</p></blockquote><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">监控网络客户连接数：<br style="margin:0px; font-family:Arial,Helvetica,sans-serif; padding:0px" />netstat -n | grep tcp | grep 侦听端口 | wc -l</p></blockquote><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">上面两个命令，可改动grep的参数，来达到更细致的监控要求。</p><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">在 Linux系统&#8220;一切都是文件&#8221;的思想贯彻指导下，所有进程的运行状态都可以用文件来获取。系统根目录/proc中，每一个数字子目录的名字都是运行中的 进程的PID，进入任一个进程目录，可通过其中文件或目录来观察进程的各项运行指标，例如task目录就是用来描述进程中线程的，因此也可以通过下面的方 法获取某进程中运行中的线程数量（PID指的是进程ID）：</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">ls /proc/PID/task | wc -l</p></blockquote><p style="text-align:justify; text-indent:28px; margin:0px 0px 12px; font-family:Arial,Helvetica,sans-serif; padding:0px">在linux中还有一个命令pmap，来输出进程内存的状况，可以用来分析线程堆栈：</p><blockquote style="padding-bottom:0px; background-color:#fcfcfc; margin:0px 28px 15px; padding-left:8px; padding-right:8px; font-family:Arial,Helvetica,sans-serif; color:#555555; font-size:12px; padding-top:5px; border:#999999 1px dashed"><p style="text-align:left; line-height:18px; text-indent:0px; margin:0px 0px 5px; font-family:Arial,Helvetica,sans-serif; padding:0px">pmap PID</p></blockquote></div><img src ="http://www.cppblog.com/colorful/aggbug/201764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-13 11:30 <a href="http://www.cppblog.com/colorful/archive/2013/07/13/201764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>centos 6.2 apache安装</title><link>http://www.cppblog.com/colorful/archive/2013/07/11/201703.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 11 Jul 2013 11:03:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/11/201703.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201703.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/11/201703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201703.html</trackback:ping><description><![CDATA[<div>Apache2的是作为一个CentOS的软件包，因此我们可以直接用下面命令安装它：<p>&nbsp; &nbsp; <em>yum install httpd</em></p><p>　　现在配置系统在引导时启动Apache</p><p>&nbsp; &nbsp; <em>chkconfig --levels 235 httpd on</em></p><p>　　并启动Apache</p><p>&nbsp; &nbsp;<em> /etc/init.d/httpd start</em></p><p>　　现在，您的浏览器到http：//192.168.0.100，你应该看到Apache2的测试页：</p></div><div>　　Apache的默认文档根目录是在CentOS上的/var/www/html 目录 ，配置文件是/etc/httpd/conf/httpd.conf。配置存储在的/etc/httpd/conf.d/目录。</div><img src ="http://www.cppblog.com/colorful/aggbug/201703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-11 19:03 <a href="http://www.cppblog.com/colorful/archive/2013/07/11/201703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> linux查看目录大小 </title><link>http://www.cppblog.com/colorful/archive/2013/07/11/201702.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 11 Jul 2013 10:48:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/11/201702.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201702.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/11/201702.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201702.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201702.html</trackback:ping><description><![CDATA[<div><br />可以使用：<br />[tuest@demoserver ~]$ du --max-depth 1 /tmp&nbsp; -h<br />4.0K&nbsp;&nbsp; &nbsp;/tmp/.X11-unix<br />4.0K&nbsp;&nbsp; &nbsp;/tmp/.ICE-unix<br />4.0K&nbsp;&nbsp; &nbsp;/tmp/.font-unix<br />5.9M&nbsp;&nbsp; &nbsp;/tmp<br /><br /><br />就可以看到目录下所有文件夹的内容大小<br /><br />如果只想看一个目录的大小可以使用：<br /><div><div>[tuest@demoserver ~]$ du /tmp -sh</div></div><div>5.9M&nbsp;&nbsp; &nbsp;/tmp</div></div><img src ="http://www.cppblog.com/colorful/aggbug/201702.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-11 18:48 <a href="http://www.cppblog.com/colorful/archive/2013/07/11/201702.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux 中如何卸载已安装的软件.</title><link>http://www.cppblog.com/colorful/archive/2013/07/11/201701.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 11 Jul 2013 10:43:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/11/201701.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201701.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/11/201701.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201701.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201701.html</trackback:ping><description><![CDATA[<div><div> 																				<strong>Linux 中如何卸载已安装的软件.</strong> 																		</div> 																 														 														 																 																		<div>　　Linux软件的安装和卸载一直是困扰许多新用户的难题。在 Windows中，我们可以使用软件自带的安装卸载程序或在控制面板中的&#8220;添加/删除程序&#8221;来实现。与其相类似，在Linux下有一个功能强大的软件安装 卸载工具，名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工具是在命令行下使用的。在Shell的提示符后输入rpm，就可获得该命令的帮 助信息。<br /><p>　　<strong>软件的安装</strong></p><p>　　Linux下软件的安装主要有两种不同的形式。第一种安装文件名为xxx.tar.gz；另一种安装文件名为xxx.i386.rpm。以第一种方式发行的软件多为以源码形式发送的；第二种方式则是直接以二进制形式发送的。</p><p>　　对于第一种，安装方法如下：</p><p>　　1 .首先，将安装文件拷贝至你的目录中。例如，如果你是以root身份登录上的，就将软件拷贝至/root中。</p><p>　　#cp xxx.tar.gz /root</p><p>　　2 .由于该文件是被压缩并打包的,应对其解压缩。命令为：</p><p>　　#tar xvzf filename.tar.gz 如果是filename.tar.bz2格式的，应该是tar jxvf filename.tar.bz2来解压</p><p>　　3. 执行该命令后，安装文件按路径，解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中，有&#8220;Install&#8221;的文件。该文件为纯文本文件，详细讲述了该软件包的安装方法。</p><p>　　4.执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库，以及库的版本是否满足编译的需要等安装所需要的系统信息。为随后的编译工作做准备。命令为： #./configure</p><p>　　如果您想把软件安装到指定目录，应该用#./configure --prefix=/您自己指定的目录，比如我想把一个mlterm安装到/opt/mlterm目录中，应该如下输入</p><p>　　#./configure --prefix=/opt/mlterm</p><p>　　5.检查通过后，将生成用于编译的MakeFile文件。此时，可以开始进行编译了。编译的过程视软件的规模和计算机性能的不同，所耗费的时间也不同。命令为： #make。</p><p>　　6.成功编译后，键入如下的命令开始安装：</p><p>　　#make install</p><p>　　7.安装完毕，应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令：</p><p>　　#make clean</p><p>　　#make distclean</p><p>　　至此，软件的安装结束。</p><p>　　对于第二种，其安装方法要简单得多。</p><p>　　同第一种方式一样，将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下：</p><p>　　#rpm -i filename.i386.rpm</p><p>　　rpm将自动将安装文件解包，并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。</p><p>　　<strong>软件的卸载</strong></p><p>　　1.软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令：</p><p>　　#rpm -q -a</p><p>　　即可查询到当前系统中安装的所有的软件包。</p><p>　　2. 确定了要卸载的软件的名称，就可以开始实际卸载该软件了。键入命令：</p><p>　　#rpm -e [package name]</p><p>　　即可卸载软件。参数e的作用是使rpm进入卸载模式。对名为[package name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载，rpm将给予提示并停止卸载。你可以使用如下的命令来忽略依赖关系，直接开始卸载：</p><p>　　#rpm -e [package name] -nodeps</p><p>　　忽略依赖关系的卸载可能会导致系统中其它的一些软件无法使用</p><p>　　如果想知道rpm包安装到哪里了呢？</p><p>　　应该用 #rpm -ql [package name]</p><p>　　3.如何卸载用源码包安装的软件？</p><p>　　最好是看README和INSTALL ；一般的情况下都有说，但大多软件没有提供源码包的卸载方法；我们可以找到软件的安装点删除。主要看你把它安装在哪了。</p><p>　　比如：</p><p>　　如果安装软件时，指定个目录。这个问题也不会难；</p><p>　　比如用源码包安装gaim 的</p><p>　　#./configure --prefix=/opt/gaim</p><p>　　#make</p><p>　　#make install</p><p>　　如果安装mlterm</p><p>　　#./configure --prefix=/opt/mlterm</p><p>　　#make</p><p>　　#make install</p><p>　　把源码包安装的软件，都指定安装在 /opt目录中，这样不就知道了；</p><p>　　如果删除，就删除相应的软件目录；</p><p>　　有些软件要在解压安装目录中执行 make uninstall ，这样就卸载掉了。</p></div></div><img src ="http://www.cppblog.com/colorful/aggbug/201701.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-11 18:43 <a href="http://www.cppblog.com/colorful/archive/2013/07/11/201701.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crontab防止脚本周期内未执行完重复执行</title><link>http://www.cppblog.com/colorful/archive/2013/07/06/201568.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 06 Jul 2013 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/06/201568.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201568.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/06/201568.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201568.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201568.html</trackback:ping><description><![CDATA[个人体会: flock -xn my.lock commond<br />my.lock是一个文件，应该可以是任意文件，可以新建一个空文件<br />当flock 获得锁后就会执行后面的 commond<br />测试过程: $1: flock -xn my.lock sleep 20<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $2: flock -xn my.lock ls<br />只有当1返回后， 2的ls才会成功<br /><br /><div><h2>crontab防止脚本周期内未执行完重复执行</h2>     <p>如果某脚本要运行30分钟，可以在Crontab里把脚本间隔设为至少一小时来避免冲突。而比较糟的情况是可能该脚本在执行周期内没有完成，接着第 二个脚本又开始运行了。如何确保只有一个脚本实例运行呢？一个好用的方法是利用lockf（FreeBSD&nbsp;8.1下为lockf，CentOS&nbsp; 5.5下为flock），在脚本执行前先检测能否获取某个文件锁，以防止脚本运行冲突。</p><p>lockf的参数如下。</p><p>-k：一直等待获取文件锁。</p><p>-s：silent，不发出任何信息，即使拿不到文件锁。</p><p>-t&nbsp;seconds：设定timeout的时间是seconds秒，如果超过时间，则自动放弃。</p><p>以下Crontab计划任务执行前，需获取临时文件create.lock的文件锁，此项Crontab计划任务的内容如下：</p><div><div id="highlighter_560612"  bash"=""><table cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">*</code><code plain"="">/10</code>&nbsp;<code plain"="">*&nbsp;*&nbsp;*&nbsp;*&nbsp;(lockf&nbsp;-s&nbsp;-t&nbsp;0&nbsp;</code><code plain"="">/tmp/create</code><code plain"="">.lock&nbsp;</code><code plain"="">/usr/bin/python</code>&nbsp;<code plain"="">/home/project/cron/create_tab</code><code plain"="">.py&nbsp;&nbsp;&gt;&gt;&nbsp;</code><code plain"="">/home/project/logs/create</code><code plain"="">.log&nbsp;2&gt;&amp;1)</code></div></div></td></tr></tbody></table></div></div><p><br /></p><p>若第一个实例在10分钟内没有运行完，第2个实例不会运行。我以前是通过Shell脚本来解决这个问题的，比如用while...do循环，然后放在后台执行。但后来发现其实用flock或lockf方法更为简单。</p><p><br /></p><p>附上linux下的flock的用法：</p><div><div id="highlighter_710880"  cpp"=""><table cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div><div number2="" index1=""  alt1"="">2</div><div number3="" index2=""  alt2"="">3</div><div number4="" index3=""  alt1"="">4</div><div number5="" index4=""  alt2"="">5</div><div number6="" index5=""  alt1"="">6</div><div number7="" index6=""  alt2"="">7</div><div number8="" index7=""  alt1"="">8</div><div number9="" index8=""  alt2"="">9</div><div number10="" index9=""  alt1"="">10</div><div number11="" index10=""  alt2"="">11</div><div number12="" index11=""  alt1"="">12</div><div number13="" index12=""  alt2"="">13</div><div number14="" index13=""  alt1"="">14</div><div number15="" index14=""  alt2"="">15</div><div number16="" index15=""  alt1"="">16</div><div number17="" index16=""  alt2"="">17</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">flock&nbsp;(util-linux&nbsp;2.13-pre7)</code></div><div number2="" index1=""  alt1"=""><code plain"="">Usage:&nbsp;flock&nbsp;[-sxun][-w&nbsp;#]&nbsp;fd#</code></div><div number3="" index2=""  alt2"=""><code spaces"="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain"="">flock&nbsp;[-sxon][-w&nbsp;#]&nbsp;file&nbsp;[-c]&nbsp;command...</code></div><div number4="" index3=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-s&nbsp;&nbsp;--shared&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Get&nbsp;a&nbsp;shared&nbsp;lock&nbsp;</code></div><div number5="" index4=""  alt2"=""><code preprocessor"="">#共享锁,在定向为某文件的FD上设置共享锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置独占锁的请求失败,而其他进程试图在定向为此文件的FD上设置共享锁的请求会成功</code></div><div number6="" index5=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-x&nbsp;&nbsp;--exclusive&nbsp;&nbsp;Get&nbsp;an&nbsp;exclusive&nbsp;lock&nbsp;</code></div><div number7="" index6=""  alt2"=""><code preprocessor"="">#独占或排他锁,在定向为某文件的FD上设置独占锁而未释放锁的时间内,其他进程试图在定向为此文件的FD上设置共享锁或独占锁都会失败。只要未设置-s参数,此参数默认被设置</code></div><div number8="" index7=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-u&nbsp;&nbsp;--unlock&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Remove&nbsp;a&nbsp;lock&nbsp;</code></div><div number9="" index8=""  alt2"=""><code preprocessor"="">#手动解锁,一般情况不必须,当FD关闭时,系统会自动解锁,此参数用于脚本命令一部分需要异步执行,一部分可以同步执行的情况</code></div><div number10="" index9=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-n&nbsp;&nbsp;--nonblock&nbsp;&nbsp;&nbsp;Fail&nbsp;rather&nbsp;than&nbsp;wait&nbsp;</code></div><div number11="" index10=""  alt2"=""><code preprocessor"="">#为非阻塞模式,当试图设置锁失败,采用非阻塞模式,直接返回1,</code></div><div number12="" index11=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-w&nbsp;&nbsp;--timeout&nbsp;&nbsp;&nbsp;&nbsp;Wait&nbsp;</code><code keyword=""  bold"="">for</code>&nbsp;<code plain"="">a&nbsp;limited&nbsp;amount&nbsp;of&nbsp;</code><code functions=""  bold"="">time</code></div><div number13="" index12=""  alt2"=""><code preprocessor"="">#设置阻塞超时,当超过设置的秒数,就跳出阻塞,返回1</code></div><div number14="" index13=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-o&nbsp;&nbsp;--close&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close&nbsp;file&nbsp;descriptor&nbsp;before&nbsp;running&nbsp;command</code></div><div number15="" index14=""  alt2"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-c&nbsp;&nbsp;--command&nbsp;&nbsp;&nbsp;&nbsp;Run&nbsp;a&nbsp;single&nbsp;command&nbsp;string&nbsp;through&nbsp;the&nbsp;shell&nbsp;执行其后的comand</code></div><div number16="" index15=""  alt1"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-h&nbsp;&nbsp;--help&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;</code><code keyword=""  bold"="">this</code>&nbsp;<code plain"="">text</code></div><div number17="" index16=""  alt2"=""><code spaces"="">&nbsp;&nbsp;</code><code plain"="">-V&nbsp;&nbsp;--version&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;version</code></div></div></td></tr></tbody></table></div></div><p>举个例子执行如下脚本：</p><p>每天23:30的时候执行一个脚本，但是执行前必须要获得排他文件锁，否则无法执行命令<br /></p><table cellpadding="0" cellspacing="0" border="0"><tbody><tr><td><div number1="" index0=""  alt2"="">1</div></td><td><div><div number1="" index0=""  alt2"=""><code plain"="">30&nbsp;23&nbsp;*&nbsp;*&nbsp;*&nbsp;flock&nbsp;-xn&nbsp;</code><code plain"="">/tmp/test</code><code plain"="">.lock&nbsp;-c&nbsp;</code><code string"="">'/usr/local/php&nbsp;test.php'</code></div></div></td></tr></tbody></table></div><img src ="http://www.cppblog.com/colorful/aggbug/201568.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-06 16:59 <a href="http://www.cppblog.com/colorful/archive/2013/07/06/201568.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell中if做比较</title><link>http://www.cppblog.com/colorful/archive/2013/07/06/201566.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 06 Jul 2013 08:28:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/06/201566.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201566.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/06/201566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201566.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201566.html</trackback:ping><description><![CDATA[<div><h2> 			<a id="cb_post_title_url" href="http://www.cnblogs.com/276815076/archive/2011/10/30/2229286.html">shell中if做比较</a> 		</h2> 		<p>比较两个字符串是否相等的办法是：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;if [ "$test"x = "test"x ]; then</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;这里的关键有几点：</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;1 使用单个等号</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;2 注意到等号两边各有一个空格：这是unix shell的要求</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;3 注意到"$test"x最后的x，这是特意安排的，因为当$test为空的时候，上面的表达式就变成了x = testx，显然是不相等的。而如果没有这个x，表达式就会报错：[: =: unary operator expected</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;整数比较</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-eq 等于,如:if [ "$a" -eq "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-ne 不等于,如:if [ "$a" -ne "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-gt 大于,如:if [ "$a" -gt "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-ge 大于等于,如:if [ "$a" -ge "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-lt 小于,如:if [ "$a" -lt "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-le 小于等于,如:if [ "$a" -le "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 大于(需要双括号),如:(("$a" &gt; "$b"))</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&gt;= 大于等于(需要双括号),如:(("$a" &gt;= "$b"))</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;小数据比较可使用AWK</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;字符串比较</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;= 等于,如:if [ "$a" = "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;== 等于,如:if [ "$a" == "$b" ],与=等价</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 注意:==的功能在[[]]和[]中的行为是不同的,如下:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 3</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 4 [ $a == z* ] # File globbing 和word splitting将会发生</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 5 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;!= 不等于,如:if [ "$a" != "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 这个操作符将在[[]]结构中使用模式匹配.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 大于,在ASCII字母顺序下.如:</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; if [[ "$a" &gt; "$b" ]]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; if [ "$a" \&gt; "$b" ]</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 注意:在[]结构中"&gt;"需要被转义.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; 具体参考Example 26-11来查看这个操作符应用的例子.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-z 字符串为"null".就是长度为0.</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;-n 字符串不为"null"</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #ff0000;">注意: </span></p> <p><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;       使用-n在[]结构中测试必须要用""把变量引起来.使用一个未被""的字符串来使用! -z </span></p> <p><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;       或者就是未用""引用的字符串本身,放到[]结构中。虽然一般情况下可 </span></p> <p><span style="color: #ff0000;">&nbsp;&nbsp;&nbsp;&nbsp;       以工作,但这是不安全的.习惯于使用""来测试字符串是一种好习惯.</span></p> <p><span style="color: #ff0000;">if判断式<br />if [ 条件判断一 ] &amp;&amp; (||) [ 条件判断二 ]; then<br />elif [ 条件判断三 ] &amp;&amp; (||) [ 条件判断四 ]; then<br />else<br /> &nbsp; &nbsp;执行第三段內容程式<br />fi </span></p> <p><span style="color: #ff0000;">例如：</span></p> <p>&nbsp;</p> <pre mb10"="">root@Bizbox:~# a=0 root@Bizbox:~# b=0 root@Bizbox:~# c=5          root@Bizbox:~# if [ $a = 0 -a $b = 0 ]&amp;&amp;[ $c != 0 ]; then &gt; echo success &gt; fi success</pre> <p><span style="color: #ff0000;">if 使用的表达式</span></p> <div>Primary 意义<br />[ -a 文件 ] 如果文件存在为真。<br />[ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。<br />[ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。</div> <p>&nbsp;</p> <div>[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。<br />[ -e 文件 ] 为真 如果 文件 存在。<br />[ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。<br />[ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。<br />[ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。<br />[ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。<br />[ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。<br />[ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。<br />[ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。<br />[ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。<br />[ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。<br />[ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。<br />[ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。<br />[ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。<br />[ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。<br />[ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。<br />[ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。<br />[ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。<br />[ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2, or 如果<br />文件1 存在 而且<br />文件2 does not。<br />[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。<br />[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode<br />numbers。<br />[ -o 选项名 ] 为真 如果 shell 选项 "选项名" 开启。<br />[ -z STRING ] 为真 如果 "STRING"的长度是零。<br />[ -n STRING ] 或者 [ STRING ] 为真 "STRING"的长度是非零值。<br />[ STRING1 == STRING2 ] 如果两个字符串相等为真。 "=" may be used instead of "==" for<br />strict POSIX compliance。<br />[ STRING1 != STRING2 ] 为真 如果 两两个字符串不相等。<br />[ STRING1 &lt; STRING2 ] 为真 如果 "STRING1" sorts before "STRING2" lexicographically in the<br />current locale。<br />[ STRING1 &gt; STRING2 ] 为真 如果 "STRING1" sorts after "STRING2" lexicographically in the<br />current locale。<br />[ ARG1 OP ARG2 ]<br />"OP" 是 -eq, -ne, -lt, -le, -gt or -ge 其中一个。 These arithmetic binary operators<br />return 为真 如果 "ARG1" is equal to, not equal to, less than, less than or equal to, greater<br />than, or greater than or equal to "ARG2", respectively。 "ARG1" 而且 "ARG2" are<br />integers。<br />表达式可以借以下操作符组合起来, listed in decreasing order of precedence:<br />操作符效果<br />[ ! EXPR ] 如果EXPR 为假则为真。<br />[ ( EXPR ) ] 返回EXPR 的值。 这样可以用来忽略正常的操作符优先级。</div></div><img src ="http://www.cppblog.com/colorful/aggbug/201566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-06 16:28 <a href="http://www.cppblog.com/colorful/archive/2013/07/06/201566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 删除所有后缀名相同的文件</title><link>http://www.cppblog.com/colorful/archive/2013/07/06/201565.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 06 Jul 2013 08:15:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/06/201565.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201565.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/06/201565.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201565.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201565.html</trackback:ping><description><![CDATA[个人经历：系统centos 6.3<br /><br />方法一:<br />find 目录 -name "*.abc" | xargs rm<br />命令很危险, 你先执行前半段试试看 是不是你要删除的文件, 在整条执行<br /><br />方法二:<br /><div>find . -name '*.exe' -type f -print -exec rm -rf {} \;<br />(1) "."&nbsp;&nbsp;&nbsp; 表示从当前目录开始递归查找<br />(2) &#8220; -name '*.exe' "根据名称来查找，要查找所有以.exe结尾的文件夹或者文件<br />(3) " -type f "查找的类型为文件<br />(4) "-print" 输出查找的文件目录名<br />(5) 最主要的是是-exec了，-exec选项后边跟着一个所要执行的命令，表示将find出来的文件或目录执行该命令。<br />&nbsp;&nbsp;&nbsp;&nbsp; exec选项后面跟随着所要执行的命令或脚本，然后是一对儿{}，一个空格和一个\，最后是一个分号<br /><br />-----------------------------------------------------------<br /><div><h3><span><a href="http://blog.csdn.net/zhuying_linux/article/details/7610416">find: paths must precede expression Usage: find [-H] [-L] [-P] [path...] [expression]         </a></span></h3><p><div><p>今天在跑脚本的时候看到如下报错：</p> <p>find: paths must precede expression<br /> Usage: find [-H] [-L] [-P] [path...] [expression]<br /> </p> <p><span style="font-family:SimSun; font-size:12px">然后就上网查了一下，结果搜索到一篇，大概是这样说的：<span style="line-height:25px; text-align:left">多文件的查找的时候需要增加单引号</span></span></p> <p><span style="font-family:SimSun; font-size:12px"><span style="line-height:25px; text-align:left; background-color:#ffffcc">而我之前一直都是用的双引号，也没有遇到问题，这次却报错了~</span></span></p> <p><span style="font-family:SimSun"><span style="line-height:25px; text-align:left"><span style="font-size:12px">ssh $ip "cd $path;find . -name<span style="background-color:#99ff99">'access.$month*.log'</span> -print -exec zip -r access.$month.zip  {} \;"</span><br /> </span></span></p> <p><span style="font-family:SimSun; font-size:12px"><span style="line-height:25px; text-align:left">修改成<span style="background-color:#ffff99">单引号</span>后，木有再见报错~</span></span></p> <p><span style="font-family:SimSun; font-size:12px"><span style="line-height:25px; text-align:left">例子说明：</span></span></p> <p><span style="font-family:SimSun; font-size:12px"></span></p> <div bg_html"=""><div><div><strong>[html]</strong> <a href="http://blog.csdn.net/zhuying_linux/article/details/7610416#" title="view plain">view plain</a><a href="http://blog.csdn.net/zhuying_linux/article/details/7610416#" title="copy">copy</a></div></div><ol start="1"><li><span>#&nbsp;进入tmp目录新建4个文本文件&nbsp;&nbsp;</span></li><li>#&nbsp;cd&nbsp;/tmp&nbsp;&nbsp;</li><li>#&nbsp;touch&nbsp;{1,2,3,4}.txt&nbsp;&nbsp;</li><li>#&nbsp;find&nbsp;.&nbsp;-name&nbsp;*.txt&nbsp;&nbsp;</li><li>find:&nbsp;paths&nbsp;must&nbsp;precede&nbsp;expression:&nbsp;2.txt&nbsp;&nbsp;</li></ol></div>  <p><span style="font-size:12px"></span></p> <p style="line-height:25px"><span style="font-size:12px"><span style="line-height:25px; text-align:left"><span style="line-height:22px; text-align:left"><span style="font-family:SimSun">出现这个提示是因为星号被展开为当前目录下所有的文件，这样的匹配当然会出错。看这个就知道了：</span></span><br /> </span></span></p>  <div bg_html"=""><div><div><strong>[html]</strong> <a href="http://blog.csdn.net/zhuying_linux/article/details/7610416#" title="view plain">view plain</a><a href="http://blog.csdn.net/zhuying_linux/article/details/7610416#" title="copy">copy</a></div></div><ol start="1"><li><span>#&nbsp;echo&nbsp;*&nbsp;&nbsp;</span></li><li>1.txt&nbsp;2.txt&nbsp;3.txt&nbsp;4.txt&nbsp;&nbsp;</li><li>#&nbsp;echo&nbsp;'*'&nbsp;&nbsp;</li><li>*&nbsp;&nbsp;</li><li>#&nbsp;echo&nbsp;\*&nbsp;&nbsp;</li><li>*&nbsp;&nbsp;</li></ol></div><br /> <span style="font-size:12px"></span>  <p style="line-height:25px"><span style="font-size:12px"><span style="line-height:25px; text-align:left"></span></span></p> <p><span style="line-height:25px; text-align:left"><span style="line-height:22px; text-align:left"><span style="font-family:SimSun; font-size:10px"><span style="font-size:12px"><span style="line-height:22px; text-align:left">想要星号不被展开就需要加上<span style="background-color:#ccffff">括号或者反斜杠转义</span>，知道了这些我们就知道该怎么find了</span></span><br /> </span></span></span></p>  <div bg_html"=""><div><div><strong>[html]</strong> <a href="http://blog.csdn.net/zhuying_linux/article/details/7610416#" title="view plain">view plain</a><a href="http://blog.csdn.net/zhuying_linux/article/details/7610416#" title="copy">copy</a></div></div><ol start="1"><li><span>#&nbsp;find&nbsp;.&nbsp;-name&nbsp;'*.txt'&nbsp;&nbsp;</span></li><li>find&nbsp;.&nbsp;-name&nbsp;'*.txt'&nbsp;&nbsp;</li><li>./4.txt&nbsp;&nbsp;</li><li>./2.txt&nbsp;&nbsp;</li><li>./3.txt&nbsp;&nbsp;</li><li>./1.txt&nbsp;&nbsp;</li><li>#或者使用反斜杠&nbsp;&nbsp;</li><li>&nbsp;find&nbsp;.&nbsp;-name&nbsp;\*.txt&nbsp;&nbsp;</li><li>./4.txt&nbsp;&nbsp;</li><li>./2.txt&nbsp;&nbsp;</li><li>./3.txt&nbsp;&nbsp;</li><li>./1.txt&nbsp; <br /></li></ol></div></div><br /></p></div></div><img src ="http://www.cppblog.com/colorful/aggbug/201565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-06 16:15 <a href="http://www.cppblog.com/colorful/archive/2013/07/06/201565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to rename a file in Linux</title><link>http://www.cppblog.com/colorful/archive/2013/07/06/201563.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 06 Jul 2013 07:49:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/06/201563.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201563.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/06/201563.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201563.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201563.html</trackback:ping><description><![CDATA[<div>//为什么 rename 不行<br /><br />mv command renames the file named by the source operand to the destination path named by the target operand. mv command syntax:<br /> <br />  <div> 	<div>Code:</div> 	<pre style="height:48px;">mv {old-file-name {new-file-name} mv {old-dir-name} {new-dir-name}</pre> </div> Rename a file tom.txt to jerry.txt, type:<br />  <div> 	<div>Code:</div> 	<pre style="height:36px;">mv tom.txt jerry.txt</pre> </div> Rename a directory lgitech to logitech, enter:<br />  <div> 	<div>Code:</div> 	<pre style="height:36px;">mv lgitech logitech</pre> </div></div><img src ="http://www.cppblog.com/colorful/aggbug/201563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-06 15:49 <a href="http://www.cppblog.com/colorful/archive/2013/07/06/201563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>进程守护脚本， 如果已运行则不运行</title><link>http://www.cppblog.com/colorful/archive/2013/07/06/201561.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 06 Jul 2013 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/06/201561.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201561.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/06/201561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201561.html</trackback:ping><description><![CDATA[<div>processExist=`ps&nbsp;aux|grep&nbsp;processName|grep&nbsp;-v&nbsp;"grep"&nbsp;`&nbsp;&nbsp; // 注意这是Esc下面那个`<br /> if&nbsp;[&nbsp;-z "$processExist" ];then<br /> &nbsp;&nbsp;&nbsp;&nbsp;exec&nbsp;processName<br /> else<br /> &nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;"process&nbsp;is&nbsp;running"<br /> fi         </div><img src ="http://www.cppblog.com/colorful/aggbug/201561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-06 15:36 <a href="http://www.cppblog.com/colorful/archive/2013/07/06/201561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定时自动启动任务crontab命令用法</title><link>http://www.cppblog.com/colorful/archive/2013/07/06/201560.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Sat, 06 Jul 2013 07:31:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/06/201560.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201560.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/06/201560.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201560.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201560.html</trackback:ping><description><![CDATA[<div><p><div>http://www.centos.bz/2011/03/auto-run-task-crontab/</div><br /></p><p>每个操作系统都有它的自动定时启动程序的功能，<a title="Windows" href="http://www.centos.bz/category/other-system/windows/">Windows</a>有它的任务计划，而<a title="Linux" href="http://www.centos.bz/">Linux</a>对应的功能是<a title="crontab" href="http://www.centos.bz/tag/crontab/">crontab</a>。</p> <h3>crontab简介</h3> <p>crontab命令常见于Unix和类Unix的操作系统之中，用于设置周期性被执行的指令。该命令从标准输入设备读取指令，并将其存放于 &#8220;crontab&#8221;文件中，以供之后读取和执行。该词来源于希腊语  chronos(&#967;&#961;&#972;&#957;&#959;&#962;)，原意是时间。　　通常，crontab储存的指令被守护进程激活，  crond常常在后台运行，每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。</p> <h3>crontab用法</h3> <p>crontab的格式如下面：</p> <p>f1 f2 f3 f4 f5 program</p> <p>其中 f1 是表示分钟，f2 表示小时，f3 表示一个月份中的第几日，f4 表示月份，f5 表示一个星期中的第几天。program 表示要执行程式的路径。</p> <ul><li>当 f1 为 * 时表示每分钟都要执行 program，f2 为 * 时表示每小时都要执行程式，其余类推</li><li>当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行，f2 为 a-b 时表示从第 a 到第 b 小时都要执行，其余类推</li><li>当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次，f2 为 */n 表示每 n 小时个时间间隔执行一次，其余类推</li><li>当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行，f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行，其余类推</li></ul> <p>管理员登录SSH,输入命令crontab -e编辑crontab文件，根据上面的格式输入并保存。</p> <h3>crontab例子</h3> <p>每月每天每小时的第 0 分钟执行一次 /bin/ls :</p> <div><ol ln-show"="" title="Double click to hide line number."><li>0 * * * * /bin/ls</li></ol></div> <p>在 12 月内, 每天的早上 6 点到 12 点中，每隔 20 分钟执行一次 /usr/bin/backup :</p> <div><ol ln-show"="" title="Double click to hide line number."><li>*/20 6-12 * 12 * /usr/bin/backup</li></ol></div> <p>周一到周五每天下午 5:00 寄一封信给 alex@domain.name :</p> <div><ol ln-show"="" title="Double click to hide line number."><li>0 17 * * 1-5 mail -s "hi" alex@domain.name &amp;lt; /tmp/maildata</li></ol></div> <p>每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"</p> <div><ol ln-show"="" title="Double click to hide line number."><li>20 0-23/2 * * * echo "haha"</li></ol></div> <p>晚上11点到早上8点之间每两个小时，早上8点</p> <div><ol ln-show"="" title="Double click to hide line number."><li>0 23-7/2，8 * * * date</li></ol></div> <p>在hp unix,中，每20分钟执行一次，表示为：0,20,40 * * * * 而不能采用*/n方式，否则出现语法错误</p> <p>crontab用法其实很容易掌握，懂得使用crontab，对网站和服务器维护起到很大的帮助，比如定时备份，定时优化服务器等。</p></div><img src ="http://www.cppblog.com/colorful/aggbug/201560.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-06 15:31 <a href="http://www.cppblog.com/colorful/archive/2013/07/06/201560.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux静态库和动态库</title><link>http://www.cppblog.com/colorful/archive/2013/07/01/201427.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 01 Jul 2013 09:59:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2013/07/01/201427.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/201427.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2013/07/01/201427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/201427.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/201427.html</trackback:ping><description><![CDATA[<div><div id="cnblogs_post_body"><p>库从本质上来说是一种可执行代码的二进制格式，可以被载入内存中执行。库分静态库和动态库两种。&nbsp; </p><h1>静态库和动态库的区别</h1> <p>1. 静态函数库  </p><p>&nbsp;&nbsp;&nbsp;  这类库的名字一般是libxxx.a；利用静态函数库编译成的文件比较大，因为整个  函数库的所有数据都会被整合进目标代码中，他的优点就显而易见了，即编译后的执行程序不需要外部的函数库支持，因为所有使用的函数都已经被编译进去了。当 然这也会成为他的缺点，因为如果静态函数库改变了，那么你的程序必须重新编译。  </p><p>2. 动态函数库  </p><p>&nbsp;&nbsp;&nbsp;  这类库的名字一般是libxxx.so;相对于静态函数库，动态函数库在编译的时候  并没有被编译进目标代码中，你的程序执行到相关函数时才调用该函数库里的相应函数，因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的 程序，而是程序运行时动态的申请并调用，所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序，所以动态函数库的升级比较方便。 <br />linux系统有几个重要的目录存放相应的函数库，如/lib /usr/lib。  </p><h1>静态库的使用</h1> <p>静态库的操作工具：gcc和ar 命令。&nbsp; </p><p><strong>编写及使用静态库</strong>&nbsp; </p><p><strong>(1)设计库源码 pr1.c 和 pr2.c</strong>&nbsp; </p><p>[root@billstone make_lib]# cat pr1.c&nbsp; </p><p>void print1()&nbsp; </p><p>{&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("This is the first lib src!\n");&nbsp; </p><p>}&nbsp; </p><p>[root@billstone make_lib]# cat pr2.c&nbsp; </p><p>void print2()&nbsp; </p><p>{&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("This is the second src lib!\n");&nbsp; </p><p>}&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong> (2)&nbsp; 编译.c 文件</strong>&nbsp; </p><p>[bill@billstone make_lib]$ cc -O -c pr1.c pr2.c&nbsp; </p><p>[bill@billstone make_lib]$ ls -l pr*.o&nbsp; </p><p>-rw-rw-r--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 804&nbsp;&nbsp;&nbsp; 4 月&nbsp; 15 11:11 pr1.o&nbsp; </p><p>-rw-rw-r--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 804&nbsp;&nbsp;&nbsp; 4 月&nbsp; 15 11:11 pr2.o&nbsp; </p><p><strong>(3)&nbsp; 链接静态库</strong>&nbsp; </p><p>&nbsp;&nbsp;&nbsp; 为了在编译程序中正确找到库文件,静态库必须按照 lib[name].a 的规则命名,如下例中[name]=pr.&nbsp; </p><p>[bill@billstone make_lib]$ ar -rsv libpr.a pr1.o pr2.o&nbsp; </p><p>a - pr1.o&nbsp; </p><p>a - pr2.o&nbsp; </p><p>[bill@billstone make_lib]$ ls -l *.a&nbsp; </p><p>-rw-rw-r--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1822&nbsp;&nbsp;&nbsp; 4 月&nbsp; 15 11:12 libpr.a&nbsp; </p><p>[bill@billstone make_lib]$ ar -t libpr.a&nbsp; </p><p>pr1.o&nbsp; </p><p>pr2.o&nbsp; </p><p><strong>(4)&nbsp; 调用库函数代码 main.c</strong>&nbsp; </p><p>[bill@billstone make_lib]$ cat main.c&nbsp; </p><p>int main()&nbsp; </p><p>{&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print1();&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print2();&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;&nbsp; </p><p>}&nbsp; </p><p><strong>(5)&nbsp; 编译链接选项</strong>&nbsp; </p><p>&nbsp;&nbsp;&nbsp; -L 及-l 参数放在后面.其中,-L 加载库文件路径,-l 指明库文件名字.&nbsp; </p><p>[bill@billstone make_lib]$ gcc -o main main.c -L./ -lpr&nbsp; </p><p>[bill@billstone make_lib]$ ls -l main*&nbsp; </p><p>-rwxrwxr-x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11805&nbsp;&nbsp;&nbsp; 4 月&nbsp; 15 11:17 main&nbsp; </p><p>-rw-rw-r--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 50&nbsp;&nbsp;&nbsp; 4 月&nbsp; 15 11:15 main.c&nbsp; </p><p><strong>(6)执行目标程序</strong>&nbsp; </p><p>[bill@billstone make_lib]$ ./main&nbsp; </p><p>This is the first lib src!&nbsp; </p><p>This is the second src lib!&nbsp; </p><p>[bill@billstone make_lib]$&nbsp; </p><h1>动态库的使用</h1> <p>编写动态库&nbsp; </p><p>(1)<strong>设计库代码</strong>&nbsp; </p><p>[bill@billstone make_lib]$ cat pr1.c&nbsp; </p><p>int p = 2;&nbsp; </p><p>void print(){&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("This is the first dll src!\n");&nbsp; </p><p>}&nbsp; </p><p>[bill@billstone make_lib]$&nbsp;&nbsp;&nbsp; </p><p>(2)<strong>生成动态库</strong>&nbsp; </p><p>[bill@billstone make_lib]$ gcc -O -fpic -shared -o dl.so pr1.c&nbsp; </p><p>[bill@billstone make_lib]$ ls -l *.so&nbsp; </p><p>-rwxrwxr-x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bill&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6592&nbsp;&nbsp;&nbsp; 4 月&nbsp; 15 15:19 dl.so&nbsp; </p><p>[bill@billstone make_lib]$&nbsp; </p><p><strong>动态库的隐式调用</strong>&nbsp; </p><p>&nbsp; 在编译调用库函数代码时指明动态库的位置及名字,&nbsp; 看下面实例&nbsp; </p><p>[bill@billstone make_lib]$ cat main.c&nbsp; </p><p>int main()&nbsp; </p><p>{&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print();&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;&nbsp; </p><p>}&nbsp; </p><p>[bill@billstone make_lib]$ gcc -o tdl main.c ./dl.so&nbsp; </p><p>[bill@billstone make_lib]$ ./tdl&nbsp; </p><p>This is the first dll src!&nbsp; </p><p>[bill@billstone make_lib]$&nbsp; </p><p>当动态库的位置活名字发生改变时,&nbsp; 程序将无法正常运行;&nbsp; 而动态库取代静态库的好处之一则是通过更新动态库而随时升级库的内容.&nbsp; </p><p><strong>动态库的显式调用</strong>&nbsp; </p><p>&nbsp; 显式调用动态库需要四个函数的支持,&nbsp; <strong>函数 dlopen 打开动态库,&nbsp; 函数 dlsym 获取动态库中对象基址,&nbsp; 函</strong><strong>数 dlerror 获取显式动态库操作中的错误信息,&nbsp; 函数 doclose 关闭动态库. </strong> </p><p>[bill@billstone make_lib]$ cat main.c&nbsp; </p><p>#include &lt;dlfcn.h&gt;&nbsp; </p><p>int main()&nbsp; </p><p>{&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void *pHandle;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void (*pFunc)();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; 指向函数的指针&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int *p;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pHandle = dlopen("./d1.so", RTLD_NOW);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; 打开动态库&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!pHandle){&nbsp; </p><p>&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; printf("Can't find d1.so \n");&nbsp; </p><p>&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; exit(1);&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pFunc = (void (*)())dlsym(pHandle, "print");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; 获取库函数 print 的地址&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(pFunc)&nbsp; </p><p>&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; pFunc();&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp; </p><p>&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; printf("Can't find function print\n");&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = (int *)dlsym(pHandle, "p");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; 获取库变量 p 的地址&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(p)&nbsp; </p><p>&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; printf("p = %d\n", *p);&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp; </p><p>&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; printf("Can't find int p\n");&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dlclose(pHandle);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //&nbsp; 关闭动态库&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;&nbsp; </p><p>}&nbsp; </p><p>[bill@billstone make_lib]$ <strong>gcc -o tds main.c &#8211;ld1 &#8211;L.</strong> </p><p>此 时还不能立即./tds，因为在动态函数库使用时，会查找/usr/lib、/lib目录下的动态函数库，而此时我们生成的库不在里边。  这个时候有好几种方法可以让他成功运行： 最直接最简单的方法就是把libstr_out.so拉到/usr/lib或/lib中去。 还有一种方法  export LD_LIBRARY_PATH=$(pwd)  另外还可以在/etc/ld.so.conf文件里加入我们生成的库的目录，然后/sbin/ldconfig。  /etc/ld.so.conf是非常重要的一个目录，里面存放的是链接器和加载器搜索共享库时要检查的目录，默认是从/usr/lib  /lib中读取的，所以想要顺利运行，我们也可以把我们库的目录加入到这个文件中并执行/sbin/ldconfig  。另外还有个文件需要了解/etc/ld.so.cache,里面保存了常用的动态函数库，且会先把他们加载到内存中，因为内存的访问速度远远大于硬盘的 访问速度，这样可以提高软件加载动态函数库的速度了。 </p><h1>库依赖的查看</h1> <p>使用ldd命令来查看执行文件依赖于哪些库。</p> <p>该命令用于判断某个可执行的 binary 档案含有什么动态函式库。<br />[root@test root]# ldd [-vdr] [filename]<br />参数说明：<br />--version　　打印ldd的版本号<br />-v --verbose　　打印所有信息，例如包括符号的版本信息<br />-d --data-relocs　　执行符号重部署，并报告缺少的目标对象（只对ELF格式适用）<br />-r --function-relocs　　对目标对象和函数执行重新部署，并报告缺少的目标对象和函数（只对ELF格式适用）<br />--help 用法信息。 </p> <p>如果命令行中给定的库名字包含'/'，这个程序的libc5版本将使用它作为库名字；否则它将在标准位置搜索库。运行一个当前目录下的共享库，加前缀"./"。</p></div></div><img src ="http://www.cppblog.com/colorful/aggbug/201427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2013-07-01 17:59 <a href="http://www.cppblog.com/colorful/archive/2013/07/01/201427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>shell脚本中局部变量</title><link>http://www.cppblog.com/colorful/archive/2012/07/26/185148.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Thu, 26 Jul 2012 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/07/26/185148.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/185148.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/07/26/185148.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/185148.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/185148.html</trackback:ping><description><![CDATA[<div><div id="sina_keyword_ad_area2"  "=""> 			<p>在shell中定义函数可以使代码模块化，便于复用代码。不过脚本本身的变量和函数的变量的作用域问题可能令你费解，在这里梳理一下这个问题。<br />  <br /> (1)Shell脚本中定义的变量是global的，其作用域从被定义的地方开始，到shell结束或被显示删除的地方为止。<br />  <br /> 例1：脚本变量的作用域<br /> #!/bin/bash<br /> #define the function ltx_func<br /> ltx_func()<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr> echo $v1<br /> &nbsp;<wbr>&nbsp;<wbr> #modify the variable v1<br /> &nbsp;<wbr>&nbsp;<wbr> v1=200<br /> }<br /> #define the variable v1<br /> v1=100<br /> #call the function ltx_func<br /> ltx_func<br /> echo $v1<br /> <br /> 结果：<br /> 100<br /> 200<br /> 解析：脚本变量v1的作用域从被定义的地方开始，到shell结束。调用函数ltx_func的地方在变量v1的作用域内，所以能够访问并修改变量v1。<br />  <br /> (2)Shell函数定义的变量默认是global的，其作用域从&#8220;函数被调用时执行变量定义的地方&#8221;开始，到shell结束或被显示删除处为止。函数定义的变量可以被显示定义成local的，其作用域局限于函数内。但请注意，函数的参数是local的。<br />  <br /> 例2：函数定义的global变量<br /> #!/bin/bash<br /> #define the function ltx_func<br /> ltx_func()<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr> #define the variable v2<br /> &nbsp;<wbr>&nbsp;<wbr> v2=200<br /> }<br /> #call the function ltx_func<br /> ltx_func<br /> echo $v2<br /> <br /> 结果：<br /> 200<br /> 解析：函数变量v2默认是global的，其作用域从&#8220;函数被调用时执行变量定义的地方&#8221;开始，到shell结束为止。注意，不是从定义函数的地方开始，而是从调用函数的地方开始。打印命令在变量v2的作用域内，所以能够访问变量v2。<br />  <br /> 例3：函数定义的local变量<br /> #!/bin/bash<br /> #define the function ltx_func<br /> ltx_func()<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr> #define the local variable v2<br /> &nbsp;<wbr>&nbsp;<wbr> local v2=200<br /> }<br /> #call the function ltx_func<br /> ltx_func<br /> echo $v2<br /> <br /> 结果：<br /> （空）<br /> 解析：函数变量v2显示定义为local的，其作用域局限于函数内。打印命令在函数外，不在变量v2的作用域内，所以能够不能访问变量v2。<br />  <br /> 例4：函数参数是local变量<br /> #!/bin/bash<br /> #define the function ltx_func<br /> ltx_func()<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr> echo "param 1: $1"<br /> }<br /> #call the function ltx_func<br /> ltx_func 100<br /> <br /> 结果：<br /> 100<br /> 解析：函数参数是local的，通过位置变量来访问。打印命令输出函数的第一个参数。<br /> <br /> (3)如果同名，Shell函数定义的local变量会屏蔽脚本定义的global变量。<br /> <br /> 例5：同名local变量屏蔽global变量<br /> #!/bin/bash<br /> #define the function ltx_func<br /> ltx_func()<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr> echo $v1<br /> &nbsp;<wbr>&nbsp;<wbr> #define the local variable v1<br /> &nbsp;<wbr>&nbsp;<wbr> local v1=200<br /> &nbsp;<wbr>&nbsp;<wbr> echo $v1<br /> }<br /> #define the global variable v1<br /> v1=100</p> <p>#call the function ltx_func<br /> ltx_func<br /> echo $v1<br /> <br /> 结果：<br /> 100<br /> 200<br /> 100<br /> 解析：global变量v1的作用域从被定义的地方开始，到shell结束。调用函数ltx_func的地方在变量v1的作用域内，所以能够变量v1。函 数又定义了同名的local变量v1，同名local变量屏蔽global变量，所以函数第二次打印访问的是local变量。退出函数后再次打印v1，此 时函数定义的local变量已经消失，访问的是global变量。</p>							 		</div></div><img src ="http://www.cppblog.com/colorful/aggbug/185148.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-07-26 10:53 <a href="http://www.cppblog.com/colorful/archive/2012/07/26/185148.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nohup</title><link>http://www.cppblog.com/colorful/archive/2012/07/24/184858.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Tue, 24 Jul 2012 06:55:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/07/24/184858.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/184858.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/07/24/184858.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/184858.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/184858.html</trackback:ping><description><![CDATA[<div></div><div>http://baike.baidu.com/view/1839401.htm</div><img src ="http://www.cppblog.com/colorful/aggbug/184858.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-07-24 14:55 <a href="http://www.cppblog.com/colorful/archive/2012/07/24/184858.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译c文件出现undefined reference to `__gxx_personality_v0'</title><link>http://www.cppblog.com/colorful/archive/2012/07/23/184712.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 23 Jul 2012 03:47:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/07/23/184712.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/184712.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/07/23/184712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/184712.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/184712.html</trackback:ping><description><![CDATA[<div>在linux编写程序如下<br /><center><table border="0" cellpadding="0" cellspacing="0" width="90%"><tbody><tr><td><strong>QUOTE:</strong></td></tr></tbody></table><table style="border: 1px solid #808080" border="0" cellpadding="10" cellspacing="1" width="90%"><tbody><tr><td style="word-break:break-all" bgcolor="#FFFFFF" width="100%">#include <br /> #include <br /> #include <br /> int count=0;<br /> void ctrl_c_count(int);<br /> main()<br /> {<br />  int c;<br />   void (*old_handler)(int);<br />   old_handler=signal(SIGINT,ctrl_c_count);<br />   while((c=getchar()!='\n'))<br />        ;<br />    printf("Ctrl_C count=%d\n",count);<br />    signal(SIGINT,old_handler);<br />    <br /> }<br /> void ctrl_c_count(int i)<br /> {<br />  printf("Ctrl_C\n");<br />  count++;<br /> }</td></tr></tbody></table></center><br />这个程序的功能是研究signal函数的应用.<br /> signal 函数是用于设置信号量的处理函数为自定义的。<br /> SIGINT是用户在终端上按下ctrl+c的而产生信号量<br /> 它的系统默认的处理函数为终止正运行的进程<br /> 现在把它改成按ctrl+c后，是全局变量count加1的操作<br /> 当用户在终端输入回车后该进程结束。<br /> 且又把SIGINT的处理函数为默认的。<br /> <br /> 当我把上述程序保存为t.cpp时<br /> 利用gcc -o t t.cpp<br /> 产生如下错误<br /> /tmp/ccGsoxH2.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'<br /> 解决方法用 gcc -o t t.cpp -lstdc++<br /> 为什么会出现这个错误：是因为你用gcc编译.cpp文件.按系统默认.cpp文件是c++的文件格式<br /> 另一个方法是用g++ -o t t.cpp  也是可以的<br /> 还有一种方法是把文件保存为.c格式，反正里面全是c的代码<br /> 然后用gcc -o t t.c或者是g++ -o t t.c 都是OK的</div><img src ="http://www.cppblog.com/colorful/aggbug/184712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-07-23 11:47 <a href="http://www.cppblog.com/colorful/archive/2012/07/23/184712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个linux 博客</title><link>http://www.cppblog.com/colorful/archive/2012/05/07/173878.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 07 May 2012 01:56:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/05/07/173878.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/173878.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/05/07/173878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/173878.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/173878.html</trackback:ping><description><![CDATA[<div>http://blog.chinaunix.net/uid/20754793/frmd/14822/page/1.html</div><img src ="http://www.cppblog.com/colorful/aggbug/173878.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-05-07 09:56 <a href="http://www.cppblog.com/colorful/archive/2012/05/07/173878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux中时间度量 </title><link>http://www.cppblog.com/colorful/archive/2012/05/07/173877.html</link><dc:creator>多彩人生</dc:creator><author>多彩人生</author><pubDate>Mon, 07 May 2012 01:51:00 GMT</pubDate><guid>http://www.cppblog.com/colorful/archive/2012/05/07/173877.html</guid><wfw:comment>http://www.cppblog.com/colorful/comments/173877.html</wfw:comment><comments>http://www.cppblog.com/colorful/archive/2012/05/07/173877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/colorful/comments/commentRss/173877.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/colorful/services/trackbacks/173877.html</trackback:ping><description><![CDATA[<div><a>Linux中时间度量</a> </div><div><p><strong>一)ANSI clock函数</strong></p> <p><br /> 1)概述:<br /> clock 函数的返回值类型是clock_t,它除以CLOCKS_PER_SEC来得出时间,一般用两次clock函数来计算进程自身运行的时间.</p> <p>ANSI clock有三个问题:<br /> 1)如果超过一个小时,将要导致溢出.<br /> 2)函数clock没有考虑CPU被子进程使用的情况.<br /> 3)也不能区分用户空间和内核空间.</p> <p>所以clock函数在linux系统上变得没有意义.</p> <p>2)测试<br /> 编写test1.c程序,测试采用clock函数的输出与time程序的区别.</p> <p>vi test1.c<br /> #include &lt;stdio.h&gt;<br /> #include &lt;stdlib.h&gt;<br /> #include &lt;time.h&gt;</p> <p>int main( void )<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr> long i=1000L;<br /> &nbsp;<wbr>&nbsp;<wbr> clock_t start, finish;<br /> &nbsp;<wbr>&nbsp;<wbr> double&nbsp;<wbr> duration;<br /> &nbsp;<wbr>&nbsp;<wbr> printf( "Time to do %ld empty loops is ", i );<br /> &nbsp;<wbr>&nbsp;<wbr> start = clock();<br /> &nbsp;<wbr>&nbsp;<wbr> while (--i){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> system("cd");<br /> &nbsp;<wbr>&nbsp;<wbr> }<br /> &nbsp;<wbr>&nbsp;<wbr> finish = clock();<br /> &nbsp;<wbr>&nbsp;<wbr> duration = (double)(finish - start) / CLOCKS_PER_SEC;<br /> &nbsp;<wbr>&nbsp;<wbr> printf( "%f seconds\n", duration );<br /> &nbsp;<wbr>&nbsp;<wbr> return 0;<br /> }</p> <p>gcc test1.c -o test1</p> <p>time ./test1<br /> Time to do 1000 empty loops is 0.180000 seconds</p> <p>real&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m3.492s<br /> user&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m0.512s<br /> sys&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m2.972s</p> <p>3)总结:<br /> (1)程序调用 system("cd");，这里主要是系统模式子进程的消耗,test1程序不能体现这一点.<br /> (2)0.180000 seconds秒的消耗是两次clock()函数调用除以CLOCKS_PER_SEC.<br /> (3)clock()函数返回值是一个相对时间，而不是绝对时间.<br /> (4)CLOCKS_PER_SEC是系统定义的宏，由GNU标准库定义为1000000.</p> <p>&nbsp;<wbr></p> <p><br /> <strong>二)times()时间函数</strong></p> <p>1)概述:</p> <p>原型如下：<br /> clock_t times(struct tms *buf);</p> <p>tms结构体如下:<br /> strace tms{<br /> &nbsp;<wbr>clock_t tms_utime;<br /> &nbsp;<wbr>clock_t tms_stime;<br /> &nbsp;<wbr>clock_t tms_cutime;<br /> &nbsp;<wbr>clock_t tms_cstime;<br /> }</p> <p>注释:<br /> tms_utime记录的是进程执行用户代码的时间.<br /> tms_stime记录的是进程执行内核代码的时间.<br /> tms_cutime记录的是子进程执行用户代码的时间.<br /> tms_cstime记录的是子进程执行内核代码的时间.</p> <p><br /> 2)测试:</p> <p>vi test2.c<br /> #include &lt;sys/times.h&gt;<br /> #include &lt;stdio.h&gt;<br /> #include &lt;stdlib.h&gt;<br /> #include &lt;sys/types.h&gt;<br /> #include &lt;unistd.h&gt;</p> <p>static void do_cmd(char *);<br /> static void pr_times(clock_t, struct tms *, struct tms *);</p> <p>int main(int argc, char *argv[]){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int i;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> for(i=1; argv[i]!=NULL; i++){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> do_cmd(argv[i]);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> exit(1);<br /> }<br /> static void do_cmd(char *cmd){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct tms tmsstart, tmsend;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> clock_t start, end;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int status;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if((start=times(&amp;tmsstart))== -1)<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> puts("times error");<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if((status=system(cmd))&lt;0)<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> puts("system error");<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if((end=times(&amp;tmsend))== -1)<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> puts("times error");<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> pr_times(end-start, &amp;tmsstart, &amp;tmsend);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> exit(0);<br /> }<br /> static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> static long clktck=0;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if(0 == clktck)<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> if((clktck=sysconf(_SC_CLK_TCK))&lt;0)<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> puts("sysconf err");<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("real:%7.2f\n", real/(double)clktck);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("user-cpu:%7.2f\n", (tmsend-&gt;tms_utime - tmsstart-&gt;tms_utime)/(double)clktck);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("system-cpu:%7.2f\n", (tmsend-&gt;tms_stime - tmsstart-&gt;tms_stime)/(double)clktck);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("child-user-cpu:%7.2f\n", (tmsend-&gt;tms_cutime - tmsstart-&gt;tms_cutime)/(double)clktck);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("child-system-cpu:%7.2f\n", (tmsend-&gt;tms_cstime - tmsstart-&gt;tms_cstime)/(double)clktck);<br /> }</p> <p>编译:<br /> gcc test2.c -o test2</p> <p>测试这个程序:<br /> time ./test2 "dd if=/dev/zero f=/dev/null bs=1M count=10000"<br /> 10000+0 records in<br /> 10000+0 records out<br /> 10485760000 bytes (10 GB) copied, 4.93028 s, 2.1 GB/s<br /> real:&nbsp;<wbr>&nbsp;<wbr> 4.94<br /> user-cpu:&nbsp;<wbr>&nbsp;<wbr> 0.00<br /> system-cpu:&nbsp;<wbr>&nbsp;<wbr> 0.00<br /> child-user-cpu:&nbsp;<wbr>&nbsp;<wbr> 0.01<br /> child-system-cpu:&nbsp;<wbr>&nbsp;<wbr> 4.82</p> <p>real&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m4.943s<br /> user&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m0.016s<br /> sys&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m4.828s</p> <p><br /> 3)总结:<br /> (1)通过这个测试,系统的time程序与test2程序输出基本一致了.<br /> (2)(double)clktck是通过clktck=sysconf(_SC_CLK_TCK)来取的,也就是要得到user-cpu所占用的时间, 就要用<br />  (tmsend-&gt;tms_utime - tmsstart-&gt;tms_utime)/(double)clktck);<br /> (3)clock_t times(struct tms *buf);返回值是过去一段时间内时钟嘀嗒的次数.<br /> (4)times()函数返回值也是一个相对时间.</p> <p>&nbsp;<wbr></p> <p><strong>三)实时函数clock_gettime</strong></p> <p>在POSIX1003.1中增添了这个函数,它的原型如下：<br /> int clock_gettime(clockid_t clk_id, struct timespec *tp);</p> <p>它有以下的特点:<br /> 1)它也有一个时间结构体:timespec ,timespec计算时间次数的单位是十亿分之一秒.<br /> strace timespec{<br /> &nbsp;<wbr>time_t tv_sec;<br /> &nbsp;<wbr>long tv_nsec;<br /> }</p> <p>2)clockid_t是确定哪个时钟类型.</p> <p>CLOCK_REALTIME: 标准POSIX实时时钟<br /> CLOCK_MONOTONIC: POSIX时钟,以恒定速率运行;不会复位和调整,它的取值和CLOCK_REALTIME是一样的.<br /> CLOCK_PROCESS_CPUTIME_ID和CLOCK_THREAD_CPUTIME_ID是CPU中的硬件计时器中实现的.</p> <p><br /> 3)测试:<br /> #include&lt;time.h&gt;<br /> #include&lt;stdio.h&gt;<br /> #include&lt;stdlib.h&gt;</p> <p>#define MILLION 1000000</p> <p><br /> int main(void)<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> long int loop = 1000;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct timespec tpstart;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct timespec tpend;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> long timedif;</p> <p> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> clock_gettime(CLOCK_MONOTONIC, &amp;tpstart);</p> <p> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> while (--loop){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> system("cd");<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> }</p> <p> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> clock_gettime(CLOCK_MONOTONIC, &amp;tpend);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> timedif = MILLION*(tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_nsec-tpstart.tv_nsec)/1000;<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> fprintf(stdout, "it took %ld microseconds\n", timedif);</p> <p> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> return 0;<br /> }</p> <p>编译:<br /> gcc test3.c -lrt -o test3</p> <p>计算时间:<br /> time ./test3<br /> it took 3463843 microseconds</p> <p>real&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m3.467s<br /> user&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m0.512s<br /> sys&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m2.936s</p> <p>&nbsp;<wbr></p> <p><br /> <strong>四)时间函数gettimeofday()</strong></p> <p>1)概述:<br /> gettimeofday()可以获得当前系统的时间,是一个绝对值</p> <p>原型如下：<br /> int gettimeofday ( struct timeval * tv , struct timezone * tz )</p> <p>timeval结型体的原型如下:<br /> struct timeval {<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> time_t&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> tv_sec;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> suseconds_t tv_usec;&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> };</p> <p>所以它可以精确到微秒</p> <p><br /> 测试:<br /> #include &lt;sys/time.h&gt;<br /> #include &lt;stdio.h&gt;<br /> #include &lt;unistd.h&gt;<br /> int<br /> main(){<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int i=10000000;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct timeval tvs,tve;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> gettimeofday(&amp;tvs,NULL);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> while (--i);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> gettimeofday(&amp;tve,NULL);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> double span = tve.tv_sec-tvs.tv_sec + (tve.tv_usec-tvs.tv_usec)/1000000.0;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("time: %.12f\n",span);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> return 0;<br /> }</p> <p>gcc test5.c<br /> ./a.out<br /> time: 0.041239000000</p> <p>&nbsp;<wbr></p> <p><strong>五)四种时间函数的比较</strong></p> <p>1)精确度比较:</p> <p>以下是各种精确度的类型转换:<br /> 1秒=1000毫秒(ms), 1毫秒=1/1000秒(s)；<br /> 1秒=1000000 微秒(&#956;s), 1微秒=1/1000000秒(s)；<br /> 1秒=1000000000 纳秒(ns),1纳秒=1/1000000000秒(s)；</p> <p><br /> 2)<br /> clock()函数的精确度是10毫秒(ms)<br /> times()函数的精确度是10毫秒(ms)<br /> gettimofday()函数的精确度是微秒(&#956;s)<br /> clock_gettime()函数的计量单位为十亿分之一，也就是纳秒(ns)</p> <p><br /> 3)测试4种函数的精确度:</p> <p>vi test4.c</p> <p><br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;stdio.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;stdlib.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;unistd.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;time.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;sys/times.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;sys/time.h&gt;<br /> #define WAIT for(i=0;i&lt;298765432;i++);<br /> #define MILLION&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 1000000<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int<br /> main ( int argc, char *argv[] )<br /> {<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> int i;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> long ttt;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> clock_t s,e;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct tms aaa;</p> <p><br /><br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> s=clock();<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> WAIT;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e=clock();<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("clock time : %.12f\n",(e-s)/(double)CLOCKS_PER_SEC);</p> <p><br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> long tps = sysconf(_SC_CLK_TCK);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> s=times(&amp;aaa);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> WAIT;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> e=times(&amp;aaa);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("times time : %.12f\n",(e-s)/(double)tps);</p> <p><br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct timeval tvs,tve;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> gettimeofday(&amp;tvs,NULL);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> WAIT;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> gettimeofday(&amp;tve,NULL);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> double span = tve.tv_sec-tvs.tv_sec + (tve.tv_usec-tvs.tv_usec)/1000000.0;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("gettimeofday time: %.12f\n",span);</p> <p><br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct timespec tpstart;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> struct timespec tpend;</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> clock_gettime(CLOCK_REALTIME, &amp;tpstart);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> WAIT;<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> clock_gettime(CLOCK_REALTIME, &amp;tpend);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> double timedif = (tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_nsec-tpstart.tv_nsec)/1000000000.0;<br />  &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("clock_gettime time: %.12f\n", timedif);</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> return EXIT_SUCCESS;<br /> }</p> <p>gcc -lrt test4.c -o test4<br /> debian:/tmp# ./test4<br /> clock time : 1.190000000000<br /> times time : 1.180000000000<br /> gettimeofday time: 1.186477000000<br /> clock_gettime time: 1.179271718000</p> <p>&nbsp;<wbr></p> <p><strong>六)内核时钟</strong></p> <p>默认的Linux时钟周期是100HZ,而现在最新的内核时钟周期默认为250HZ.<br /> 如何得到内核的时钟周期呢?<br /> grep ^CONFIG_HZ /boot/config-2.6.26-1-xen-amd64</p> <p>CONFIG_HZ_250=y<br /> CONFIG_HZ=250</p> <p>结果就是250HZ.</p> <p>而用sysconf(_SC_CLK_TCK);得到的却是100HZ<br /> 例如:</p> <p>#include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;stdio.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;stdlib.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;unistd.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;time.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;sys/times.h&gt;<br /> #include&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;sys/time.h&gt;</p> <p>int<br /> main ( int argc, char *argv[] )<br /> {</p> <p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> long tps = sysconf(_SC_CLK_TCK);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> printf("%ld\n", tps);<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> return EXIT_SUCCESS;<br /> }</p> <p>为什么得到的是不同的值呢？<br /> 因为sysconf(_SC_CLK_TCK)和CONFIG_HZ所代表的意义是不同的.<br /> sysconf(_SC_CLK_TCK)是GNU标准库的clock_t频率.<br /> 它的定义位置在:/usr/include/asm/param.h</p> <p>例如:<br /> #ifndef HZ<br /> #define HZ 100<br /> #endif</p> <p>最后总结一下内核时间:<br /> 内核的标准时间是jiffy,一个jiffy就是一个内部时钟周期,而内部时钟周期是由250HZ的频率所产生中的,也就是一个时钟滴答,间隔时间是4毫 秒(ms).</p> <p>也就是说:<br /> 1个jiffy=1个内部时钟周期=250HZ=1个时钟滴答=4毫秒</p> <p>每经过一个时钟滴答就会调用一次时钟中断处理程序，处理程序用jiffy来累计时钟滴答数,每发生一次时钟中断就增1.<br /> 而每个中断之后,系统通过调度程序跟据时间片选择是否要进程继续运行,或让进程进入就绪状态.</p> <p> 最后需要说明的是每个操作系统的时钟滴答频率都是不一样的,LINUX可以选择(100,250,1000)HZ,而DOS的频率是55HZ.</p> <p>&nbsp;<wbr></p> <p><strong>七)为应用程序计时</strong></p> <p>用time程序可以监视任何命令或脚本占用CPU的情况.</p> <p>1)bash内置命令time<br /> 例如:<br /> time sleep 1</p> <p>real&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m1.016s<br /> user&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m0.000s<br /> sys&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 0m0.004s</p> <p><br /> 2)/usr/bin/time的一般命令行<br /> 例如:<br /> \time sleep 1<br /> 0.00user 0.00system 0:01.01elapsed 0%CPU (0avgtext+0avgdata 0maxresident)k<br /> 0inputs+0outputs (1major+176minor)pagefaults 0swaps</p> <p>注：<br /> 在命令前加上斜杠可以绕过内部命令.<br /> /usr/bin/time还可以加上-v看到更具体的输出:<br /> \time -v sleep 1<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Command being timed: "sleep 1"<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> User time (seconds): 0.00<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> System time (seconds): 0.00<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Percent of CPU this job got: 0%<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.00<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Average shared text size (kbytes): 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Average unshared data size (kbytes): 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Average stack size (kbytes): 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Average total size (kbytes): 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Maximum resident set size (kbytes): 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Average resident set size (kbytes): 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Major (requiring I/O) page faults: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Minor (reclaiming a frame) page faults: 178<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Voluntary context switches: 2<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Involuntary context switches: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Swaps: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> File system inputs: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> File system outputs: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Socket messages sent: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Socket messages received: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Signals delivered: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Page size (bytes): 4096<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Exit status: 0<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr><br />  这里的输出更多来源于结构体rusage.</p> 最后，我们看到real time大于user time和sys time的总和，这说明进程不是在系统调用中阻塞,就是得不到运行的机会.<br /> 而sleep()的运用，也说明了这一点</div><img src ="http://www.cppblog.com/colorful/aggbug/173877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/colorful/" target="_blank">多彩人生</a> 2012-05-07 09:51 <a href="http://www.cppblog.com/colorful/archive/2012/05/07/173877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>