??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av伊人久久综合密臀性色 ,日韩美女18网站久久精品,9999国产精品欧美久久久久久http://www.shnenglu.com/guojingjia2006/category/10141.htmlPay it forword - 我ƈ不觉的自豪,我所试的事情都p|了······习(fn)惯原本生zȝZҎ(gu)改变Q就现状很p,他们也很难改变,在过E中Q他们还是放弃了······他们一攑ּQ大家就都是输家······让爱传出去,很困难,也无法预料,Z需要更l心的观察别人,要随时注意才能保护别人,因ؓ他们未必知道自己要什么····?/description>zh-cnWed, 04 Sep 2013 13:08:52 GMTWed, 04 Sep 2013 13:08:52 GMT60Nagios插g~写及调试方?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2013/09/03/202981.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Tue, 03 Sep 2013 01:39:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2013/09/03/202981.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/202981.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2013/09/03/202981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/202981.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/202981.html</trackback:ping><description><![CDATA[<div><p style="text-indent: 2em">前言Q? Nagios是相当不错的监控工具Q被UC?#8220;监控之神”Q但同样也有“难搞?#8221;头衔。发挥Nagios一切魅力的都是他的插gQ正因ؓ丰富多样的插件让 nagios有血有肉。监控的内容不断在变化,插g也不断变化,默认的一些插件可能越来越不能满需求,q个时候就要自己来写些插g了?/p> <p style="text-indent: 2em">以下是用我的第一个Nagios插g来说明编写方法和我遇C些问题调试方法。如果你有耐心可以通篇看完Q应该对W一ơ写的h来说会有很大帮助Q如果你看不懂,可能是我写得不清?那就没办法了 表达能力有限Q?/p> <p style="text-indent: 2em">需求:</p> <p style="text-indent: 2em">监控普通磁盘的健康状况Q普通磁盘以外还有RAID、阵列的监控是不同方法来做的Q这里先不讨论,先从最单的入手Q,定期q行,q进行报警,报警内容盘是否正常Q不正常是什么状态?/p> <p style="text-indent: 2em">分析~写q程Q?/p> <p style="text-indent: 2em">我写脚本的前提都是先从手动成功完成,再到自动化(我想其它人的思\应该都一L(fng)Q?/p> <p style="text-indent: 2em">1、找到监控磁盘的Ҏ(gu)</p> <p style="text-indent: 2em">通过一番查?smartctl q个命o是比较不错的  centos slackware一般的默认都有q个</p> <p style="text-indent: 2em">smartctl -H /dev/sda  只检状?/p> <p style="text-indent: 2em">smartctl -i /dev/sda   只检硬盘信?/p> <p style="text-indent: 2em">smartctl -a /dev/sda 所有信?/p> <p style="text-indent: 2em">2、获取检信?/p> <p style="text-indent: 2em"># smartctl -H /dev/sda</p> <p style="text-indent: 2em">smartctl version 5.38 [x86_64-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen</p> <p style="text-indent: 2em">Home page is http://smartmontools.sourceforge.net/</p> <p style="text-indent: 2em">SMART Health Status: OK</p> <p style="text-indent: 2em">关键的最后一行说明磁盘的情况       截取  DISK_HEALTH=`smartctl -H /dev/sda | tail -1 | cut -d: -f2-  `</p> <p style="text-indent: 2em">3?q行关键判断</p> <p style="text-indent: 2em">据我所知道?smartctl 5.38  是出以上的結?为OK</p> <p style="text-indent: 2em">?smartctl 5.39 是出以下i果</p> <p style="text-indent: 2em">=== START OF READ SMART DATA SECTION ===</p> <p style="text-indent: 2em">SMART overall-health self-assessment test result: PASSED</p> <p style="text-indent: 2em">关键词是PASSED</p> <p style="text-indent: 2em">所以要分析判断多种情况</p> <p style="text-indent: 2em">4、脚本编写步?/p> <p style="text-indent: 2em">1Q了解nagios插g~写规范</p> <p style="text-indent: 2em">Nagios的插件可以用脚本Qshell、PerlQC~译后的可执行程序,但必L以下两件事Q?/p> <p style="text-indent: 2em">A、既出时有一个返回?/p> <p style="text-indent: 2em">B、至向标准输出讑֤QSTDOUTQ输Z行文件。(但也不能太大Q默认是4KQ如果想大些Q修Ҏ(gu)E序吧,Ҏ(gu)搜? </p> <p style="text-indent: 2em">q回值定义:</p> <p style="text-indent: 2em">Plugin Return Code Service State DISK State <br />0 OK OK 或者PASSED <br />1 WARNING 插g警告  DISK报警只分OK或者CRITICAL <br />2 CRITICAL  DISK非OK 或者PASSED <br />3 UNKNOWN  未知状?</p> <p style="text-indent: 2em">2)插g~写SHELL速成?/p> <p style="text-indent: 2em">在这里我选用我最熟?zhn)的SHELLq行脚本~写 ,</p> <p style="text-indent: 2em">我的速成法就是,直接去nagios exchange M比较成熟的比较简单的shell脚本Q这样会从一开始借鉴别h好的Ҏ(gu)Q养成好的习(fn)惯,而且只要你有一点SHELL~程l验也可以很快写得像一个老手。(不过不要把自己搞晕了pQ?/p> <p style="text-indent: 2em">3Q以下是我的check_disk_health.sh</p> <p style="text-indent: 2em">#!/bin/bash<br /># ========================================================================================<br /># disk health  plugin for Nagios<br />#<br /># Written by    : Ajian<br /># Release       : 1.2.0<br /># Creation date : 2009-07-28<br /># Revision date : 2009-07-30<br /># Description   : Nagios plugin (script) to check disk health .<br />#               This script has been designed and written on Linux System.<br />#<br /># USAGE         : ./check_disk_health.sh [-d (disk)]<br />#<br /># Exemple: ./check_cpu_stats.sh<br />#          ./check_cpu_stats.sh -d /dev/sda<br />#<br />#<br /># HISTORY :<br />#     Release   |     Date      |    Authors            |       Description<br /># --------------+---------------+----------------------+-----------------------------------<br />#  1.0.0        | 2009-07-28     | Ajian                | Create the script<br />#  1.2.0        | 2009-07-30    |  Ajian                | modify the script and run well ,fix a bug.<br /># -----------------------------------------------------------------------------------------<br /># NOTICE:<br />#-----------------------------------------------------------------------------------------<br />#     You should have the root Permissions ,You can use sudo to realize .<br /># -----------------------------------------------------------------------------------------                                   <br /> <br /># Nagios return codes<br />#定义 nagiosq回的状态变?br />STATE_OK=0<br />STATE_WARNING=1<br />STATE_CRITICAL=2<br />STATE_UNKNOWN=3      <br /> <br /># Paths to commands used in this script.  These may have to be modified to match your system setup.<br /># 定义关键的核心命令smartctl 路径 如果你的pȝ不是q个地址Q请更改?以下注释的是调试的信息,是自动获取命令\径的Ҏ(gu)?br />SMARTCTL="/usr/sbin/smartctl"<br />#SMARTCTL=`which smartctl`<br />#if [ $? -ne 0 ]; then<br />#        echo " smartctl is found in $SMARTCTL ; Go on ... "<br />#        echo "smartctl the command cannot find"<br />#        exit $STATE_UNKNOWN<br />#fi<br /># Plugin parameters value if not define<br /># 定义默认的检硬?br />CHECK_DISK="/dev/sda"                  <br /> <br /># Plugin variable description<br /># 插g描述信息<br />PROGNAME=$(basename $0)<br />RELEASE="Revision 1.2.0"<br />AUTHOR="(c) 2009 Ajian ()"<br /> <br /># Functions plugin usage<br /># 插g的用方法函?br />print_release() {<br />    echo "$RELEASE $AUTHOR"<br />}                          <br /> <br />print_usage() {<br />        echo ""<br />        echo "$PROGNAME $RELEASE - Disk health check script for Nagios"<br />        echo ""<br />        echo "Usage: check_disk_health.sh -d /dev/sdb"<br />        echo ""<br />        echo "  -d  the disk (/dev/sda) "<br />        echo "          not the Hard disk partition(sda2 is wrong)"<br />        echo "  -v  check the version"<br />        echo "  -h  Show this page"<br />        echo ""<br />    echo "Usage: $PROGNAME"<br />    echo "Usage: $PROGNAME --help"<br />    echo ""<br />    exit 0<br />}                                                                                                          <br /> <br />print_help() {<br />        print_usage<br />        echo ""<br />        echo "This plugin will check disk health  "<br />        echo ""<br />        exit 0<br />}                                                  <br /> <br /># Parse parameters<br /># 传递参?br />while [ $# -gt 0 ]; do<br />    case "$1" in<br />        -h | --help)<br />            print_help<br />            exit $STATE_OK<br />            ;;<br />        -v | --version)<br />                print_release<br />                exit $STATE_OK<br />                ;;<br />        -d | --disk)<br />                shift<br />                CHECK_DISK=$1<br />                #判断盘是否存在<br />                if [ ! -b $CHECK_DISK ];then<br />                        echo "$CHECK_DISK is no exsit,Please change it "<br />                        exit $STATE_CRITICAL<br />                fi<br />                ;;<br />        *)  echo "Unknown argument: $1"<br />            print_usage<br />            exit $STATE_UNKNOWN<br />            ;;<br />        esac<br />shift<br />done<br /> <br />Q根据不同的操作q行不同的操作,q里暂时只支持Linux<br />case `uname` in<br />        Linux )<br />             #最核心的部?前面都是些脚本的基本功能 一个框?因ؓW一个脚本牵扯到了很多东西,虽然功能很简单,<br />             #但折腾了我不,在后面的分析中会具体说到 M注意sudo用法 脚本一开始就有说?br />                DISK_HEALTH=`$SMARTCTL  -H $CHECK_DISK | tail -1 | cut -d: -f2- `<br />                #DISK_HEALTH="OK"<br />        #       DISK_INFO=`/usr/bin/sudo $SMARTCTL -i $CHECK_DISK | grep "Device:"`<br />                if [ "$DISK_HEALTH" = " OK" ]|| [  "$DISK_HEALTH" = " PASSED" ];then<br />                        echo "OK - $CHECK_DISK status is $DISK_HEALTH "<br />                        #echo "OK - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"<br />                        exit $STATE_OK<br />                else<br />                        echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH "<br />                        #echo "CRITICAL - $CHECK_DISK status is $DISK_HEALTH | $DISK_INFO"<br />                        exit $STATE_CRITICAL<br />        fi<br />            ;;<br /> <br />        *)              echo "UNKNOWN: `uname` not yet supported by this plugin. Coming soon !"<br />                        exit $STATE_UNKNOWN<br />            ;;<br />        esac4)q行脚本</p> <p style="text-indent: 2em">Q注意:在最开始自己写的脚本是没有sudo的,以上脚本是已l调试过后的Q还需要配|一些其它的东西Q慢慢看吧)<br />l与脚本执行权限Q手动执?/p> <p style="text-indent: 2em"># ./check_disk_health.sh<br />OK – /dev/sda status is  OK</p> <p style="text-indent: 2em">i果正确了,其实q个时候,高兴得太早了?我先不说问题、l正常的一般流E?/p> <p style="text-indent: 2em">5、配|Nagios 调用插g</p> <p style="text-indent: 2em">1Q在q程NRPE 被监控服务器上修改nrpe.conf<br /># vim /usr/local/nagios/etc/nrpe.cfg<br />d command[check_sda_health]=/usr/local/nagios/libexec/check_disk_health.sh -d /dev/sda<br />Q注意这里了Q先提醒下,q里是错误的Q一般是正确的,是这个脚本的Ҏ(gu)性造成的)</p> <p style="text-indent: 2em">2Q在Nagios 监控服务器上d一些配|?/p> <p style="text-indent: 2em">定义服务</p> <p style="text-indent: 2em">define service{<br />use                             Disk-Health<br />host_name                       DB-56<br />servicegroups                   Disk-Health<br />service_description            check sda disk health<br />contact_groups                  admins<br />check_command               check_nrpe!check_sda_health<br />}<br />如果像上面定义一个服?那么p注意相关的定义了 Q?br />定义Disk-Health 模版  把硬盘检定义一个模版会比较好控Ӟ因ؓ盘的检不像其它服务一样需要准的及时性反正检得太多可能会造成压力Q一般一天检几ơ就够了?br />定义DB-56 L需要定?br />定义l?admins<br />以上q些只要安装qnagios 一般都知道的了 只是下模版的单独定义</p> <p style="text-indent: 2em">3)通过WEB控制?查看i果</p> <p style="text-indent: 2em">i果是失?报警CRITCTL 但是状态里面的信息都是I的  CRITCTL – /dev/sda status is</p> <p style="text-indent: 2em">6、调?/p> <p style="text-indent: 2em">从Nagios的远E监控来看是p|的,q且没有获取CQ务有用的信息?/p> <p style="text-indent: 2em">分析可以看到Q说明nrpe调用  q个变量获取到的是ؓI的信息<br />DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `<br />xI的 只有一个原因,肯定是没有执?如果执行?肯定会有字段 不管q个字段是否相符?br />但是手动执行是没有问题?br />l过对smartctl的查?原来q个命o是只允许rootq行调用的?br />现在需要解决的问题是:非root 用户 如何q程调用含有需要有root权限命o的脚本进行监控?br />Q不要小看这一句话Q每一个词都是一个需要攻克的地方Q?br />以下是调试步骤:<br />1Q非root用户<br />NRPE插g是用nagiosq个用户来执行的 所以要得到真实的情况需?br />AQ?su nagios   再执行脚?(q个Ҏ(gu)比较?<br />BQ?sudo -u nagios ./check_disk_health.sh<br />i果Q?/p> <p style="text-indent: 2em">sudo -u nagios ./check_disk_health.sh<br />CRITICAL – /dev/sda status is<br />跟远E的i果是一L(fng)?没有信息<br />2Q需要有root权限<br />需要root权限只有一个办法就是用sudo<br />DISK_HEALTH=`$SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `<br />改ؓDISK_HEALTH=`/usr/bin/sudo $SMARTCTL -H $CHECK_DISK | tail -1 | cut -d: -f2- `<br />Q最后发现这时加sudo q不是关?关键是很行脚本时用sudo Q?br />i果Qsudo -u nagios ./check_disk_health.sh<br />Password:<br />需要输入密?nbsp; sudo不用输入密码的方?br />修改sudo配置文g<br />执行 visudo<br />d<br />nagios ALL=(ALL) NOPASSWD:/usr/local/nagios/libexec/check_disk_health.sh<br />Q最好进行sudo的一些控Ӟ很多|方法就是nagios ALL=NOPASSWD:ALL<br />l果Q?br />su nagios<br />/usr/bin/sudo check_disk_health.sh<br />OK – /dev/sda status is OK<br />那么在nrpe.conf配置文g中需要添加sudo<br />command[check_sda_health]=/usr/bin/sudo /usr/local/nagios/libexec/check_disk_health.sh<br />最开始那个是错误?注意?q个是需要添?usr/bin/sudo 是说只要脚本中涉及到提升到root权限的命令那么就要用q个<br />3Q远E调?br />q程调用Ҏ(gu)Q?/check_nrpe -H 192.168.0.56 -c check_sda_health<br />同上如果x拟真实环境请切换到相应的执行用户 su nagios 再执行以上操?br />l果Q?nbsp;  NRPE: Unable to read output<br />q个错误的原因一定要明白Q之所以报q个错意思是说NRPE没有获取CQ何信息,也说是写脚本之前说的其中W二条规?br />问题Q在没有M信息的情况下怎么来获取NRPE执行的日志呢<br />是要确定问题在哪,l过一大番的查扄睛偶?dng)看C个有的方?br />修复nrpe.conf配置文g 在要查的命o后面d>>/tmp/output 2>&1 错误导出到文g中进行查?br />command[check_sda_health]=/usr/bin/sudo /usr/local/nagios/libexec/check_disk_health.sh -d /dev/sda >>/tmp/output 2>&1<br />重记nrpe服务<br />q程调用 l果当然q是NRPE: Unable to read output<br />查看/tmp/output<br />sudo: sorry, you must have a tty to run sudo<br />有错误就单了  原来q个是默认不允许sudo 在后端进?br />visudo<br />注释Defaults requiretty O(jin)K?br />l果通过WEB查看也正了?br />(注意Q注释后 仍然会是Unable 不过?tmp/output׃有正的i果Q所以有正确的結果后Q一定要L >>/tmp/outpt 2>&1 信息都导到文件中?nagiosq是得不CQ何消息?</p> <p style="text-indent: 2em">一个脚本执行成功后Q就是大扚w应用Q用生环境验证Q出现问题l调试?/p> 以上为所有的分析调试Ҏ(gu)。如果你看到最后一步了Q说明你很有耐心Q你也一定会成功的,至于写得好与坏、对与错请尽说Q这不会影响你的成功。呵c?/div>转自:<div>http://blog.chinaunix.net/uid-20592013-id-2436813.html</div><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/202981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2013-09-03 09:39 <a href="http://www.shnenglu.com/guojingjia2006/archive/2013/09/03/202981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Nagios的安装与配置http://www.shnenglu.com/guojingjia2006/archive/2013/09/02/202946.html果?/dc:creator>果?/author>Mon, 02 Sep 2013 06:26:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/09/02/202946.htmlhttp://www.shnenglu.com/guojingjia2006/comments/202946.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/09/02/202946.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/202946.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/202946.html阅读全文

]]>
linux l护http://www.shnenglu.com/guojingjia2006/archive/2013/02/28/198133.html果?/dc:creator>果?/author>Thu, 28 Feb 2013 03:15:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/02/28/198133.htmlhttp://www.shnenglu.com/guojingjia2006/comments/198133.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/02/28/198133.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/198133.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/198133.html

SSH配置Q?/p>

1、修改vi /etc/ssh/sshd_configQ根据模板将要修改的参数注释Lq修改参数|

Port 22 指定SSHq接的端口号Q安全方面不使用默认22端口

Protocol 2,1 允许SSH1和SSH2q接Q徏议设|成 Protocal 2

其他参数Ҏ(gu)自己的需要进行调整。配|方法详见: man ssh_config

2、修改hosts.deny 在最后面d一行:

sshd:All

3、修改hosts.allow 在最后面d一行:

sshd:All

如果Z安装可以限制讉K的IPQ设|如下:

sshd:192.168.0.101

sshd:192.168.0.102

上述配置表示只允?01?02的服务器q行SSHq接

4、启动SSH

/etc/init.d/sshd start


# chkconfig --list |grep sshd
sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
#chkconfig --level 2345 sshd on

iptables
# Generated by iptables-save v1.4.7 on Tue Feb  7 19:06:20 2012
*filter
:INPUT ACCEPT [100:10222]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [75:7016]
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT
# Completed on Tue Feb  7 19:06:20 2012


Q?Q屏蔽所有端?nbsp;
Q?Q把SSH的缺省端口设|ؓ56565 
Q?Q把56565?0?306端口打开 
Q?Q把3306端口讄为只允许本机讉K
 
如果没有安装iptables的话Q运行命令yum install iptables完成iptables安装
 
初始化安装以后,昄Z下信息:
 
[root@tp ~]# iptables -L -n
 
Chain INPUT (policy ACCEPT)
 
target prot opt source destination
 
Chain FORWARD (policy ACCEPT)
 
target prot opt source destination
 
Chain OUTPUT (policy ACCEPT)
 
target prot opt source destination
Q?Q屏蔽所有端?/div>
 
[root@tp ~]# iptables -F
[root@tp ~]# iptables -X
[root@tp ~]# iptables -P INPUT DROP
[root@tp ~]# iptables -P OUTPUT DROP
[root@tp ~]# iptables -P FORWARD DROP
当超ZIPTABLES里filter表里的两个链规则 (INPUT,FORWARD)?不在q两个规则里的数据包怎么处理?那就是DROP(攑ּ)Q有同学喜欢配置OUTPUT为accpetQ因为如?被入侵,Ҏ(gu)可以使用服务器做Z转,发vdQ也会生大量的数据包,所以这里配|ؓDROP
 
Q?Q把SSH的缺省端口设|ؓ56565
 
在修改ssh端口Ӟ应先把要修改的端口号56565加入白名?/div>
 
[root@tp ~]# iptables -A INPUT -p tcp --dport 56565 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 56565 -j ACCEPT
[root@tp ~]# /etc/rc.d/init.d/iptables save
[root@tp ~]# service iptables restart
再修改端口号
 
[root@linux ~]# vi /etc/ssh/sshd_config
?#Port 22"修改?Port 56565"
 
重启ssh服务
 
[root@linux ~]# /etc/init.d/sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
如果想看看sshd端口h否修Ҏ(gu)功的话,可以使用 netstat -an 命o查看一下或退出ssh使用新端口号登陆试?/div>
 
Q?Q把80端口打开
 
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
[root@tp ~]# /etc/rc.d/init.d/iptables save
[root@tp ~]# service iptables restart
Q?Q把3306端口讄为只允许本机讉K
 
[root@tp ~]#/sbin/iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
[root@tp ~]#/sbin/iptables -A OUTPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT

http://gzjhj88.blog.51cto.com/1049760/629563
http://www.redicecn.com/html/qita/20110331/243.html
http://wenku.baidu.com/view/94fadf1252d380eb62946d95.html

http://www.bugbeta.cn/?p=495
http://gzjhj88.blog.51cto.com/1049760/629563
http://gzjhj88.blog.51cto.com/1049760/315021


]]>[CyanogenMODUL教程]W二章:android 源码Ml构 (?http://www.shnenglu.com/guojingjia2006/archive/2013/02/20/197952.html果?/dc:creator>果?/author>Wed, 20 Feb 2013 06:16:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/02/20/197952.htmlhttp://www.shnenglu.com/guojingjia2006/comments/197952.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/02/20/197952.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/197952.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/197952.html
– Makefile (全局的Makefile文g)
– bionic (Bionic含义Z?q里面是一些基的C库源代码)
– bootloader (引导加蝲?
build目录中的内容不是目标所用的代码,而是~译和配|所需要的脚本和工?
– build (build目录中的内容不是目标所用的代码,而是~译和配|所需要的脚本和工?
– cts (Android兼容性测试套件标?
– libcore (核心库相?
Dalvik虚拟?针对嵌入式设备优化的Java
Java虚拟?
– dalvik ( Dalvik虚拟?针对嵌入式设备优化的Java虚拟?
– development (创徏应用E序所需要的模板和工?
qcom,
– device (与具体设备相关的一些编译脚本和?如htc,qcom,samsung{?
– external (Android使用的一些外部的开源框架和?
(应用E序的框架层,SDK
SDK的接口基本都是在q里实现?
– frameworks (应用E序的框架层,SDK的接口基本都是在q里实现?
– hardware (与硬件相关的?
Linux2.6
– kernel (Linux2.6的内核源代码)
– ndk (本地开发套?-C语言开发套?
--C
Android的各U应用程?
– packages (Android的各U应用程?
– prebuilt (Android在各U^C~译的预|脚?
– sdk (SDK及模拟器)
Android的底层的一些库)
– system (Android的底层的一些库)
`– vendor (厂商U有的代?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
packages/
|– apps (各种应用E序,如联pMh、浏览器{?
|– experimental (一些实验性的目,如错误报?
|– inputmethods (输入法相?
|– providers (各种数据源实?如联pMh数据、媒体库{信?
|– wallpapers (各种壁纸E序)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Android Framework功能介绍
android.app :提供高层的程序模型和基本的运行环境?/div>
android.content :包含对各U设备上的数据进行访问和发布?/div>
android.database :通过内容提供者浏览和操作数据库?/div>
android.graphics :底层囑Ş?包含d、点、矩形等,可以其直接l制到屏q上?/div>
android.location :定位和相x务的cR?/div>
android.media :提供一些类理多种音频、视频的媒体接口?/div>
android.net :提供帮助|络讉K的类,过通常?java.net.* 接口?/div>
android.os :提供了系l服务、消息传输和 IPC 机制?/div>
android.opengl :提供 OpenGL 的工兗?/div>
android.provider :提供讉K Android 内容提供者的cR?/div>
android.telephony :提供与拨打电(sh)话相关的 API 交互?/div>
android.view :提供基础的用L(fng)面接口框架?/div>
android.util :涉及工具性的Ҏ(gu),例如旉日期的操作?/div>
android.webkit :默认览器操作接口?/div>
android.widget :包含各种 UI 元素(大部分是可见?在应用程序的布局中?/div>
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
build/
|– buildspec.mk.default
|– cleanspec.mk
|– core (各种以mk为结文g,它门是编译所需要的Makefile)
|– envsetup.sh
|– libs
|– target (包含board和product两个目录,为目标所需要文?
|– tools (~译q程中主机所需要的工具,一些需要经q编译生?
其中,core中的Makefile是整个Android~译所需要的真正?span style="text-indent: 2em;">Makefile,它被层目录的Makefile引用?/span>
基本介绍到此Q文章参考网l中各种文章Q如果有侉|啥行为的Q请联系删除?/div>


]]> Linux Mint 13 的安装、配|及搭徏Android源码~译环境(?http://www.shnenglu.com/guojingjia2006/archive/2013/02/19/197940.html果?/dc:creator>果?/author>Tue, 19 Feb 2013 09:06:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/02/19/197940.htmlhttp://www.shnenglu.com/guojingjia2006/comments/197940.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/02/19/197940.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/197940.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/197940.html

用过ubuntuQ现在想换换LinuxMint试试看。下面是我安装配|LinuxMint13的过E?/p>

1、安?/h1>

安装LinuxMint13Ӟ我尝试了好多U方法,都失败了。最后选用了硬盘安装。硬盘安装Linuxmint和安装ubuntu一栗?/p>

1.1、准备工?/h2>

1、从linux mint的官方网?a >http://www.linuxmint.com/ 下蝲linux mint 13?/p>

2、下载grub4dosQ?a >http://www.linuxidc.com/Linux/2009-01/18027.htm ?/p>

1.2、安装步?/h2>

1、将下蝲的linuxmint-13-mate-dvd-64bit.iso 拯到系l的C盘根目录?/p>

2、从linuxmint-13-mate-dvd-64bit.iso?span style="color: #ff0000;">casper文g夹中提取?span style="color: #ff0000;">vmlinuz、initrd.lz文g。也攑ֈC盘根目录下?/p>

3、解压grub4dos压羃包,会得C个名为grub4dos-0.4.4的文件夹Q将以下文g拯到C盘(其中前两个文件是必需的,后两个文件网上有些资料说不需要,Z保险赯q是放上吧,反正也没什么坏处~Q:

  grldr menu.lst  grldr.mbr  grub.exe

4、修改menu.lst文gQ在文g末尾d以下内容

title Install Linux Mint

root (hd0,0)

kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/linuxmint-13-mate-dvd-64bit.iso locale=zh_CN.UTF-8

initrd (hd0,0)/initrd.lz

 其中Qtitle后面的内定w便写是Qkernel后面的那个突出显C的是Linux Mint的镜像文Ӟ需要与C盘中的文件名对应?/p>

5、修改C盘根目录下隐藏的boot.iniQ打开文g后,在文件最后添加如下内?/p>

  c:\grldr=”Linux Mint Install”

以上工作完成后,重启pȝ卛_开始XP盘安装Linux Mint的过E了Q?/p>

 

不过我安装花了好长的时候,旉主要是浪费在pȝ分区上了Q每个分区的操作都要{上好久啊,蛋疼啊!

注意Q在重启后进入Linux Mint界面后就先卸载isodevices

  umount -l /isodevices

q步很重要,未执行这步,分区无法成功?br />

 

2、配|?/h1>

安装完成之后可以q行配置了,׃安装是没有链接到|络Q也没有下载更新包、语a包。现在首要的是q行安装语言包?/p>

MINT 13默认的更新源是真心慢啊,所以第一步要先处理更新源的问题?/p>

2.1、更新源

LinuxMint 的镜像徏立在中国U技大学的镜像站上了Q中国科技大学 LinuxMint:http://mirrors.ustc.edu.cn/linuxmint/ q是唯一也是主镜像?/p>

下面p一下具体步?/p>

1、登?Linux Mint,打开l端?/p>

2、键入命?sudo nano /etc/apt/sources.listQ徏议先备䆾下?/p>

3、打开文本后应该是q个样子
deb http://packages.linuxmint.com/ maya main upstream import
deb http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ precise-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ precise partner
deb http://packages.medibuntu.org/ precise free non-free
可以看出没有中国服务器的影子

4、下面我们就来添加中国的?br /> d以下文字
deb http://mirrors.ustc.edu.cn/linuxmint/ maya main upstream import universe multiverse
deb http://mirrors.163.com/ubuntu/ precise main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ precise-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ precise-updates main restricted universe multiverse
q且原来的源全部注释掉(是掉,不要用了)
deb http://packages.linuxmint.com/ maya main upstream import
deb http://archive.ubuntu.com/ubuntu/ precise main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ precise-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ precise-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu/ precise partner
deb http://packages.medibuntu.org/ precise free non-free
注意是在最前面多加了个#号即?br /> ?q里?Linux Mint 13 maya Z,其它举一反三卛_。其实就是改个链接而已。后
面的文字保持原样卛_?/p>

5、更?APT
在终端输入命?sudo apt-get update
{待执行完成卛_。这时你会发?Linux Mint 原来如此ȝ!

 

2.2、安装输入法

在这里我安装的是FCITX

直接从Y件管理器中搜索fcitxQ然后安装?/p>

安装完成后到 控制中心 ---》Language Support 的键盘输入方式系l中选择fictx

重启pȝ卛_使用?/p>

 

 2.3、安装QQ

1、到以下|址下蝲deb安装包,http://www.longene.org/download/qq2011-for-wine_20120220.debQ已l打包好的deb包,大小?50M左右Q?/p>

  最新发?6-1 h新的 Q?/span>http://www.longene.org/download/WineQQ2012-20120531-Longene.deb 有几个bug 已经修补?Q?/span>

2、打开l端输入到目录中q行命o安装Q?/p>

  sudo dpkg -i *.deb

3?4位系l还需要运行以下命令:

  sudo apt-get install ia32-libs

4、卸载的话运行以下命令:

  dpkg -r qq-for-wine

 

2.4、安装Google Chrome

1、chrome

?a >https://www.google.com/intl/en/chrome/browser/index.html 下蝲最新的安装包。也可以通过下面的命令安?br />

32位系l:

wget -O google-chrome_i386.deb http://goo.gl/itppy

sudo dpkg -i google-chrome_i386.deb

64位系l:

wget -O google-chrome_amd64.deb http://goo.gl/iXDWk

sudo dpkg -i google-chrome*.deb

2、chromium

sudo apt-get install chromium-browser

chromium flash 插g失效的修复方法:

  查找flash插g

    $ sudo locate libflashplayer.so

    /usr/lib/adobe-flashplugin/libflashplayer.so

  拯flash插g到chromium-browser插g目录
    $ sudo cp /usr/lib/adobe-flashplugin/libflashplayer.so /usr/lib/chromium-browser/plugins

 

2.5、安装无U网?/span>

我的|卡是BCM4312Q在|上找了好久Q试q两三种Ҏ(gu)都不行。最后找C下方法解冻I

1?span>先到Broadcom的官方网站去仔细的看看说明具体链接地址如下Q?br />http://www.broadcom.com/support/802.11/linux_sta.php

可以先查看自q|卡的型P下蝲对应的驱动?span>在终端下输入Q?#8220;lspci | grep Network" 认|卡型号?/span>

2?span>解压~?br />tar -xzf hybrid-portsrc-x86_32-v5.60.48.36.tar.gz

3、编?br />make

~译旉C面的错误Q?/span>

/home/lgq/hybrid_wl/src/wl/sys/wl_linux.c:388:2: 错误Q?初始D定项里有未知的字D?#8216;ndo_set_multicast_list’
/home/lgq/hybrid_wl/src/wl/sys/wl_linux.c:388:2: 警告Q?从不兼容的指针类型初始化 [默认启用]
/home/lgq/hybrid_wl/src/wl/sys/wl_linux.c:388:2: 警告Q?(?#8216;wl_netdev_ops.ndo_validate_addr’的初始化附近) [默认启用]

在google后发? ndo_set_multicast_list ?span style="color: #ff0000;">ndo_set_rx_mode替换(在以下网站提?a >http://www.mindwerks.net/2011/11/wireless-bcm4312-3-2-kernel/

再次~译通过?/span>

4、sudo make install

5、sudo depmod

6、sudo modprobe wl

Give Ubuntu a few seconds after loading the “wl” kernel module, then eventually the Network Manager will start looking for wireless networks.

 

参考链接:http://blog.csdn.net/cs090506/article/details/7300526

 

2.6、安装词典星际译?/span>

通过软g理器安装星际译王stardict?/p>

词典下蝲路径Q?a >http://abloz.com/huzheng/stardict-dic/

 

2.7?/span>~译安装最新的alsa驱动

刚安装好的linux mintQ插上x后,W记本的内置音箱仍然q有声音?/p>

1、查看自己声卡的codec型号?/p>

l端输入alsamixerQ查看显C的chip倹{或?span>cat /proc/asound/card0/codec#0Q查看显C结果的首行?/span>

2、到官方|站下蝲相应的驱动来安装?/p>

 

3、搭建Android源码开发环?/span>

在本节搭建的是Android4.0的源码开发环境?/span>

Linux Mint 13 中已l安装了 GNU Make 3.81、Python 2.7.3、Git 1.7.9.5?/span>

所以还需要安装jdk6?/span>

3.1、安装jdk6

Linux Mint 13 中自带有OpenJDKQ但q个不是我想要的Q我们要的是sun-java6?/span>

1、在安装sun的jdk前,先删除OpenJDKQ打开新立得,搜烦OpenJDKQ彻底删除所有的包?/span>

2、在sun的官|上http://www.oracle.com/technetwork/java/javase/downloads/jdk6-downloads-1637591.html 下蝲最新的安装文gQ?span>如:jdk-6u34-linux-x64.binQ?/span>

增加执行权限Qsudo chmod u+x jdk-6u34-linux-x64.bin

安装文件拷贝到 /usr/lib/java/ 目录?/span>

执行安装命o  ./jdk-6u34-linux-x64.bin

 成功安装完JDK后,接下来我们将要进行JQO的配|,使用命 $ sudo gedit /etc/environment 对environment文gq行修改q添加以下代码:

     PATHQ?/usr/lib/java/jdk1.6.0_34/bin"  

    CLASSPATH="/usr/lib/java/jdk1.6.0_34/lib"

    JAVA_HOME="/usr/lib/java/jdk1.6.0_34"   

 若PATH已存在,则用冒号作间隔,jdk的bin目录地址加上Q这样java的环境变量将配置成功了,但这样默认用的JDK可能q不是我? 刚才安装的,因ؓubuntu可能q会有默认的jdkQ如openjdkQ所以,Z佉K认用的是我们安装的jdkQ还需执行如下命o:

     $ sudo update-alternatives --install /usr/bin/java java /usr/lib/java/jdk1.6.0_34/bin/java 300

    $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/java/jdk1.6.0_34/bin/javac 300 

    $ sudo update-alternatives --config java    

 成功执行命o后,我们安装的JDK是pȝ默认的了Q执行命?nbsp;$ java -version  可以成功看?JDK的相关信息了如:

     java version "1.6.0_34"

    Java(TM) SE Runtime Environment (build 1.6.0_34-b04)
    Java HotSpot(TM) 64-Bit Server VM (build 20.9-b04, mixed mode)  

 3.2、安装必需的Y件包

 安装~译Android需要的工具包,q个步骤是关键,必须安装Q否则编译会报莫名其妙的错误Q!Q!Q!Q!Q!Q!Q!Q!

sudo apt-get install git-core gnupg flex bison gperf build-essential   zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs   x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z1-dev   libgl1-mesa-dev gcc-multilib g++-multilib mingw32 tofrodos python-markdown   libxml2-utils  xsltproc 

3.3、配|USB

lgq-laptop bin # lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 04f2:b008 Chicony Electronics Co., Ltd USB 2.0 Camera
Bus 006 Device 002: ID 1ea7:000b  
Bus 002 Device 004: ID 05c6:9025 Qualcomm, Inc.

$sudo vim /etc/udev/rules.d/70-android.rules

增加下面内容

SUBSYSTEM=="usb", ATTRS{idVendor}=="05c6", ATTRS{idProduct}=="9025",MODE="0666"

q行命oQ重启udevQ?/p>

$sudo chmod a+rx /etc/udev/rules.d/70-android.rules
$sudo service udev restart

 

3.4、安装svn

1、安装subversion

apt-get install subversion

2、安装rabbitvcs

sudo add-apt-repository ppa:rabbitvcs/ppa

sudo apt-get update

sudo apt-get install rabbitvcs-nautilus3

nautilus -q

nautilus

rabbitvcs的界面比较习(fn)惯,但是Q很卡?/p>

3、rapidsvn

sudo apt-get install rapidsvn

4、esvn

 

3.5、设|ccache

①安装ccache
官网下蝲或apt安装  sudo apt-get install ccache
 
②$ which ccache
查看安装路径, /usr/bin/ccache
 
③$ mkdir ~/.bin
④ $ cd ~/.bin/
   $ ln -s /usr/bin/ccache gcc
   $ ln -s /usr/bin/ccache g++
   $ ln -s /usr/bin/ccache arm-linux-gcc
   $ ln -s /usr/bin/ccache arm-linux-g++
 
⑤PATH讄Q将~/.bin/攑֜ arm-linux-gcc{的PATH的前面?/div>
原:PATH=/usr/local/arm-linux_pre4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
玎ͼPATH=/home/<user>/.bin:/usr/local/arm-linux_pre4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        gedit ~/.bashrc d export PATH="/home/<user>/.bin:$PAHT" Q然后重启即?/div>
 
⑥$ which arm-linux-gcc
/home/<user>/.bin/arm-linux-gcc 认
 
⑦$ ccache -M 30G

 

 3.6、安装最新的eclipse

 eclipse搭徏Ҏ(gu)参考:http://www.cnblogs.com/tnxk/archive/2012/07/09/2583800.html

eclipse的更新速度相当慢,q里攉一个加快更新的Ҏ(gu)?/p>

解决办法只能是更换到Mirror站点Q具体步骤:

1.找个国内的站?北方交通大学的不错http://mirror.bjtu.edu.cn/eclipse

2.更换Eclipse更新服务器下载站点Windows -> Preferences -> Install/Update -> Available Software Sites

3.扑ֈ所?The Eclipse 开始的行,注意?strong>所有的,因ؓ不同版本的Eclipse官方目比如 Web Tools ProjectQ也都需要更改ؓ镜像站点Q否则将D只有部分插g的站点得到更斎ͼ只能部分解决速度问题?/p>

4.点击“Edit”, ~辑Location部分Q替换http://download.eclipse.org?a >http://mirror.bjtu.edu.cn/eclipse

 

参考链接:http://blog.csdn.net/chenxihua/article/details/6423168

 

4、问题及解决Ҏ(gu)

4.1、重启后出现 waiting for network configuration 问题

如今?ubuntu 12.04 环境下接着拨号Ӟ如果使用 sudo pppoeconf 命o配置拨号Q重启电(sh)脑后׃先显C?waiting for network configurationQ然后是 waiting up to 60 more seconds for network configurationQ?/span>最后显C?span style="color: #ed1c24;">booting system without full network configuration.q且q入桌面后网l连接状态图标也不见了?/div>
问题原因Q?/strong>

使用 sudo pppoeconf 命oӞ会有信息写入/etc/network/interfaces 文g内,直接D出现了上面的问题?/span>

问题解决Q?/strong>

sudo gedit /etc/network/interfaces  打开文g后,其中除

auto lo

iface lo inet loopback
外其他内容全部删除后Q重启系l就可以了?/span>



]]>linux 信号详解http://www.shnenglu.com/guojingjia2006/archive/2013/01/13/197232.html果?/dc:creator>果?/author>Sun, 13 Jan 2013 04:31:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/01/13/197232.htmlhttp://www.shnenglu.com/guojingjia2006/comments/197232.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/01/13/197232.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/197232.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/197232.html阅读全文

]]>
写出健壮?Bash 脚本http://www.shnenglu.com/guojingjia2006/archive/2013/01/09/197146.html果?/dc:creator>果?/author>Wed, 09 Jan 2013 04:11:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/01/09/197146.htmlhttp://www.shnenglu.com/guojingjia2006/comments/197146.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/01/09/197146.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/197146.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/197146.html

许多人用shell脚本完成一些简单Q务,而且变成了他们生命的一部分。不q的是,shell脚本在运行异常时会受到非常大的媄响。在写脚本时这c问题最化是十分必要的。本文中我将介绍一些让bash脚本变得健壮的技术?/p>

使用set -u

你因为没有对变量初始化而脚本崩溃q多次Q对于我来说Q很多次?/p>

chroot=$1 ... rm -rf $chroot/usr/share/doc

如果上面的代码你没有l参数就q行Q你不会仅仅删除掉chroot中的文档Q而是系l的所有文档都删除。那你应该做些什么呢Q好在bash提供?em>set -uQ当你用未初始化的变量Ӟ让bash自动退出。你也可以用可L更Z点的set -o nounset?/p>

david% bash /tmp/shrink-chroot.sh

$chroot=

david% bash -u /tmp/shrink-chroot.sh

/tmp/shrink-chroot.sh: line 3: $1: unbound variable

david%

使用set -e

你写的每一个脚本的开始都应该包含set -e。这告诉bash一但有M一个语句返回非真的|则退出bash。?e的好处是避免错误滚雪球般的变成严重错误,能尽早的捕获错误。更加可ȝ版本Q?em>set -o errexit

使用-e把你从检查错误中解放出来。如果你忘记了检查,bash会替你做qg事。不q你也没有办法?em>$?来获取命令执行状态了Q因为bash无法获得M?的返回倹{你可以使用另一U结构:

command

if [ "$?"-ne 0]; then echo "command failed"; exit 1; fi

可以替换成:

command || { echo "command failed"; exit 1; }

或者用:

if ! command; then echo "command failed"; exit 1; fi

如果你必M用返回非0值的命oQ或者你对返回值ƈ不感兴趣呢?你可以?command || true Q或者你有一D很长的代码Q你可以暂时关闭错误查功能,不过我徏议你谨慎使用?/p>

set +e

command1

command2

set -e

相关文档指出Qbash默认q回道中最后一个命令的|也许是你不想要的那个。比如执?false | true 会被认为命令成功执行。如果你惌q样的命令被认ؓ是执行失败,可以使用 set -o pipefail

E序防M - 考虑意料之外的事

你的脚本也许会被攑ֈ“意外”的̎户下q行Q像~少文g或者目录没有被创徏{情c你可以做一些预防这些错误事情。比如,当你创徏一个目录后Q如果父目录不存在,mkdir 命o会返回一个错误。如果你创徏目录时给mkdir命o加上-p选项Q它会在创徏需要的目录前,把需要的父目录创建出来。另一个例子是 rm 命o。如果你要删除一个不存在的文Ӟ它会“吐槽”q且你的脚本会停止工作。(因ؓ你用了-e选项Q对吧?Q你可以使用-f选项来解册个问题,在文件不存在的时候让脚本l箋工作?nbsp;

准备好处理文件名中的I格

有些Z在文件名或者命令行参数中用空|你需要在~写脚本时时刻记得这件事。你需要时刻记得用引号包围变量?/p>

if [ $filename = "foo" ];

?em>$filename变量包含I格时就会挂掉。可以这栯冻I

if [ "$filename" = "foo" ];

使用$@变量Ӟ你也需要用引P因ؓI格隔开的两个参C被解释成两个独立的部分?/p>

david% foo() { for i in $@; do echo $i; done }; foo bar "baz quux"

bar

baz

quux

david% foo() { for i in "$@"; do echo $i; done }; foo bar "baz quux"

bar

baz quux

我没有想CQ何不能?em>"$@"的时候,所以当你有疑问的时候,使用引号没有错误?/p>

如果你同时用find和xargsQ你应该使用 -print0 来让字符分割文g名,而不是换行符分割?/p>

 david% touch "foo bar"

david% find | xargs ls

ls: ./foo: No such file or directory

ls: bar: No such file or directory

david% find -print0 | xargs -0 ls

./foo bar

讄的陷?/h1>

当你~写的脚本挂掉后Q文件系l处于未知状态。比如锁文g状态、(f)时文件状态或者更C一个文件后在更C一个文件前挂掉。如果你能解册些问题, 无论? 删除锁文Ӟ又或者在脚本遇到问题时回滚到已知状态,你都是非常棒的。幸q的是,bash提供了一U方法,当bash接收C个UNIX信号Ӟq行一? 命o或者一个函数。可以?strong>trap命o?/p>

trap command signal [signal ...]

你可以链接多个信P列表可以使用kill -l获得Q,但是Z清理D局Q我们只使用其中的三个:INTQ?em>TERM?em>EXIT。你可以使用-as来让traps恢复到初始状态?/p>

信号描述

 

INT

Interrupt - 当有Z用Ctrl-Cl止脚本时被触发

TERM

Terminate - 当有Z用kill杀死脚本进E时被触?/p>

EXIT

Exit - q是一个伪信号Q当脚本正常退出或者set -e后因为出错而退出时被触?/p>

 

 

 

 

当你使用锁文件时Q可以这样写Q?/p>

if [ ! -e $lockfile ]; then

touch $lockfile

critical-section

rm $lockfile

else

echo "critical-section is already running"

fi

当最重要的部?critical-section)正在q行Ӟ如果杀M脚本q程Q会发生什么呢Q锁文g会被扔在那,而且你的脚本在它被删除以前再也不会运行了。解x法:

if [ ! -e $lockfile ]; then

trap " rm -f $lockfile; exit" INT TERM EXIT

touch $lockfile

critical-section

rm $lockfile

trap - INT TERM EXIT

else

echo "critical-section is already running"

fi

现在当你杀死进E时Q锁文g一同被删除。注意在trap命o中明地退Z脚本Q否则脚本会l箋执行trap后面的命令?/p>

竟态条?(wikipedia)

在上面锁文g的例子中Q有一个竟态条件是不得不指出的Q它存在于判断锁文g和创建锁文g之间。一个可行的解决Ҏ(gu)是用IO重定向和bash的noclobber(wikipedia)模式Q重定向C存在的文件。我们可以这么做Q?/p>

if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;

then

trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT

critical-section

rm -f "$lockfile"

trap - INT TERM EXIT

else

echo "Failed to acquire lockfile: $lockfile"

echo "held by $(cat $lockfile)"

fi

更复杂一点儿的问题是你要更新一大堆文gQ当它们更新q程中出现问题时Q你是否能让脚本挂得更加优雅一些。你想确认那些正更CQ哪些根本没有变化。比如你需要一个添加用L(fng)脚本?/p>

add_to_passwd $user

cp -a /etc/skel /home/$user

chown $user /home/$user -R

当磁盘空间不x者进E中途被杀死,q个脚本׃出现问题。在q种情况下,你也许希望用戯̎户不存在Q而且他的文g也应该被删除?/p>

rollback() {

del_from_passwd $user

if [ -e /home/$user ]; then

rm -rf /home/$user

fi

exit

}

 

trap rollback INT TERM EXIT

add_to_passwd $user

 

cp -a /etc/skel /home/$user

chown $user /home/$user -R

trap - INT TERM EXIT

在脚本最后需要用trap关闭rollback调用Q否则当脚本正常退出的时候rollback会被调用,那么脚本{于什么都没做?/p>

保持原子?/h1>

又是你需要一ơ更新目录中的一大堆文gQ比如你需要将URL重写到另一个网站的域名。你也许会写Q?/p>

for file in $(find /var/www -type f -name "*.html"); do

perl -pi -e 's/www.example.net/www.example.com/' $file

done

如果修改C半是脚本出现问题Q一部分使用www.example.comQ而另一部分使用www.example.net。你可以使用备䆾和trap解决Q但在升U过E中你的|站URL是不一致的?/p>

解决Ҏ(gu)是将q个改变做成一个原子操作。先Ҏ(gu)据做一个副本,在副本中更新URLQ再用副本替换掉现在工作的版本。你需要确认副本和工作版本目录在同一个磁盘分ZQ这样你可以利用Linuxpȝ的优势,它移动目录仅仅是更新目录指向的inode节点?/p>

cp -a /var/www /var/www-tmp

for file in $(find /var/www-tmp -type -f -name "*.html"); do

perl -pi -e 's/www.example.net/www.example.com/' $file

done

mv /var/www /var/www-old

mv /var/www-tmp /var/www

q意味着如果更新q程出问题,U上pȝ不会受媄响。线上系l受影响的时间降低ؓ两次mv操作的时_q个旉非常短,因ؓ文gpȝ仅更新inode而不用真正的复制所有的数据?/p>

q种技术的~点是你需要两倍的盘I间Q而且那些长时间打开文g的进E需要比较长的时间才能升U到新文件版本,更新完成后重新启动这些进E。对 ? apache服务器来说这不是问题Q因为它每次都重新打开文g。你可以使用lsof命o查看当前正打开的文件。优势是你有了一个先前的备䆾Q当你需要还? Ӟ它就z上用场了?/p>

转自: http://www.linuxidc.com/Linux/2012-03/56614.htm

]]>Linux上文件的Ҏ(gu)权限SUID,SGID,SBIT详解http://www.shnenglu.com/guojingjia2006/archive/2013/01/07/197084.html果?/dc:creator>果?/author>Mon, 07 Jan 2013 11:51:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/01/07/197084.htmlhttp://www.shnenglu.com/guojingjia2006/comments/197084.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/01/07/197084.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/197084.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/197084.html

文g的特D权限SGID, SUID..SBIT

        大家都知道文件和目录的权限最常见的有三个.可读(r)..可写(w)..可执?x)..它们的别分别是4..2..1..我们有时也会发现有些文g 所属主的权限上带有一个s的标志位.目录的所属组上也带有s标志?很多Z理解q是Z?...下面我们举例来看一?..
         #ls -l  /usr/bin/passwd
         -rwsr-xr-x 1 root root 19876 Jul 17  2006 /usr/bin/passwd
         q个文g的所属主的x标志位上变成了s,q时UCؓset uid ..写就是suid..其实q个文g属性也没有Ҏ(gu)的含?.当这个s标志位出现在一些脚本上?它就有意义了...比方说我我们有一个脚本名为sum.sh.q个脚本的权限如?
        -rwsrwxr-x 1 root root   117 Feb  6 20:46 sum.sh
         q个脚本的所属主和所属组为root.我们当然可以以root的用L(fng)w䆾执行?.我们q可以看见它的所属主的标志位上有个s..其他人有d和执行的 权限.假如我们现在有个普通用户名为redhat..现在切换到redhat..执行此脚?.表面上我们看是执行成功了..其实我们是借助root用户 的n份来执行?.而不是redhat..q就是suid的特?...
        下满我们来说下SGID,看了上面的SUID后很Ҏ(gu)q道所谓SGID是标志s加到gid的x标志位上..UCؓset gid.Usgid..在这一下SUID我们一般用在文件上.特别是一些脚本上...SGID用在目录上最?..比方说我以rootw䆾创徏一?目录a.l他加上sgid权限
        #mkdir a
        #chmod   2757  a
        #ls  -l
          drwxr-srwx 2 root root  4096 Feb  6 21:09  a
        因ؓ我们la目录其他人所h的权限是可读,可写,可执?..当我们以redhat用户的n份切换到另外一个终?.q入a目录?我们在此目录中创Z个目录b和一个文件c
        [redhat@station18 a]$ mkdir b
        [redhat@station18 a]$ touch c
        [redhat@station18 a]$ ls -l
        drwxrwsr-x 2 redhat root 4096 Feb  6 21:20 b
        -rw-rw-r-- 1    redhat root    0 Feb  6 21:20 c
        我们可以看到目录b和文件c的所属组都ؓroot......当你一个a目录|ؓsgid权限时?如果其他人有d,执行和写入的权限?别h在此?录中创徏的Q何文件和目录的所属组都ؓa目录的所属组..但所属主q是自己...q个会经常的用到....有一点大家得注意...是M人在a目录中创 建的东西.别h都可以删?..q就是我们下面要讲到的SBIT....
        SBIT 全称Sticky Bit.但是它只对目录有?Ҏ(gu)件却是无效的,它的作用是防止别h删除Ҏ(gu)的资?..我们举例来说?..
      1..我用root用户d创徏一个目录名为test
       [root@station18 ~]# mkdir test
       [root@station18 ~]# chmod o+w test/
       [root@station18 ~]# ls -l
       drwxr-xrwx 2 root root  4096 Feb  6 21:30 test
      2..我们切换到redhat用户d一个终?创徏一个目录a..
       [redhat@station18 test]$ mkdir a
      3.我们在切换到xiaoming用户d一个终?创徏一个目录b...
       [xiaoming@station18 test]$ mkdir b
       [xiaoming@station18 test]$ ls  -l
       drwxrwxr-x 2 redhat   redhat   4096 Feb  6 21:32 a
       drwxrwxr-x 2 xiaoming xiaoming 4096 Feb  6 21:31 b
       我们可以以Q何用L(fng)w䆾q入test目录发现可以删除a和b目录...q样׃ؕ了套...别h的目录你岂能随便删的...q时我们需要将test目录加上SBIT权限?..
       [root@station18 ~]# chmod  1757  test/
       [root@station18 ~]# ls -l
       drwxr-xrwt 4 root root  4096 Feb  6 21:42 test
       我们在用别的用户dq入test目录他就删不掉别人的资料?pȝ会提Crm: cannot remove directory `a': Operation not permitted..意思是你权限不?...呵呵...q样别h没辙了....我测试过成功?..
       下面我来说一下关于SUID SGID  SBIT权限的设?..
        SUID?
        SGID?
        SBIT?
        我在上面讑֮一些文件或目录的权限你可能看不?,下面我来详细讲解...
        假如我们有个文g叫file.有一个目录叫test..file它的权限?44..test的权限是755
        1..如果我们xfile加上suid权限的话执行此命?br />         #chmod  4755  file
        2..如果我们xtest目录加上sgid的话执行此命?br />         #chmod  2755   test/
        3.如果我们xtest目录加上sbit权限的话执行此命?br />         #chmod  1755   test/
        4..大家可以看得出来s与t都是取代x权限?..
        5..如果不想让test具备SUID和SGID权限执行此命?br />         #chmod   7666  file
        #ls  -l
         -rwSrwSrwT 1 root root     0 Feb  6 21:49 file
        q里的S和T׃表空..不具备其他h执行的权?..7666也就是说用户,l?以及其他的h都不具备x的权?除了root.MZ改不了此文g...
        q儿我用数字代替l文件加一?权限....我们也可以用别的Ҏ(gu).比方?.我们lfile文g加上suid权限
        #chmod  u=rwxs,o=rx   file
        ltest目录加上SGID权限和other可读取写入执行权?br />         #chmod  g+s,o=wrx    test/
        ltest目录加上SBIT权限和other可读取写入执行权?br />         #chmod   o=rwxt   test/
 

原文Q?a rel="nofollow" target="_blank">http://blog.chinaunix.net/u3/111913/showart_2182986.html



]]>
centos 上安装gearmanhttp://www.shnenglu.com/guojingjia2006/archive/2013/01/07/197076.html果?/dc:creator>果?/author>Mon, 07 Jan 2013 08:39:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/01/07/197076.htmlhttp://www.shnenglu.com/guojingjia2006/comments/197076.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/01/07/197076.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/197076.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/197076.html
官网Qhttp://gearman.org/

跨多U环境部|?Gearman
http://www.ibm.com/developerworks/cn/opensource/os-gearman/index.html
利用开源的Gearman框架构徏分布式图片处理^収ͼ张宴
http://blog.s135.com/dips/
监控Q?br /> https://github.com/yugene/Gearman-Monitor

一、简?br /> Gearman是一个分发Q务的E序架构Q由三部分组成:
Gearman clientQ提供gearman client APIl应用程序调用。API可以使用C,PHP,PERL,MYSQL UDF{待呢个语言Q它是请求的发v者?br /> Gearman job serverQ将客户端的h分发到各个gearman worker的调度者,相当于中央控制器Q但它不处理具体业务逻辑?br /> Gearman workerQ提供gearman worker APIl应用程序调用,具体负责客户端的hQƈ处理结果返回给客户端?br /> Mogilefs的分布式文gpȝ的核心就是用gearman实现的?br /> q个软g的应用场景很多,比如视频|站的视频处理,分布式日志处理,?sh)子邮g处理Q文件同步处理,囄处理{等Q只要是可以攑ּQ不影响体验和响应的?景,需要ƈ行进行大量计和处理的程序都是可以的。Yahoo?0或更多的服务器上使用gearman每天处理600万个作业。新闻聚合器digg构徏 了一个相同规模的gearman|络Q每天可处理400000个作业?br /> Gearman不但可以做ؓd分发Q还可以做ؓ应用斚w的负载均衡。可以让worker攑֜不同的一堆服务器上,也可以启动放在同一个cpu的多个核 上。比如,应用视频转换E序Q不希望web服务器来处理视频格式转换Q这Ӟ可以在这一堆服务器上进行Q务分发,在上面加载worker处理视频格式Q对 外的web服务器就不会被视频{换过E媄响。而且扩展方便Q加一台服务器CQ务调度中心,注册成worker卛_Q这时job server会在h到来的时候,请求发送给I闲的worker。还可以q行多个job serverQ组成ha架构Q如果一个job server当掉了,client和worker会自动迁Ud另一台job server上?br />
二、安?br /> [Job Server (gearmand) -- 172.16.1.183]
1.首先安装libdrizzle
    #yum install libdrizzle libdrizzle-devel
2.安装gearmanQ两U方?.yum2.源码包)。(c版的serverQ?br />     1Qyum安装
    #rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm
    #yum install -y gearmand
    2Q源码包安装
    #cd /opt/build/
    #wget https://launchpad.net/gearmand/trunk/0.34/+download/gearmand-0.34.tar.gz
    #tar zxf gearmand-0.34.tar.gz
    #cd gearmand-0.34
    #./configure
    #make && make install
3.启动gearman服务
    1Qyum安装方式
    #/etc/init.d/gearmand start
    2Q源码包安装方式
    #/opt/build/gearmand-0.34/sbin/gearmand -d

    #gearmand -vvv -u root
    INFO Starting up
    INFO Listening on :::4730 (6)
    INFO Creating wakeup pipe
    INFO Creating IO thread wakeup pipe
    INFO Adding event for listening socket (6)
    INFO Adding event for wakeup pipe
    INFO Entering main event loop

worker&&client以php方式
[worker --  172.16.1.180]
安装gearmand如上所C?br />
安装 Gearman PHP extension
1.下蝲gearman-0.8.0.tgzq安?br />     #cd /opt/build/
    #wget http://pecl.php.net/get/gearman-0.8.0.tgz
    # yum install -y libgearman-devel.x86_64
    # yum install -y re2c
    #tar zxf gearman-0.8.0.tgz
    #cd gearman-0.8.0.tgz
    #phpize
    # ./configure
    # make && make install
2.~辑php.ini配置文g加蝲相应模块q之生?br />     # vim /etc/php.ini
    extension = "gearman.so"
3.查看gearman.so模块是否加蝲
    # php --info | grep gearman
    gearman
    gearman support => enabled
    libgearman version => 0.14
    PWD => /opt/build/gearman-0.8.0
    _SERVER["PWD"] => /opt/build/gearman-0.8.0
    # php -m | grep gearman
    gearman
4.启动job
gearmand -d
如果当前用户?root 的话Q则需要这h作:
gearmand -d -u root
~省会?4730 端口Q下面会用到?br />     注意Q如果找不到 gearmand 命o的\径,别忘了用 whereis gearmand 认

[client -- 172.16.1.181]
    安装如work同。如上所C?br />
三、测试:
[Job Server (gearmand) -- 172.16.1.183]
启动gearmand

以命令行工具来验证gearman的功?br /> 启动 WorkerQgearman -h 172.16.1.183 -w -f wc -- wc -l &
q行ClientQgearman -h 172.16.1.183 -f wc < /etc/passwd
42
可以看到验证成功?br />
以php验证gearman的功?br /> ~写 Worker
worker.php 文g内容如下Q?br /> <?php
$worker= new GearmanWorker();
$worker->addServer('172.16.1.183', 4730);
$worker->addFunction('reverse', 'my_reverse_function');
while ($worker->work());
function my_reverse_function($job) {
return strrev($job->workload());
}
?>
讄后台q行 work
php worker.php &
~写 Client
client.php 文g内容如下Q?br /> <?php
$client= new GearmanClient();
$client->addServer('172.16.1.183', 4730);
echo $client->do('reverse', 'Hello World!'), "\n";
?>
q行 client
php client.php
输出Q?dlroW olleH

Q:

I've been trying to get Gearman compiled on CentOS 5.8 all afternoon. Unfortunately I am restricted to this version of CentOS by my CTO and how he has our entire network configured. I think it's simply because we don't have enough resources to upgrade our network... But anyways, the problem at hand.

I have searched through Server Fault, Stack Overflow, Google, and am unable to locate a working solution. What I have below is stuff I have pieced together from my searching.

Searches have told said to install the following via yum:

yum -y install --enablerepo=remi boost141-devel libgearman-devel e2fsprogs-devel e2fsprogs gcc44 gcc-c++ 

To get the Boost headers working correctly I did this:

cp -f /usr/lib/boost141/* /usr/lib/ cp -f /usr/lib64/boost141/* /usr/lib64/ rm -f /usr/include/boost ln -s /usr/include/boost141/boost /usr/include/boost 

With all of the dependancies installed and paths setup I then download and compile gearmand-1.1.2 just fine.

wget -O /tmp/gearmand-1.1.2.tar.gz https://launchpad.net/gearmand/1.2/1.1.2/+download/gearmand-1.1.2.tar.gz cd /tmp && tar zxvf gearmand-1.1.2.tar.gz ./configure && make -j8 && make install 

That works correctly. So now I need to install the Gearman library for PHP. I have attempted through PECL and downloading the source directly, both result in the same error:

checking whether to enable gearman support... yes, shared not found configure: error: Please install libgearman 

What I don't understand is I installed the libgearman-devel package which also installed the core libgearman. The installation installs libgearman-devel-0.14-3.el5.x86_64, libgearman-devel-0.14-3.el5.i386, libgearman-0.14-3.el5.x86_64, and libgearman-0.14-3.el5.i386.

Is it possible the package version is lower than what is required? I'm still poking around with this, but figured I'd throw this up to see if anyone has a solution while I continue to research a fix.

Thanks!


A:

This should do the trick:

export GEARMAN_LIB_DIR=/usr/include/libgearman 
export GEARMAN_INC_DIR=/usr/include/libgearman

That should work, if not you'll have to do some minor edits to config.m4.


other:

http://gearman.org/gearman_php_extension
http://blog.csdn.net/aidenliu/article/details/7406390
http://www.php.net/manual/en/gearmanclient.dobackground.php
http://www.wenzizone.com/2012/09/27/how_to_fix_rpm_filedigests_payloadisxz_is_needed.html
http://www.2cto.com/os/201206/136785.html
http://blog.s135.com/dips
http://blog.csdn.net/hfahe/article/details/5519582
http://hi.baidu.com/sunjiujiu/item/4406281c952cf47a7b5f2594



]]>mint 下codeblocks ~译libapue http://www.shnenglu.com/guojingjia2006/archive/2013/01/04/196955.html果?/dc:creator>果?/author>Fri, 04 Jan 2013 12:23:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2013/01/04/196955.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196955.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2013/01/04/196955.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196955.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196955.html于是乎下了一个,׃是乎惛_几个sample玩玩。于是乎?lt;unix 高环境~程> sample来测试?br />
于是乎徏了一个c++ project.
<unix 高环境~程>里的例子有个apue.h头文件。不是系l自带的。是作者自己写的几个util函数?br />|上扄译apue.h头文件一大片。但是都是考来考去Q不q核心的都差不多。不q有个方法是~译?br />libapue.a静态库后,q需要在apute.h头文件尾巴加"error.c"。。完了拷贝error.c实现到目录。?br />看完后。我惊了呆。。好吧。。这库还能这么用。?br />
既然libapue.a~译完后Qapue.h里的函数声明在libapue.a都已l实玎ͼ当然包括err_xxxpd的。所?br />在apue.h?error.c"是画蛇添뀂。这里不推荐此方法。?br />
我的环境是mint14? IDE用的?codeblocks. Ҏ(gu)中基本都有这么一个步骤:
先在q个|站 http://www.apuebook.com/src.tar.gz 下蝲tar.gz格式的源码包Q然后解压至某个目录Q比如说/home/xiaoguozi/下,然后q入目录apue.2eQ把文g Make.defines.linux 中的 WKDIR=/home/xxx/apue.2e 修改? WKDIR=/home/xiaoguozi/apue.2e Q然后再q入apue.2e目录下的std目录Q打开linux.mkQ将里面的nawk全部替换为awk
如果用vim~辑的话Q可以用 :1,%s/nawk/awk/g 替换字符H?br />
完了make, q程中,q遇C几个问题?mint?其他os不太清楚)

1: /usr/include/bits/timex.h:31:7:error: expect ':' , ',' , ';' , '}' or '__attribute__'   
 apue.2e/ipp/ipp.h?#define status u.st ?timex.h中的 status 冲突Q更?#define Status u.st

  

2QARG_MAX 未定?/span>

   在include/apue.h中加?#define ARG_MAX 4096

   在threadctl/getenv1.c 加入 #include "../include/apue.h"

   在threadctl/getenv3.c 加入 #include "../include/apue.h"

完了之后Qmake应该可以成功了

完了在codeblocks目里引用刚~译完的库,有几个方?
1)编译完的库,头文件apue.h拯/usr/include,库文件libapue.a拯?usr/lib下,q个是系l目录,gcc~译的时候会在这目录搜寻
2)在项目属性添加静态库引用
d头文Ӟ依次点击project->bulid options->Search directoriesQ在该标{N中点击CompilerQ单击Add按钮d头文件\?br />d静态库路径Q依ơ点击project->bulid options->Linker settingQ在该标{N中点击Add按钮d静态库路径?br />
如果之前你徏的是c project的话Q应该就可以利~译通过了,但是对于建立c++的project,仍然提示链接错误Q找不到函数实现Q?br />原因是libapue.a是c库,用g++~译的时候要引用c库的话,因ؓc++~译的时候会在函数加一些额外字W,所以当然会链接错误?/div>
解决也简单的在函数库前加 extern "C",或者直接把apue.h用extern "C"包含Q不清楚的补下相应知识?br />
加点额外的知识关于gcc/g++Q?br />
gcc和g++的区?p>误区一:gcc只能~译c代码,g++只能~译c++代码
两者都可以Q但是请注意Q?br />1.后缀?c的,gcc把它当作是CE序Q而g++当作是c++E序Q后~?cpp的,两者都会认为是c++E序Q注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。C++的语法规则更加严谨一些?br />2.~译阶段Qg++会调用gccQ对于c++代码Q两者是{h(hun)的,但是因ؓgcc命o不能自动和CQ+E序使用的库联接Q所以通常用g++来完成链接,Zl一赯Q干脆编?链接l统用g++了,q就lh一U错觉,好像cppE序只能用g++似的?br />
误区?gcc不会定义__cplusplus宏,而g++?br />实际上,q个宏只是标志着~译器将会把代码按Cq是C++语法来解释,如上所qͼ如果后缀?cQƈ且采用gcc~译器,则该宏就是未定义的,否则Q就是已定义?br />
误区?~译只能用gccQ链接只能用g++
严格来说Q这句话不算错误Q但是它h了概念,应该q样_~译可以用gcc/g++Q而链接可以用g++或者gcc -lstdc++。因为gcc命o不能自动和CQ+E序使用的库联接Q所以通常使用g++来完成联接。但在编译阶D,g++会自动调用gccQ二者等仗?/p> gcc和g++的区? 我们在编译c/c++代码的时候,有h用gccQ有人用g++Q于是各U说法都来了Q譬如c代码用gccQ而c++代码用g++Q或者说~译? gccQ链接用g++Q一时也不知哪个说法正确Q如果再遇上个extern "C"Q分歧就更多了,q里我想作个了结Q毕竟知识的目的是o人更清醒Q而不是更p涂?/div>



]]>raid 相关http://www.shnenglu.com/guojingjia2006/archive/2012/12/13/196219.html果?/dc:creator>果?/author>Thu, 13 Dec 2012 09:13:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/12/13/196219.htmlhttp://www.shnenglu.com/guojingjia2006/comments/196219.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/12/13/196219.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/196219.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/196219.htmlhttp://wenku.baidu.com/view/195a16eae009581b6bd9eb1b.html
http://blog.chinaunix.net/uid-20344928-id-3195698.html
http://www.issacy.com/archives/770.html
http://www.cnblogs.com/linuxer/archive/2012/03/07/2441224.html
http://zhidao.baidu.com/question/266486719.html
http://blog.163.com/fxd_3/blog/static/59261582201211032530668/
http://storage.chinaunix.net/stor/raid/2008/05/28/1117871.shtml
http://www.ibmsos.cn/a/IBMfuwuqijishuzhuanti/IBMfuwuqiyingjian_ruanjian/2011/0720/127.html
http://qijianghao.blog.51cto.com/3258446/787961
http://www.jb51.net/article/30494.htm


]]>linux 账号理及密码过期设|?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2012/12/06/196050.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Thu, 06 Dec 2012 11:22:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2012/12/06/196050.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/196050.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2012/12/06/196050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/196050.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/196050.html</trackback:ping><description><![CDATA[<div><p><div>Linux下对于新d的用P用户密码q期旉是从/etc/login.defs中PASS_MAX_DAYS提取的,普通系l默认就?9999Q而有些安全操作系l是90。更Ҏ(gu)处,只是让新建的用户默认密码q期旉变化Q已有用户密码过期时间仍然不变?/div><br /></p><p>[root@linuxidc ~]# chage --help<br />Usage: chage [options] user</p> <p>Options:<br /> <wbr> -d, --lastday LAST_DAY <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> set last password change to LAST_DAY<br /> <wbr> -E, --expiredate EXPIRE_DATE <wbr> set account expiration date to EXPIRE_DATE<br /> <wbr> -h, --help <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> display this help message and exit<br /> <wbr> -I, --inactive INACTIVE <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> set password inactive after expiration<br /> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> to INACTIVE<br /> <wbr> -l, --list <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> show account aging information<br /> <wbr> -m, --mindays MIN_DAYS <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> set minimum number of days before password<br /> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> change to MIN_DAYS<br /> <wbr> -M, --maxdays MAX_DAYS <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> set maximim number of days before password<br /> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> change to MAX_DAYS<br /> <wbr> -W, --warndays WARN_DAYS <wbr> <wbr> <wbr> <wbr> <wbr> set expiration warning days to WARN_DAYS <wbr></p> <p>chageQ密码失效是通过此命令来理的?/p> <p>  参数意思:<br />  -m 密码可更改的最天数。ؓ零时代表M时候都可以更改密码?br />  -M 密码保持有效的最大天数。www.linuxidc.com<br />  -W 用户密码到期前,提前收到警告信息的天数?br />  -E 帐号到期的日期。过了这天,此帐号将不可用?br />  -d 上一ơ更改的日期<br />  -i 停滞时期。如果一个密码已q期q些天,那么此帐号将不可用?br />  -l 例出当前的设|。由非特权用h定他们的密码或帐号何时q期?/p> <p>[root@linuxidc ~]# chage -l root<br />Last password change <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : Oct 19, 2010<br />Password expires <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : never<br />Password inactive <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : never<br />Account expires <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : never<br />Minimum number of days between password change <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : 0<br />Maximum number of days between password change <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : 99999<br />Number of days of warning before password expires <wbr> <wbr> <wbr> <wbr> <wbr> <wbr> : 7</p> <p>更改? chage -M 90 root</p> <p>[root@linuxidc ~]#chage -M 90 root</p> <p>[root@linuxidc ~]#chage -l root<br /></p> <p>如果以后d一个用?那么默认的时间还是没改的,q必d?etc/login.defs修改PASS_MAX_DAYS 的默认?那么如果我直接修改全局/etc/login.defs所在的用户会跟着改变? 据我的测试是不会改变?除非重启?但我们的服务器不是你想重启的可以重启的!如果理严格的地?重启q得l过很多E序步骤.改完全局?没有更改 的用?惌让他也同样具备此功能.得一个个的执?</p> <p>你也可以直接用vim ~辑器去~辑PASS_MAX_DAYS 99999</p> <p>也可以用其它的工?/p> <p>[root@linuxidc ~]#sed -i.bak -e 's/^\(PASS_MAX_DAYS\).*/\1 <wbr> <wbr> 90/' /etc/login.defs</p> <p>查看一下是?/p> <p>[root@linuxidc ~]#cat /etc/login.defs |grep "PASS_M";</p> <p>强制用户登陆时修改口?br />[root@linuxidc ~]#chage -d 0 usernameQlinuxQ?br />[root@linuxidc ~]#passwd -f username(solaris)</p> <p>强制用户下次登陆时修改密码,q且讄密码最低有效期0和最高有限期90Q提?5天发警报提示<br />[root@linuxidc ~]#chage -d 0 -m 0 -M 90 -W 15 rootQlinuxQ?br />[root@linuxidc ~]#passwd -f -n 0 -x 90 -w 15 rootQsolarisQ?br />查看某个用户的密码设|情?br />[root@linuxidc ~]#chage -l username<br />修改密码配置文g<br />[root@linuxidc ~]#vi /etc/login.defs</p></div><br />//账号<br /><br /><div>Linux ssh建立一个新的用户包括两个步骤,W一步是使用useradd命o完成一个新用户的初始化讄工作;W二步是用passwd个新用户讄密码。例如,我们要给pȝd一个用户叫floatboat Q密码ؓlan2010Q那相关的操作是Q?<p>  useradd floatboat -d /u01/Lanlp<回R></p> <p>  q时候系l没有Q何显C。接着Q?/p> <p>  passwd floatboat <回R></p> <p>  pȝ昄Q?/p> <p>  Changing password for user floatboat</p> <p>  New UNIX password:</p> <p>  你输入:</p> <p>  lan2010<回R></p> <p>  注意Q由于linuxq不采用cMwindows的密码回?昄??——为避免你输入密码时被人注意到有多位——所以,输入的这些字W你是看不见的?/p> <p>  pȝ昄Q?/p> <p>  Retype new UNIX password:</p> <p>  你再重新输入一ơ密码,然后回R认Q这时系l会昄Q?/p> <p>  passwd:all authentication tokens updated successfully</p> <p>  表示你修改密码成功了?/p> <p>  到这里,新用L(fng)创徏工作q完成了?/p> <p>  下面Q我们再补充一些有兛_加新用户的常识:</p> <p>  1、useradd所做的初始化操作已l包括在/home目录下ؓfloatboat帐号建立一个名为floatboat的主目录。如果你不想 使用q个~省的目录,而希望把他的ȝ录放?home/goal?q放?home下,只是一U良好的?fn)惯Q没有其他什么特别的要求)Q可以? useradd的参?dQ命令如下:</p> <p>  useradd -d /home/goal floatboat</p> <p>  2、useradd的初始化操作q包括ؓ用户单独建立一个与用户名同名的l?floatboatl?。这叫用L(fng)有组的机Ӟ与默认组机制相对 应。对用户分组一是方便管理,二是可以明确权限。复杂的我们在以后的深入内容中探讨。我们如果想让此用户加入一个已有的l的话,可以使用-g参数。例?我们惌floatboat加入webusersl,那么可以使用以下命oQ?/p> <p>  useradd -g webusers floatboat</p> <p>  同样的,我们q可以?G参数使他同时加入多个l,例如webusers和ftpusersQ?/p> <p>  useradd -G ftpusers,webusers floatboat</p> <p>  3、passwd命oZ个用戯|密码,但它实质上是一个修改密码的E序。只有超U用户和用户自己可以修改密码Q其它的普通用h有给他修?密码? 权利。用户密码的l成要尽量的复杂Q最好包括字母、数字和Ҏ(gu)W号Q而且最好设?位以上。太短passwdE序不允许,只是单纯的字母或单纯的数 字,passwd也会有意见。你都会看见passwd出现的提C的Q不要害怕,仔细看看到底它是怎么说的Q?</p> <p>  4、你在增加一个新用户的时候,也可以设|用L(fng)录的shell。缺省的Q系l提供了/bin/bash。你如果非要指定的话Q可以?s参数可以了。例?/p> <p>  useradd -d /www -s /usr/bin/passwd floatboat</p> <p>  注意Q这些参数是可以一块用的Q如上例所C,它表C增加新用户Qƈ把其ȝ录\径设|在/wwwQ登录的shell?usr/bin/passwd。关于shell的更详细的说明,请参考下面的修改用户的个|相兛_宏V?/p> <p>  5、删除一个用户可以用userdel命oQ直接带用户名做参数可以了?/p> <p><strong>  修改用户的设|?/strong></p> <p>  对现有用L(fng)修改Q比较常用的主要是修改密?使用passwd好?Q修改用L(fng)dshellQ修改用h属的默认l,讄帐号有效期,修改用户的说明信息等{,偶尔也会用到修改用户ȝ录?/p> <p><strong>  修改用户的登录shell</strong></p> <p>  使用chsh命o可以修改自己的shellQ只有超U用h能用chsh username为其它用户修改shell讄。注意,指定的shell必须是列?etc/shells文g中的shellQ否则该用户不能登陆?/p> <p>  一般,比较常见的shells文g包括下面q些shellQ?/p> <p>  /bin/bash2</p> <p>  /bin/bash</p> <p>  /bin/sh</p> <p>  /bin/ash</p> <p>  /bin/bsh</p> <p>  /bin/tcsh</p> <p>  /bin/csh</p> <p>  而网们q喜Ƣ在里面加上/usr/bin/passwdQ这是ؓ了不然用户通过控制台或telnetdpȝQ却可以使用修改帐户密码(比如在FTP??。以?bin/falseQ也是不让q个用户d的意思喽^&^Q连FTP也不能用?/p> <p>  你也可以使用usermod命o修改shell信息Q如下所C:</p> <p>  usermod -s /bin/bash floatboat</p> <p>  其中/bin/bash和floatboat应取相应的shell路径文g名及用户名?/p> <p>  q有一U情况,是你ؓ用户讄了一个空的shell(是"")Q也是_q个用户没有shell。呵呵,l对没有在我q未曾见q,因ؓq种用户d后,pȝq是会给它一个shell用的。不信你试试Q?/p> <p>  usermod -s "" floatboat</p> <p>  q种用户Ҏ(gu)pȝ的不同,会有一个sh或bashq行操作Q我也没有看出功能上和其它普通用L(fng)录有什么不同?/p> <p>  修改用户所属的默认l?/p> <p>  q个功能也可以通过usermod命o来实玎ͼ使用-g参数Q例如把floatboat的默认组改ؓnobodyQ可以用如下命令:</p> <p>  usermod -g nobody floatboat</p> <p>  nobody在类UNIXpȝ中一般都意味着没有M权限?/p> <p>  讄帐号有效?/p> <p>  如果使用了媄子口令,则可以用如下命令来修改一个帐L(fng)有效期:</p> <p>  usermod -e MM/DD/YY username</p> <p>  例如把用户floatboat的有效期定ؓ2001q?2?1日:</p> <p>  usermod -e 12/31/01 floatboat</p> <p>  如果把该用户的有效期设ؓ已经q去的时_可以暂时禁止该用户dpȝ?/p> <p>  修改用户的说明信?/p> <p>  修改用户的说明信息,最单的Ҏ(gu)莫过于直接修?etc/passwd文gQ找到对应的用户记录行,例如下列行:</p> <p>  floatboat:x:503:503::/home/floatboat:/bin/bash</p> <p>  你可以直接在W四个冒号和W五个冒号之间插入该用户的说明就可以了。其实,很多用户讄都可以在q修改,比如该行最后一部分/bin/bash是用户dshell的设|。关于这?etc/passwd文gQ我们后面将q一步的深入探讨?/p> <p>  修改用户ȝ?/p> <p>  修改用户的主目录主要使用usermod命o?d参数Q例如:</p> <p>  usermod -d /www floatboat</p> <p>  q一行将floatboat的主目录改到/www。如果想现有主目录的主要内容{Ud新的目录Q应该?m开养I如下所C:</p> <p>  usermod -d -m /www floatboat</p> <p>  文g目录的权?/p> <p>  linux下,每一个文件、每一个目录都有一个属主,q对用戯己、用h在组、其它所有帐?l?分别讑֮诅R写、执行三U权限。例如,?假定是webusersl的floatboat帐户的拥有?使用如下命o建立一个新的文?/p> <p>  touch mytestfile</p> <p>  然后我们使用ls -l mytestfileq一命o来查看这个文件的权限状?关于ls命oQ可以查阅本站的命o查询)Q可以得到如下的屏幕输出昄Q?/p> <p>  -rw-rw-r-- 1 floatboat webusers 0 Feb 6 21:37 mytestfile</p> <p>  输出q格分?个部分,我们比较兛_W一、三、四个字D,分别表示文g权限属性、文件所有者帐戗文件所属组?/p> <p><strong>  ◆使用chown命o修改文g的主?/strong></p> <p>  当你新徏立一个文件的时候,文g的所有者当然就是你了。这一事实只有用户(比如说root)才可以通过chown命o改变(例如chown otheruser mytestfile,把mytestfile文g的属L为otheruser)。普通用户不能把自己的文?#8220;?#8221;l别人,不然你把有特D目的的E序l? 了root怎么办?Q?</p> <p>  chown命o的用法比较简单。这里我先假设你现在拥有用户权限Q那么你可以用如下命令将一个文?#8220;送给”floatboat了:</p> <p>  chown floatboat /home/floatboat/thefileisrootcreate.txt(假定该文件是由root创徏?</p> <p>  修改一个目录的所有者也是类似的Q?/p> <p>  chown floatboat /home/newboat</p> <p>  当然Q如果这个目录还有子目录及文仉要同旉给floatboatQchown也是支持-R参数的:</p> <p>  chown -R floatboat /home/newboat</p> <p>  如果你同时想修改文g/目录所属的l的话,你可以用以下命令方便的辑ֈ目的Q?/p> <p>  chown -R floatboat.ftpusers /home/newboat</p> <p>  q样Q不但文件主人得C修改Q文件所属的l也变成了ftpusers</p> <p><strong>  ◆修改文g的组属?/strong></p> <p>  文g所属组你倒是可以改变Q前提是Q?/p> <p>  1、你的超U用戗?/p> <p>  2、你同时属于两个或两个以上的l?/p> <p>  两个条g你至具备一个,你才能够把文件所属旧l变为新l。用如下的命o当前目录下所有html文g所属的l改为httpdQ?/p> <p>  chgrp httpd *.html</p> <p>  和chown命o一Pchgrp也可以?R参数对一个目录内的所有文件和子目录进行递归的修改组属性?/p> <p>  <提示>Q你可以使用不带参数的groups命o查看自己属于哪个l?/p> <p>  文g权限的设定是我们q一节讨论的核心,我们主要介绍chmod命o的两U用法?/p> <strong>◆使用讉K字符串设|文件目录权?/strong> <p>  正如前面所说的Q每一个文件、目录都针对用户自己、用h在组、其它所有帐?l?分别有读、写、执行三U权限及其组合。当一个普通用hZ 个文? 的时候,它默认的讉K权限昄如我们刚才所举例子的W一个字D|C。d十位字符“-rw-rw-r--”Q第一位是目录区分标志Q如果是d的话Q表C? q是一个目录。第二到四位分别表示文g所有者的?rQread)、写(w:write)、执?x:execute)属性,W五C位是文g所属组? 诅R写、执行权限,W八到第十位则是其它用户的读、写、执行权限。如果对应的位是相应的字母,是有这相应权限Q否则ؓ“-”Q表C没有获得这个许可。象 刚才例子中的文g是自己可读写,本组可读写,其它用户可读Q所有的用户(包括自己)都不能执行它?/p> <p>  我们的用u、g、o分别来指代用?user)、组(group)、其它帐?other)Q就可以方便的设|文件和目录的权限了。当Ӟ我们也可以用a来表C所有的q三V?/p> <p>  例如Q我们要Ҏ(gu)有perl的脚本文件设定权限,Ҏ(gu)有用户都可以d执行Q文件所有者还允许写许可,那么我们可以使用如下命oQ?/p> <p>  chmod a+rx,u+w *.pl</p> <p>  注意Q如果要使用多个讉K字符Ԍ它们之间要用逗号隔开Q各个许可字W串之间不允许有I格。正如上例所C?/p> <p>  如果要修改目录中所有文件和子目录的权限属性,可以使用chmod提供?R参数来递归修改。例如,下列命o?www/site1目录及其下面的子目录的权限属性设定ؓ所有者和l可诅R写、执行,其它用户不可讉KQ?/p> <p>  chmod -R a+rwx,o-rwd /www/site1</p> <p>  注意Q不要轻易?R选项Q这可能会带来安全隐(zhn)?/p> <p>  使用字符串方便了理解Q单输入那么多字母还是有点篏Q如果你?q制有些概念的话Q可以用下面介l的Ҏ(gu)来做权限讄?/p> <p><strong>  ◆使用八进制数讄文g目录权限</strong></p> <p>  我们知道Q在ls -l的输ZQ文件权限表CZؓ“-rw-rw-r--”Q前一位只和是否ؓ目录有关Q其它九(ji)位正好可以分成三D,每段三位Q?#8220;rw-”?#8220;rw-”? “r--”,“-”代表无效“0”Q其它字W代表有?#8220;1”Q那么这个文件的权限是“110”?#8220;110”?#8220;100”Q把q个2q制串{换成对应? q制数就???Q也是说该文g的权限ؓ664(三位八进制数)。我们也可以使用cMq种三位八进制数来设定文件授权,如上边两个例子,׃可以? 为:</p> <p>  chmod 755 *.pl</p> <p>  chmod -R 770 /www/site1</p> <p>  是不是很z?关键在于你能Ҏ(gu)你需要设定的权限正确的选择八进制数(利用八进制数的二q制表示可以非常L的做到这一??/p> <p><strong>  ◆诅R写、执行的权限说明</strong></p> <p>  1、所谓写的权限,也就是对文g修改和删除的权限。如果目录的写权限也对你开放了Q则可以创徏、删除或修改该目录下的Q何文件或自目?#8212;—即该文件和子目录ƈ不属于你?/p> <p>  2、对目录有只读许可的用户Q不能用cd命oq入该目?q必d时有执行许可才可以进入该目录?/p> <p>  3、必d时拥有读和执行权限才可以使用lsq样的程序列出目录内Ҏ(gu)单?/p> <p>  4、只对目录有执行权限的用P惌问该目录下的文g有读权限的文Ӟ必须知道该文件名才可以访问?/p> <p>  两个重要文gQpasswd与group</p> <p>  在linux的安全机刉Q?etc/passwd?etc/groupq两个文件占着非常重要的地位。它们控制着linux的用户和l一些重要设|?/p> <p><strong>  ◆/etc/passwd文g说明</strong></p> <p>  下面是一个RHlinux里普通的passwd文g的例子:</p> <p>  root:x:0:0:root:/root:/bin/bash</p> <p>  bin:x:1:1:bin:/bin:</p> <p>  daemon:x:2:2:daemon:/sbin:</p> <p>  ……</p> <p>  operator:x:11:0perator:/root:</p> <p>  games:x:12:100:games:/usr/games:</p> <p>  gopher:x:13:30:gopher:/usr/lib/gopher-data:</p> <p>  ftp:x:14:50:FTP User:/home/ftp:</p> <p>  nobody:x:99:99:Nobody:/:</p> <p>  xfs:x:43:43:X Font Server:/etc/X11/fs:/bin/false</p> <p>  named:x:25:25:Named:/var/named:/bin/false</p> <p>  postgres:x:26:26ostgreSQL Server:/var/lib/pgsql:/bin/bash</p> <p>  lanf:x:500:500::/home/hujm:/bin/bash</p> <p>  mysql:x:101:101:MySQL server:/var/lib/mysql:/bin/bash</p> <p>  imnotroot:x:0:0::/home/imnotroot:/bin/bash</p> <p>  在这个文仉只有一个普通帐号lanf。其它都是系l或pȝ服务的进E需要的帐号Q包括我们非常熟(zhn)的rootq个用户。在passwd的文仉Q每一行被冒号(":")分成7个部分,分别是:</p> <p>  [用户名]Q[密码]Q[UID]Q[GID]Q[w䆾描述]Q[ȝ录]Q[dshell]</p> <p>  其中Q?/p> <p>  ⒈[用户名]是passwd文g里各记录行唯一的有"唯一?要求的域。也是说每一行的W一个区域的内容都不能相同,其它区域无所谓了?/p> <p>  ⒉[密码]区域在以前,保存着一个经q不可逆的哈希法q行DES加密?3位字W,但不包括单引号和冒号。这13位字W中Q前两位是密钥,?加密? 时候随机生成的。由于这个字W串不包括单引号Q所以以前有一U不修改密码又禁止用L(fng)录的方式是在密码前面加一个单引号。值得注意的是Q现在由于用了 shadow口oQ在密码区域只有一个x字符?/p> <p>  ⒊[UID]虽然是系l用来标志文件归属,定各种权限的标志,但这个区域的内容q不要求唯一的。比较常见而又与安全问题相关的一个例子是有多 ? UID和GID均ؓ0的用户帐受注意到在该文g最后一行还有一个UID和GID?的用户imnotrootQ虽然它声称自己不是rootQ但是它却有 和root完全相同的权限,因ؓpȝqҎ(gu)[用户名]Q而是Ҏ(gu)UID和GID来分用户的权力的。所以,q种情况无疑为系l埋下了安全的zhadan?但是Q当 imnorroot做锁定屏q等操作的时候,如果它的密码和root的不一P它将无法解锁Q因为系l只是查到第一个UID?的用?自然是root) 后,׃在往下查找了——它当UID也是唯一的?/p> <p>  ⒋[GID]用户默认的组IDQ这个ID可以在文?etc/group里查到对应的l名?/p> <p>  ⒌[w䆾描述]Q就是用L(fng)w䆾说明Q默认的是无M说明Q可人工d?/p> <p>  ⒍[ȝ录]Q用L(fng)ȝ录,可以使用前面介绍的命令修攏V?/p> <p>  ⒎[dshell]Q用L(fng)录时pȝ提供的shellQ请参考前面的有关内容?/p> <p>  <注意>Q[UID]和[GID]于500的一般都是系l自׃留,不做普通用户和l的标识的,所以新增加的用户和l一般都是UID和GID大于500的?/p> <p><strong>  ◆/etc/group文g说明</strong></p> <p>  下面是RH的一个group文g的例子:</p> <p>  root:x:0:root,hujm,hjm</p> <p>  bin:x:1:root,bin,daemon</p> <p>  daemon:x:2:root,bin,daemon</p> <p>  sys:x:3:root,bin,adm</p> <p>  adm:x:4:root,adm,daemon</p> <p>  tty:x:5:</p> <p>  disk:x:6:root</p> <p>  lp:x:7:daemon,lp</p> <p>  mem:x:8:</p> <p>  kmem:x:9:</p> <p>  wheel:x:10:root</p> <p>  mail:x:12:mail</p> <p>  news:x:13:news</p> <p>  uucp:x:14:uucp</p> <p>  ……</p> <p>  hujm:x:503:root,mynoshell,hjm</p> <p>  mysql:x:101:</p> <p>  mynoshell:x:505:</p> <p>  ftpusers:x:506:</p> <p>  它d分四个部分:</p> <p>  [l名]Q[密码域]Q[GID]Q[l员列表]</p> <p>  意思非常明显,需要说明一下的是,׃l一般都不用密码保护Q所以虽然看h密码域有个X字符Q其实那只表CZ用了SHADOW(对应文g? gshadow)。组员列表用逗号分隔各个帐号。另外,一个组的组员如果默认登录组是它的话,那么在组员列表里不昄q个l员的帐P例如用如下命? 增加的用P</p> <p>  useradd -g ftpusers floatboat</p> <p>  ?etc/group文g里ftpusers的组员列表将不显C个组?真是p|)Q而只是在passwd文g中的GID被设|ؓ506。而用如下命令:</p> <p>  usermod -G ftpusers,mysql,webusers floatboat</p> <p>  可以看见相关的l后边加上了floatboat帐号。当Ӟ你可以直接用vi来直接编辑这个文件?/p> <p>  group文g和passwd文g是通过GID联系在一L(fng)Q这有点象关pL据库。根据passwd文g中一个帐L(fng)GIDQ可以在group 文g? 扑ֈ对应的组名。如果采用了用户U有l机制的话,那么一般新增一个帐P׃有对应的一个与帐号同名的组增加到group文g中。虽然这时passwd? 件中h唯一性的[用户名]字段和group文g中具有唯一性的[l名]字段一Pq不代表着它们是通过q两个字DŞ成一一对应的关pȝ。千万别忘记Q系 l对数字(UIDQGID)更加敏感.</p></div><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/196050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2012-12-06 19:22 <a href="http://www.shnenglu.com/guojingjia2006/archive/2012/12/06/196050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Too many open files -- linux文g描述W的限制调整 http://www.shnenglu.com/guojingjia2006/archive/2012/11/21/195450.html果?/dc:creator>果?/author>Wed, 21 Nov 2012 03:43:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/11/21/195450.htmlhttp://www.shnenglu.com/guojingjia2006/comments/195450.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/11/21/195450.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/195450.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/195450.html 转自:
http://blog.csdn.net/yetyongjin/article/details/7476860

q两天做asterisk的性能试Q经常碰到这L(fng)错误Q?#8220;Too many open files”?/span>

        我们知道QLinux下,文g描述W就是一个简单的整数|?fn)惯上,标准输入Qstandard inputQ的文g描述W是 0Q标准输出(standard outputQ是 1Q标准错误(standard errorQ是 2。POSIX 定义了STDIN_FILENO、STDOUT_FILENO 和STDERR_FILENO 来代?0??。这三个W号帔R的定义位于头文g unistd.h?/span>

        文g描述W的有效范围? 到OPEN_MAX。那么一个进E最多到底能打开多少个文件描q符呢?下面Q就以asteriskq程Z来说明?/span>


#ps –ef | grep asterisk


从第二列得到asterisk的PID?9488?/span>

# cat /proc/19488/limits

        U线一行说明asteriskq程最大能打开1024个文件描q符Q不包含它的子进E或创徏出来的线E)。在/proc/19488/task/目录下,详细列出了其下的子Q务的情况Q每个子文g多w同样有一个limits文gQ限定了各子d的情c?/span>

 

         一个进E打开了几个文件描q符呢?

# ll /proc/19488/fd/


        子目录fd中,详细列出了进E打开的每个文件描q符Q同P/proc/19488/task/XXXX/fd下也会有子Q务打开的文件描q符的情c要知道有几个,执行

# ll /proc/19488/fd/ | wc -l

 

        怎样知道一个进E及其子q程和哪些文件有兌呢?lsof可以完成q工作。请注意Q关联文件和打开文g描述W是两个不同的概念,兌文g的数量可能远q大于打开的文件描q符的数量?/span>

# lsof | grep asterisk | wc –l

        也可以用父进E的PIDqo

# lsof | grep 19488 | wc –l

         我这里得到的值是9525

 

         怎样修改文g描述W的限定呢?临时修改Q可以通过ulimit?/span>

# ulimit -SHn 2048

 

          但是q样只能影响到当前的sessionQ当l端重新q接或当前用户退出,配置失效了。如果想怹变更需要编?etc/security/limits.conf 文gQ添加如下两行:
* hard nofile 2048
* soft nofile 2048

 

         内核参数Ҏ(gu)件描q符也有限制Q如果设|的值大于内核的限制Q也是不行的Q?/span>

         查找file-max的内核参敎ͼ

# sysctl -a|grep file-max

        更改file-max的内核参敎ͼ

# sysctl -w file-max=65535

        Sysctl也是临时的,要想怹生效Q可以通过更改sysctl的文Ӟ~辑/etc/sysctl.conf文gQ添加或修改以下一行:

fs.file-max=65535

 

        需要注意的是,文g描述W的限制Q不局限于q里描述的这些,q可能和q程的启动参数、用L(fng)环境讄有关。当Ӟ如果是进EBUG造成文g描述W没有及时关闭回Ӟq增大限制也只是LQ根本上q得修复BUG?/span>

       此外Qlsof会列出系l中所占用的资?但是q些资源不一定会占用打开的文件描q符(比如׃n内存,信号?消息队列,内存映射.{?虽然占用了这些资?但不占用打开文g?Q因此有可能出现cat /proc/sys/fs/file-max 的值小于lsof | wc -l。asterisk本n提供了一个启动脚本,名ؓsafe_asteriskQ脚本里面就Ҏ(gu)件描q符做了一些设|?/span>



]]>
mysqldumphttp://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185869.html果?/dc:creator>果?/author>Wed, 01 Aug 2012 04:23:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185869.htmlhttp://www.shnenglu.com/guojingjia2006/comments/185869.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/08/01/185869.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/185869.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/185869.html

命o行下具体用法如下Q?nbsp;

mysqldump -u用戶?-p密码 -d 数据库名 表名 > 脚本?

 

 

导出整个数据库结构和数据
mysqldump -h localhost -uroot -p123456 database > dump.sql

 

导出单个数据表结构和数据
mysqldump -h localhost -uroot -p123456  database table > dump.sql

 

 

导出整个数据库结构(不包含数据)
mysqldump -h localhost -uroot -p123456  -d database > dump.sql

 

导出单个数据表结构(不包含数据)
mysqldump -h localhost -uroot -p123456  -d database table > dump.sql



]]>Apache Rewrite 注意?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2012/07/20/184384.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Fri, 20 Jul 2012 11:54:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2012/07/20/184384.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/184384.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2012/07/20/184384.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/184384.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/184384.html</trackback:ping><description><![CDATA[<div><p>1.首先配置a(chn)pache的httpd.confQ目的是?htaccess文g生效<br /><VirtualHost a.b.c.d><br />    ServerAdmin a<a href="mailto:a@b.com">@b.com</a><br />    DocumentRoot /var/www/bulknews<br />    ServerName <a >www.bulknews.cn</a><br /><Directory /><br />      Options FollowSymLinks<br />      AllowOverride All<br /></Directory><br />ErrorLog  "|/usr/local/sbin/cronolog /var/log/www/wapya/www.bulknews.cn_error_log.%Y%m%d"<br />CustomLog "|/usr/local/sbin/cronolog /var/log/www/wapya/www.bulknews.cn_access_log.%Y%m%d" combined<br /></VirtualHost></p> <p>注意Q这里必LFollowSymLinksQAllowOverride是AllQ否则rewrite引擎Ҏ(gu)不v作用Q另外如果你的apache默认根目录是/var/www 的话Q在/var/www的配|字D也要设|?br />Options FollowSymLinks<br /> AllowOverride All<br />我的因个,只是在虚拟主|,D一直不能实现静态页面的转化?/p> <p>2.?var/www/bulknews下设|?htaccess文g<br />我们q边最单的配置是<br />RewriteEngine   on<br />RewriteBase     /<br />RewriteRule     (.+)\.html$ show.php?id=$1 [L]</p> OKQ重启web服务Q这时候你可以正常访?a >http://www.bulknews.cn/1014700.html</a><br /><br />另外rewriteq有很多应用Q大家可以多去google找一些资料,功能q是很神奇的?/div><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/184384.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2012-07-20 19:54 <a href="http://www.shnenglu.com/guojingjia2006/archive/2012/07/20/184384.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>安装 Git 版本控制工具 http://www.shnenglu.com/guojingjia2006/archive/2012/07/17/183952.html果?/dc:creator>果?/author>Tue, 17 Jul 2012 13:54:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/07/17/183952.htmlhttp://www.shnenglu.com/guojingjia2006/comments/183952.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/07/17/183952.html#Feedback2http://www.shnenglu.com/guojingjia2006/comments/commentRss/183952.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/183952.html
1
yum install git git-svn git-email git-gui gitk

从源代码q行~译安装

1. 先下载最新的 git E_版源?/p>

1
wget https://git-core.googlecode.com/files/git-1.7.10.tar.gz

2. 解压源码Qƈq入源码目录

PHP
1
2
tar xzvf git-1.7.10.tar.gz
cd git-1.7.10

3. ~译安装

1
2
./configure prefix=/usr/local
make && make install

可能出现的错误:

a. msgfmt: command not found

解决Ҏ(gu)Qyum install gettext

b. 安装完毕执行gitQ提C?#8220;git: error while loading shared libraries: libcharset.so.1: cannot open shared object file: No such file or directory”

解决Ҏ(gu)Qln -s /usr/local/lib/libcharset.so.1 /lib/libcharset.so.1

4. 安装 Git 命o补全功能

a. 复制命o补全脚本?/etc/bash_completion.d/ 目录Q没有则自行创徏Q?/p>

1
cp contrib/completion/git-completion.bash /etc/

b. 载入 git 命o自动补全脚本Q之在当前?shell 环境中生?/p>

1
. /etc/git-completion.bash

q时候你׃发现自动补全已经生效了。试试输?#8221;git com”, 再按?TAB 键看看吧?br /> c. Z命o补全功能能在下次启动l端时自动启用,需要在 /etc/profile ?~/.bashrc 中添加如下内容:

1
2
3
4
# Git commands autocompletion
if [ -f /etc/git-completion.bash ]; then
    . /etc/git-completion.bash
fi

附:Windows 环境使用 Git 的相兛_?/strong>

1. Cygwin http://www.cygwin.com/

2. msysGit http://msysgit.github.com/

3. TortoiseGit http://code.google.com/p/tortoisegit/



]]>nginx启动Q重启,关闭命ohttp://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180622.html果?/dc:creator>果?/author>Thu, 28 Jun 2012 03:15:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180622.htmlhttp://www.shnenglu.com/guojingjia2006/comments/180622.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180622.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/180622.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/180622.html
停止操作
停止操作是通过向nginxq程发送信P什么是信号请参阅linux?章)来进行的
步骤1Q查询nginx主进E号
ps -ef | grep nginx
在进E列表里 面找masterq程Q它的编号就是主q程号了?br style="line-height: normal;" /> 步骤2Q发送信?/span>
从容停止NginxQ?br style="line-height: normal;" /> kill -QUIT 主进E号
快速停止NginxQ?br style="line-height: normal;" /> kill -TERM 主进E号
强制停止NginxQ?br style="line-height: normal;" /> pkill -9 nginx

另外Q?若在nginx.conf配置了pid文g存放路径则该文g存放的就是Nginx主进E号Q如果没指定则放在nginx的logs目录下。有了pid?Ӟ我们׃用先查询Nginx的主q程P而直接向Nginx发送信号了Q命令如下:
kill -信号cd '/usr/nginx/logs/nginx.pid'

qx重启
如果更改了配|就要重启NginxQ要先关闭Nginx再打开Q不是的Q可以向Nginx 发送信Pqx重启?br style="line-height: normal;" /> qx重启命oQ?/span>
kill -HUP 住进U号或进E号文g路径

或者?/p>

/usr/nginx/sbin/nginx -s reload

注意Q修改了配置文g后最好先查一下修改过的配|文件是否正 ,以免重启后Nginx出现错误影响服务器稳定运行。判断Nginx配置是否正确命o如下Q?br style="line-height: normal;" /> nginx -t -c /usr/nginx/conf/nginx.conf

或?/p>/usr/nginx/sbin/nginx -t


qx升
如果服务器正在运行的Nginx要进行升U、添加或删除模块Ӟ我们需 要停掉服务器q做相应修改Q这h务器p在一D|间内停止服务QNginx可以在不停机的情况下q行各种升动作而不影响服务器运行?br style="line-height: normal;" /> 步骤1Q?br style="line-height: normal;" /> ?果升UNginxE序Q先用新E序替换旧程序文Ӟ~译安装的话新程序直接编译到Nginx安装目录中?br style="line-height: normal;" /> ??Q执行命?/span>
kill -USR2 旧版E序的主q程hq程文g?/span>
此时旧的Nginx主进E将会把自己的进E文件改名ؓ.oldbinQ然后执行新?Nginx。新旧Nginx会同市运行,共同处理h?br style="line-height: normal;" /> q时要逐步停止旧版 NginxQ输入命令:
kill -WINCH 旧版主进E号
慢慢旧的工作q程都会随着d执行完毕而退出,新版的Nginx的工作进E会逐渐取代旧版 工作q程?br style="line-height: normal;" />
?Ӟ我们可以军_使用新版q是恢复到旧版?br style="line-height: normal;" /> 不重载配|启动新/旧工作进E?br style="line-height: normal;" /> kill -HUP ?新版主进E号
从容关闭?新进E?br style="line-height: normal;" /> kill -QUIT ?Cq程?br style="line-height: normal;" /> 如果此时报错Q提C有进E没有结束就用下面命令先关闭?新工作进E,再关闭主q程P
kill -TERM ?新工作进E号

q样下来Q如果要恢复到旧版本Q只需要上面的几个?骤都是操作新版主q程P如果要用新版本就上面的几个步骤都操作旧版主进E号p了?br style="line-height: normal;" />
上面是Nginx的一些基本的操作Q希望以后Nginx能有更好的方法来处理q些操作Q?最好是Nginx的命令而不是向Nginxq程发送系l信受?/div>


]]>
linux ?apache启动、停止、重启命?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180621.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Thu, 28 Jun 2012 03:15:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180621.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/180621.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/180621.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/180621.html</trackback:ping><description><![CDATA[<div><p><strong>基本的操作方法:</strong><br /> 本文假设你的apahce安装目录?usr/local/apache2Q这些方法适合M情况</p> <p>apahce启动命oQ?br /> 推荐/usr/local/apache2/bin/apachectl start apaceh启动</p> <p>apache停止命o<br /> /usr/local/apache2/bin/apachectl stop   停止</p> <p>apache重新启动命oQ?br /> /usr/local/apache2/bin/apachectl restart 重启</p> <p>要在重启 Apache 服务器时不中断当前的q接Q则应运行:</p> <p>/usr/local/sbin/apachectl graceful</p> <p><strong>如果apache安装成ؓlinux的服务的话,可以用以下命令操作:</strong></p> <p>service httpd start 启动</p> <p>service httpd restart 重新启动</p> <p>service httpd stop 停止服务</p></div><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/180621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2012-06-28 11:15 <a href="http://www.shnenglu.com/guojingjia2006/archive/2012/06/28/180621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Windows完成端口与Linux epoll技术简?转蝲)http://www.shnenglu.com/guojingjia2006/archive/2010/08/27/124945.html果?/dc:creator>果?/author>Fri, 27 Aug 2010 07:43:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/27/124945.htmlhttp://www.shnenglu.com/guojingjia2006/comments/124945.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/27/124945.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/124945.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/124945.html

WINDOWS完成端口~程
1、基本概?br> 2、WINDOWS完成端口的特?br> 3、完成端口(Completion Ports Q相x据结构和创徏
4、完成端口线E的工作原理
5、Windows完成端口的实例代?br> Linux的EPoll模型
1、ؓ什么select落后
2、内怸提高I(y)/O性能的新Ҏ(gu)epoll
3、epoll的优?br> 4、epoll的工作模?
5、epoll的用方?br> 6、Linux下EPOll~程实例
ȝ

WINDOWS完成端口~程
        摘要Q开发网l程序从来都不是一件容易的事情Q尽只需要遵守很的一些规?创徏socket,发vq接Q接受连接,发送和接受数据。真正的困难在于Q? 让你的程序可以适应从单单一个连接到几千个连接乃至于上万个连接。利用Windowsq_完成端口q行重叠I/O的技术和Linux?.6版本的内怸 引入的EPOll技术,可以很方便在在在Windows和Linuxq_上开发出支持大量q接的网l服务程序。本文介l在Windows和Linuxq_ 上用的完成端口和EPoll模型开发的基本原理Q同时给出实际的例子。本文主要关注C/Sl构的服务器端程序,因ؓ一般来_开发一个大定wQ具可扩? 性的winsockE序一般就是指服务E序?br>
1、基本概?br>
    讑֤---windows操作pȝ上允?dng)R信的Q何东西,比如文g、目录、串行口、ƈ行口、邮件槽、命名管道、无名管道、套接字、控制台、逻辑盘、物? 盘{。绝大多C讑֤打交道的函数都是CreateFile/ReadFile/WriteFile{。所以我们不能看?*File函数只惛_文g 讑֤。与讑֤通信有两U方式,同步方式和异步方式。同步方式下Q当调用ReadFile函数Ӟ函数会等待系l执行完所要求的工作,然后才返回;异步方式 下,ReadFileq类函数会直接返回,pȝ自己d成对讑֤的操作,然后以某U方式通知完成操作?br> 重叠I/O----֐思义Q当你调用了某个函数Q比如ReadFileQ就立刻q回做自q其他动作的时候,同时pȝ也在对I/0讑֤q行你要求的? 作,在这D|间内你的E序和系l的内部动作是重叠的Q因此有更好的性能。所以,重叠I/O是用于异步方式下使用I/O讑֤的? 重叠I/O需要用的一个非帔R要的数据l构OVERLAPPED?br>
2、WINDOWS完成端口的特?br>
   Win32重叠I/O(Overlapped I/O)机制允许发v一个操作,然后在操作完成之后接受到信息。对于那U需要很长时间才能完成的操作来说Q重叠IO机制其有用Q因为发起重叠操作的U程 在重叠请求发出后可以自q做别的事情了。在WinNT和W(xu)in2000上,提供的真正的可扩展的I/O模型是使用完成端口QCompletion PortQ的重叠I/O.完成端口---是一UWINDOWS内核对象。完成端口用于异步方式的重叠I/0情况下,当然重叠I/O不一定非使用完成端口? 可,q有讑֤内核对象、事件对象、告警I/0{。但是完成端口内部提供了U程池的理Q可以避免反复创建线E的开销Q同时可以根据CPU的个数灵zȝ军_ U程个数Q而且可以让减线E调度的ơ数从而提高性能其实cM于WSAAsyncSelect和select函数的机制更Ҏ(gu)兼容UnixQ但是难以实? 我们惌?#8220;扩展?#8221;。而且windows的完成端口机制在操作pȝ内部已经作了优化Q提供了更高的效率。所以,我们选择完成端口开始我们的服务器程序的 开发?br> 1、发h作不一定完成,pȝ会在完成的时候通知你,通过用户在完成端口上的等待,处理操作的结果。所以要有检查完成端口,取操作结果的U程。在完成端口 上守候的U程pȝ有优化,除非在执行的U程dQ不会有新的U程被激z,以此来减线E切换造成的性能代h(hun)。所以如果程序中没有太多的阻塞操作,没有必要 启动太多的线E,CPU数量的两倍,一般这h启动U程?br> 2、操作与相关数据的绑定方式:在提交数据的时候用户对数据打相应的标记Q记录操作的cdQ在用户处理操作l果的时候,通过查自己打的标记和pȝ的操作结果进行相应的处理?
3、操作返回的方式:一般操作完成后要通知E序q行后箋处理。但写操作可以不通知用户Q此时如果用户写操作不能马上完成Q写操作的相x据会被暂存到到非 交换~冲ZQ在操作完成的时候,pȝ会自动释攄冲区。此时发起完写操作,使用的内存就可以释放了。此时如果占用非交换~冲太多会ɾpȝ停止响应?br>
3、完成端口(Completion Ports Q相x据结构和创徏
    其实可以把完成端口看成系l维护的一个队列,操作pȝ把重叠IO操作完成的事仉知攑ֈ该队列里Q由于是暴露 “操作完成”的事仉知Q所以命名ؓ“完成端口”QCOmpletion PortsQ。一个socket被创建后Q可以在M时刻和一个完成端口联pv来?br> 完成端口相关最重要的是OVERLAPPED数据l构
typedef struct _OVERLAPPED {
    ULONG_PTR Internal;//被系l内部赋|用来表示pȝ状?
    ULONG_PTR InternalHigh;// 被系l内部赋|传输的字节数
    union {
        struct {
            DWORD Offset;//和OffsetHigh合成一?4位的整数Q用来表CZ文g头部的多字节开?
            DWORD OffsetHigh;//操作Q如果不是对文gI/O来操作,则必设定ؓ0
        };
        PVOID Pointer;
    };
    HANDLE hEvent;//如果不用,务必设?,否则误一个有效的Event句柄
} OVERLAPPED, *LPOVERLAPPED;

下面是异步方式用ReadFile的一个例?
OVERLAPPED Overlapped;
Overlapped.Offset=345;
Overlapped.OffsetHigh=0;
Overlapped.hEvent=0;
//假定其他参数都已l被初始?
ReadFile(hFile,buffer,sizeof(buffer),&dwNumBytesRead,&Overlapped);
q样完成了异步方式L件的操作Q然后ReadFile函数q回Q由操作pȝ做自q事情Q下面介l几个与OVERLAPPEDl构相关的函?
{待重叠I/0操作完成的函?
BOOL GetOverlappedResult (
HANDLE hFile,
LPOVERLAPPED lpOverlapped,//接受q回的重叠I/0l构
LPDWORD lpcbTransfer,//成功传输了多字节数
BOOL fWait //TRUE只有当操作完成才q回QFALSE直接q回Q如果操作没有完成,通过?/用GetLastError ( )函数会返回ERROR_IO_INCOMPLETE
);
宏HasOverlappedIoCompleted可以帮助我们试重叠I/0操作是否完成Q该宏对OVERLAPPEDl构的Internal成员q行了测试,查看是否{于STATUS_PENDING倹{?/p>

        一般来_一个应用程序可以创建多个工作线E来处理完成端口上的通知事g。工作线E的数量依赖于程序的具体需要。但是在理想的情况下Q应该对应一个CPU 创徏一个线E。因为在完成端口理想模型中,每个U程都可以从pȝ获得一?#8220;原子”性的旉片,轮番q行q检查完成端口,U程的切换是额外的开销。在实际开 发的时候,q要考虑q些U程是否牉|到其他堵塞操作的情况。如果某U程q行堵塞操作Q系l则其挂vQ让别的U程获得q行旉。因此,如果有这L(fng)情况Q? 可以多创建几个线E来量利用旉?br> 应用完成端口Q?br>     创徏完成端口Q完成端口是一个内核对象,使用时他L要和臛_一个有效的讑֤句柄q行兌Q完成端口是一个复杂的内核对象Q创建它的函数是Q?br> HANDLE CreateIoCompletionPort(
    IN HANDLE FileHandle,
    IN HANDLE ExistingCompletionPort,
    IN ULONG_PTR CompletionKey,
    IN DWORD NumberOfConcurrentThreads
    );

通常创徏工作分两步:
W一步,创徏一个新的完成端口内核对象,可以使用下面的函敎ͼ
       HANDLE CreateNewCompletionPort(DWORD dwNumberOfThreads)
{
          return CreateIoCompletionPort(INVALID_HANDLE_VALUE,NULL,NULL,dwNumberOfThreads);
};
      
W二步,刚创徏的完成端口和一个有效的讑֤句柄兌hQ可以用下面的函数Q?br>        bool AssicoateDeviceWithCompletionPort(HANDLE hCompPort,HANDLE hDevice,DWORD dwCompKey)
{
          HANDLE h=CreateIoCompletionPort(hDevice,hCompPort,dwCompKey,0);
          return h==hCompPort;
};
说明
1Q?CreateIoCompletionPort函数也可以一ơ性的既创建完成端口对象,又关联到一个有效的讑֤句柄
2Q?CompletionKey是一个可以自己定义的参数Q我们可以把一个结构的地址赋给它,然后在合适的时候取出来使用Q最好要保证l构里面的内存不是分配在栈上Q除非你有十分的把握内存会保留到你要使用的那一刅R?br> 3Q? NumberOfConcurrentThreads通常用来指定要允许同时运行的的线E的最大个数。通常我们指定?Q这L(fng)l会Ҏ(gu)CPU的个数来? 动确定。创建和兌的动作完成后Q系l会完成端口关联的讑֤句柄、完成键作ؓ一条纪录加入到q个完成端口的设备列表中。如果你有多个完成端口,׃有多 个对应的讑֤列表。如果设备句柄被关闭Q则表中自动删除该纪录?br>
4、完成端口线E的工作原理

完成端口可以帮助我们理U程池,但是U程池中的线E需要我们用_beginthreadex来创建,凭什么通知完成端口理我们的新U程呢?{案在函数GetQueuedCompletionStatus。该函数原型Q?
BOOL GetQueuedCompletionStatus(
    IN HANDLE CompletionPort,
    OUT LPDWORD lpNumberOfBytesTransferred,
    OUT PULONG_PTR lpCompletionKey,
    OUT LPOVERLAPPED *lpOverlapped,
    IN DWORD dwMilliseconds
);
q个函数试图从指定的完成端口的I/0完成队列中抽取纪录。只有当重叠I/O动作完成的时候,完成队列中才有纪录。凡是调用这个函数的U程被攑օ到完? 端口的等待线E队列中Q因此完成端口就可以在自qU程池中帮助我们l护q个U程。完成端口的I/0完成队列中存放了当重叠I/0完成的结?--- 一条纪录,该纪录拥有四个字D,前三就对应GetQueuedCompletionStatus函数???参数Q最后一个字D|错误信息 dwError。我们也可以通过调用PostQueudCompletionStatus模拟完成了一个重叠I/0操作?
当I/0完成队列中出CU录Q完成端口将会检查等待线E队列,该队列中的线E都是通过调用GetQueuedCompletionStatus函数使自 己加入队列的。等待线E队列很单,只是保存了这些线E的ID。完成端口会按照后进先出的原则将一个线E队列的ID攑օ到释攄E列表中Q同时该U程从 {待GetQueuedCompletionStatus函数q回的睡眠状态中变ؓ可调度状态等待CPU的调度。所以我们的U程要想成ؓ完成端口理的线 E,必要调用GetQueuedCompletionStatus函数。出于性能的优化,实际上完成端口还l护了一个暂停线E列表,具体l节可以参? 《Windows高~程指南》,我们现在知道的知识,已经_了? 完成端口U程间数据传递线E间传递数据最常用的办法是在_beginthreadex函数中将参数传递给U程函数Q或者用全局变量。但是完成端口还有自 q传递数据的Ҏ(gu)Q答案就在于CompletionKey和OVERLAPPED参数?br> CompletionKey被保存在完成端口的设备表中,是和讑֤句柄一一对应的,我们可以与讑֤句柄相关的数据保存到CompletionKey中, 或者将CompletionKey表示为结构指针,q样可以传递更加丰富的内容。这些内容只能在一开始关联完成端口和讑֤句柄的时候做Q因此不能在以后 动态改变?br> OVERLAPPED参数是在每次调用ReadFileq样的支持重叠I/0的函数时传递给完成端口的。我们可以看刎ͼ如果我们不是Ҏ(gu)件设备做操作Q该 l构的成员变量就Ҏ(gu)们几乎毫无作用。我们需要附加信息,可以创徏自己的结构,然后OVERLAPPEDl构变量作ؓ我们l构变量的第一个成员,然后? 递第一个成员变量的地址lReadFile函数。因为类型匹配,当然可以通过~译。当GetQueuedCompletionStatus函数q回Ӟ? 们可以获取到W一个成员变量的地址Q然后一个简单的强制转换Q我们就可以把它当作完整的自定义l构的指针用,q样可以传递很多附加的数据了。太好了Q? 只有一点要注意Q如果跨U程传递,h意将数据分配到堆上,q且接收端应该将数据用完后释放。我们通常需要将ReadFileq样的异步函数的所需要的~? 冲区攑ֈ我们自定义的l构中,q样当GetQueuedCompletionStatus被返回时Q我们的自定义结构的~冲区变量中存放了I/0操作? 数据。CompletionKey和OVERLAPPED参数Q都可以通过GetQueuedCompletionStatus函数获得?br> U程的安全退?br>        很多U程Z不止一ơ的执行异步数据处理Q需要用如下语?br> while (true)
{
       ......
       GetQueuedCompletionStatus(...);
        ......
}
那么如何退出呢Q答案就在于上面曾提到的PostQueudCompletionStatus函数Q我们可以用它发送一个自定义的包含了OVERLAPPED成员变量的结构地址Q里面包含一个状态变量,当状态变量ؓ退出标志时Q线E就执行清除动作然后退出?br>
5、Windows完成端口的实例代码:
DWORD WINAPI WorkerThread(LPVOID lpParam)
{
ULONG_PTR *PerHandleKey;
OVERLAPPED *Overlap;
OVERLAPPEDPLUS *OverlapPlus,
*newolp;
DWORD dwBytesXfered;
while (1)
{
ret = GetQueuedCompletionStatus(
hIocp,
&dwBytesXfered,
(PULONG_PTR)&PerHandleKey,
&Overlap,
INFINITE);
if (ret == 0)
{
// Operation failed
continue;
}
OverlapPlus = CONTAINING_RECORD(Overlap, OVERLAPPEDPLUS, ol);
switch (OverlapPlus->OpCode)
{
case OP_ACCEPT:
// Client socket is contained in OverlapPlus.sclient
// Add client to completion port
CreateIoCompletionPort(
(HANDLE)OverlapPlus->sclient,
hIocp,
(ULONG_PTR)0,
0);
// Need a new OVERLAPPEDPLUS structure
// for the newly accepted socket. Perhaps
// keep a look aside list of free structures.
newolp = AllocateOverlappedPlus();
if (!newolp)
{
// Error
}
newolp->s = OverlapPlus->sclient;
newolp->OpCode = OP_READ;
// This function divpares the data to be sent
PrepareSendBuffer(&newolp->wbuf);
ret = WSASend(
newolp->s,
&newolp->wbuf,
1,
&newolp->dwBytes,
0,
&newolp.ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
// Put structure in look aside list for later use
FreeOverlappedPlus(OverlapPlus);
// Signal accept thread to issue another AcceptEx
SetEvent(hAcceptThread);
break;
case OP_READ:
// Process the data read
// Repost the read if necessary, reusing the same
// receive buffer as before
memset(&OverlapPlus->ol, 0, sizeof(OVERLAPPED));
ret = WSARecv(
OverlapPlus->s,
&OverlapPlus->wbuf,
1,
&OverlapPlus->dwBytes,
&OverlapPlus->dwFlags,
&OverlapPlus->ol,
NULL);
if (ret == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
// Error
}
}
break;
case OP_WRITE:
// Process the data sent, etc.
break;
} // switch
} // while
} // WorkerThread

查看以上代码Q注意如果Overlapped操作立刻p|Q比如,q回SOCKET_ERROR或其他非WSA_IO_PENDING的错误)Q则 没有M完成通知旉会被攑ֈ完成端口队列里。反之,则一定有相应的通知旉被放到完成端口队列。更完善的关于Winsock的完成端口机Ӟ可以参? MSDN的Microsoft PlatFormSDKQ那里有完成端口的例子。访?a target="_blank">http://msdn.microsoft.com/library/techart/msdn_servrapp.htm可以获得更多信息?/p>

Linux的EPoll模型
Linux 2.6内核中提高网lI/O性能的新Ҏ(gu)-epoll I/O多\复用技术在比较多的TCP|络服务器中有用,x较多的用到select函数?br>
1、ؓ什么select落后
首先Q在Linux内核中,select所用到的FD_SET是有限的Q即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个敎ͼ在我用的2.6.15-25-386内核中,该值是1024Q搜索内核源代码得到Q?br> include/linux/posix_types.h:#define __FD_SETSIZE         1024
也就是说Q如果想要同时检?025个句柄的可读状态是不可能用select实现的。或者同时检?025个句柄的可写状态也是不可能的。其ơ,内核中实 现select是用轮询Ҏ(gu)Q即每次都会遍历所有FD_SET中的句柄Q显Ӟselect函数执行旉与FD_SET中的句柄个数有一个比例关p, 即select要检的句柄数越多就会越Ҏ(gu)。当Ӟ在前文中我ƈ没有提及pollҎ(gu)Q事实上用select的朋友一定也试过pollQ我个h觉得 select和poll大同异Q个人偏好于用select而已?/p>

2、内怸提高I(y)/O性能的新Ҏ(gu)epoll
epoll是什么?按照man手册的说法:是ؓ处理大批量句柄而作了改q的poll。要使用epoll只需要这三个pȝ调用Qepoll_create(2)Q?epoll_ctl(2)Q?epoll_wait(2)?br> 当然Q这不是2.6内核才有的,它是?.5.44内核中被引进?epoll(4) is a new API introduced in Linux kernel 2.5.44)

Linux2.6内核epoll介绍
先介l?本书《The Linux Networking Architecture--Design and Implementation of Network Protocols in the Linux Kernel》,?.4内核讲解Linux TCP/IP实现Q相当不?作ؓ一个现实世界中的实玎ͼ很多时候你必须作很多权衡,q时候参考一个久l考验的系l更有实际意义。D个例?linux? 怸sk_buffl构Zq求速度和安全,牺牲了部分内存,所以在发送TCP包的时候,无论应用层数据多?sk_buff最也?72的字?其实 对于socket应用层程序来_另外一本书《UNIX Network Programming Volume 1》意义更大一?2003q的时候,q本书出了最新的W?版本Q不q主要还是修订第2版本。其中第6章《I/O Multiplexing》是最重要的。Stevensl出了网lIO的基本模型。在q里最重要的莫q于select模型和Asynchronous I/O模型.从理Z_AIOg是最高效的,你的IO操作可以立即q回Q然后等待os告诉你IO操作完成。但是一直以来,如何实现没有一个完的? 案。最著名的windows完成端口实现的AIO,实际上也是内部用U程池实现的|了Q最后的l果是IO有个U程池,你应用也需要一个线E池...... 很多文档其实已经指出了这带来的线Econtext-switch带来的代仗在linux q_上,关于|络AIO一直是改动最多的地方Q?.4的年代就有很多AIO内核patch,最著名的应该算是SGI那个。但是一直到2.6内核发布Q网l? 模块的AIO一直没有进入稳定内核版?大部分都是用用L(fng)E模拟方法,在用了NPTL的linux上面其实和windows的完成端口基本上差不? ??.6内核所支持的AIOҎ(gu)盘的AIO---支持io_submit(),io_getevents()以及对Direct IO的支?是l过VFSpȝbuffer直接写硬盘,对于服务器在内存^Ex上有相当帮??br> 所以,剩下的select模型基本上就是我们在linux上面的唯一选择Q其实,如果加上no-block socket的配|,可以完成一??AIO的实玎ͼ只不q推动力在于你而不是os而已。不q传l的select/poll函数有着一些无法忍受的~? 点,所以改q一直是2.4-2.5开发版本内核的dQ包?dev/pollQrealtime signal{等。最l,Davide Libenzi开发的epollq入2.6内核成ؓ正式的解x?br>
3、epoll的优?/strong>
<1>支持一个进E打开大数目的socket描述W?FD)
select 最不能忍受的是一个进E所打开的FD是有一定限制的Q由FD_SETSIZE讄Q默认值是2048。对于那些需要支持的上万q接数目的IM服务器来说显 然太了。这时候你一是可以选择修改q个宏然后重新编译内核,不过资料也同时指样会带来|络效率的下降,二是可以选择多进E的解决Ҏ(gu)(传统? ApacheҎ(gu))Q不q虽然linux上面创徏q程的代h较小Q但仍旧是不可忽视的Q加上进E间数据同步q比不上U程间同步的高效Q所以也不是一U完 的Ҏ(gu)。不q? epoll则没有这个限Ӟ它所支持的FD上限是最大可以打开文g的数目,q个数字一般远大于2048,举个例子,?GB内存的机器上大约?0万左 叻I具体数目可以cat /proc/sys/fs/file-max察看,一般来说这个数目和pȝ内存关系很大?br> <2>IO效率不随FD数目增加而线性下?br> 传统的select/poll另一个致命弱点就是当你拥有一个很大的socket集合Q不q由于网lgӞM旉只有部分的socket?z跃"的, 但是select/poll每次调用都会U性扫描全部的集合Q导致效率呈现线性下降。但是epoll不存在这个问题,它只会对"z跃"的socketq行 操作---q是因ؓ在内核实Cepoll是根据每个fd上面的callback函数实现的。那么,只有"z跃"的socket才会d的去调用 callback函数Q其他idle状态socket则不会,在这点上Qepoll实现了一??AIOQ因时候推动力在os内核。在一? benchmark中,如果所有的socket基本上都是活跃的---比如一个高速LAN环境Qepollq不比select/poll有什么效率,? 反,如果q多使用epoll_ctl,效率相比q有E微的下降。但是一旦用idle connections模拟WAN环境,epoll的效率就q在select/poll之上了?br> <3>使用mmap加速内怸用户I间的消息传递?br> q点实际上涉及到epoll的具体实C。无论是select,pollq是epoll都需要内核把FD消息通知l用L(fng)_如何避免不必要的内存拯? 很重要,在这点上Qepoll是通过内核于用L(fng)间mmap同一块内存实现的。而如果你x一样从2.5内核关注epoll的话Q一定不会忘记手? mmapq一步的?br> <4>内核微调
q一点其实不epoll的优点了Q而是整个linuxq_的优炏V也怽可以怀疑linuxq_Q但是你无法回避linuxq_赋予你微调内核的能力? 比如Q内核TCP/IP协议栈用内存池理sk_buffl构Q那么可以在q行时期动态调整这个内存pool(skb_head_pool)的大?- - 通过echo XXXX>/proc/sys/net/core/hot_list_length完成。再比如listen函数的第2个参?TCP完成3ơ握? 的数据包队列长度)Q也可以Ҏ(gu)你^台内存大动态调整。更甚至在一个数据包面数目巨大但同时每个数据包本w大却很小的特D系l上试最新的NAPI|? 卡驱动架构?br> 4、epoll的工作模?br> 令h高兴的是Q?.6内核的epoll比其2.5开发版本的/dev/epollz了许多Q所以,大部分情况下Q强大的东西往往是简单的。唯一有点ȝ是epoll?U工作方?LT和ET?br> LT(level triggered)是缺省的工作方式Qƈ且同时支持block和no-block socket.在这U做法中Q内核告诉你一个文件描q符是否qA了,然后你可以对q个qA的fdq行IO操作。如果你不作M操作Q内核还是会l箋通知? 的,所以,q种模式~程出错误可能性要一炏V传l的select/poll都是q种模型的代表.
ET (edge-triggered)是高速工作方式,只支持no-block socket。在q种模式下,当描q符从未qA变ؓqAӞ内核通过epoll告诉你。然后它会假设你知道文g描述W已l就l,q且不会再ؓ那个文g描述 W发送更多的qA通知Q直C做了某些操作D那个文g描述W不再ؓqA状态了(比如Q你在发送,接收或者接收请求,或者发送接收的数据于一定量时导? 了一个EWOULDBLOCK 错误Q。但是请注意Q如果一直不对这个fd作IO操作(从而导致它再次变成未就l?Q内怸会发送更多的通知(only once),不过在TCP协议中,ET模式的加速效用仍需要更多的benchmark认?br> epoll只有epoll_create,epoll_ctl,epoll_wait 3个系l调用,具体用法请参?a target="_blank">http://www.xmailserver.org/linux-patches/nio-improve.html Q在http://www.kegel.com/rn/也有一个完整的例子Q大家一看就知道如何使用?br> Leader/follower模式U程pool实现Q以及和epoll的配合?br>
5?epoll的用方?/strong>
    首先通过create_epoll(int maxfds)来创Z个epoll的句柄,其中maxfdsZepoll所支持的最大句柄数。这个函Cq回一个新的epoll句柄Q之后的所有操? 通过q个句柄来进行操作。在用完之后Q记得用close()来关闭这个创建出来的epoll句柄? 之后在你的网l主循环里面Q每一帧的调用epoll_wait(int epfd, epoll_event events, int max events, int timeout)来查询所有的|络接口Q看哪一个可以读Q哪一个可以写了。基本的语法为:
nfds = epoll_wait(kdpfd, events, maxevents, -1);
其中kdpfd为用epoll_create创徏之后的句柄,events是一个epoll_event*的指针,当epoll_waitq个函数操作? 功之后,epoll_events里面储存所有的d事g。max_events是当前需要监听的所有socket句柄数。最后一个timeout? epoll_wait的超Ӟ?的时候表C马上返回,?1的时候表CZ直等下去Q直到有事g范围QؓL正整数的时候表C等q么长的旉Q如果一直没 有事Ӟ则范围。一般如果网l主循环是单独的U程的话Q可以用-1来等Q这样可以保证一些效率,如果是和主逻辑在同一个线E的话,则可以用0来保证主循环 的效率?/p>

epoll_wait范围之后应该是一个@环,遍利所有的事gQ?
for(n = 0; n < nfds; ++n) {
                if(events[n].data.fd == listener) { //如果是主socket的事件的话,则表C有新连接进入了Q进行新q接的处理?
                    client = accept(listener, (struct sockaddr *) &local,
                                    &addrlen);
                    if(client < 0){
                        perror("accept");
                        continue;
                    }
                    setnonblocking(client); // 新q接|于非阻塞模?
                    ev.events = EPOLLIN | EPOLLET; // q且新q接也加入EPOLL的监听队列?
注意Q这里的参数EPOLLIN | EPOLLETq没有设|对写socket的监听,如果有写操作的话Q这个时候epoll是不会返回事件的Q如果要对写操作也监听的话,应该是EPOLLIN | EPOLLOUT | EPOLLET
                    ev.data.fd = client;
                    if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, client, &ev) < 0) {
// 讄好event之后Q将q个新的event通过epoll_ctl加入到epoll的监听队列里面,q里用EPOLL_CTL_ADD来加一个新? epoll事gQ通过EPOLL_CTL_DEL来减一个epoll事gQ通过EPOLL_CTL_MOD来改变一个事件的监听方式?
                        fprintf(stderr, "epoll set insertion error: fd=%d0,
                                client);
                        return -1;
                    }
                }
                else // 如果不是主socket的事件的话,则代表是一个用户socket的事Ӟ则来处理q个用户socket的事情,比如说read(fd,xxx)之类的,或者一些其他的处理?
                    do_use_fd(events[n].data.fd);
}

对,epoll的操作就q么单,d不过4个APIQepoll_create, epoll_ctl, epoll_wait和close?
如果(zhn)对epoll的效率还不太了解Q请参考我之前关于|络游戏的网l编E等相关的文章?/p>


以前公司的服务器都是使用HTTPq接Q但是这L(fng)话,在手机目前的|络情况下不但显得速度较慢Q而且不稳定。因此大家一致同意用SOCKET来进行连 接。虽然用SOCKET之后Q对于用L(fng)费用可能会增?׃是用了CMNET而非CMWAP)Q但是,U着用户体验至上的原则,怿大家q是能够接受 ?希望那些玩家月末收到帐单不后能够保持克制...)?br> q次的服务器设计中,最重要的一个突_是用了EPOLL模型Q虽然对之也是一知半解,但是既然在各大PC|游中已l经q了如此严酷的考验Q相信他不会让我们失望,使用后的l果Q确实也是表现相当不错。在q里Q我q是主要大致介绍一下这个模型的l构?br> 6、Linux下EPOll~程实例
EPOLL模型g只有一U格式,所以大家只要参考我下面的代码,p够对EPOLL有所了解了,代码的解释都已经在注释中Q?/p>

while (TRUE)
{
int nfds = epoll_wait (m_epoll_fd, m_events, MAX_EVENTS, EPOLL_TIME_OUT);//{待EPOLL旉的发生,相当于监听,至于相关的端口,需要在初始化EPOLL的时候绑定?br> if (nfds <= 0)
continue;
m_bOnTimeChecking = FALSE;
G_CurTime = time(NULL);
for (int i=0; i
{
try
{
if (m_events.data.fd == m_listen_http_fd)//如果新监到一个HTTP用户q接到绑定的HTTP端口Q徏立新的连接。由于我们新采用了SOCKETq接Q所以基本没用?br> {
OnAcceptHttpEpoll ();
}
else if (m_events.data.fd == m_listen_sock_fd)//如果新监到一个SOCKET用户q接Cl定的SOCKET端口Q徏立新的连接?br> {
OnAcceptSockEpoll ();
}
else if (m_events.events & EPOLLIN)//如果是已l连接的用户Qƈ且收到数据,那么q行d?br> {
OnReadEpoll (i);
}

OnWriteEpoll (i);//查看当前的活动连接是否有需要写出的数据?br> }
catch (int)
{
PRINTF ("CATCH捕获错误\n");
continue;
}
}
m_bOnTimeChecking = TRUE;
OnTimer ();//q行一些定时的操作Q主要就是删除一些短U用L(fng)?br> }
其实EPOLL的精华,也就是上q的几段短短的代码,看来时代真的不同了,以前如何接受大量用户q接的问题,现在却被如此L的搞定,真是让h不得不感叹,对哪?/p>
ȝ
Windows完成端口与Linux epoll技术方案是q?个^C实现异步IO和设计开发一个大定wQ具可扩展性的winsockE序指服务程序的很好的选择Q本文对q?中技术的实现原理和实际的使用Ҏ(gu)做了一个详l的介绍

]]>
linux pȝ查用命o?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2010/08/19/123926.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Thu, 19 Aug 2010 01:50:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2010/08/19/123926.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/123926.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2010/08/19/123926.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/123926.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/123926.html</trackback:ping><description><![CDATA[<pre>http://www.pixelbeat.org/cmdline_zh_CN.html<br><br># uname -a # 查看内核/操作pȝ/CPU信息<br># head -n 1 /etc/issue # 查看操作pȝ版本<br># cat /proc/cpuinfo # 查看CPU信息<br># hostname # 查看计算机名<br># lspci -tv # 列出所有PCI讑֤<br># lsusb -tv # 列出所有USB讑֤<br># lsmod # 列出加蝲的内核模?br># env # 查看环境变量<br><br># free -m # 查看内存使用量和交换Z用量<br># df -h # 查看各分Z用情?br># du -sh <目录?gt; # 查看指定目录的大?br># grep MemTotal /proc/meminfo # 查看内存总量<br># grep MemFree /proc/meminfo # 查看I闲内存?br># uptime # 查看pȝq行旉、用h、负?br># cat /proc/loadavg # 查看pȝ负蝲<br><br># mount | column -t # 查看挂接的分区状?br># fdisk -l # 查看所有分?br># swapon -s # 查看所有交换分?br># hdparm -i /dev/hda # 查看盘参数(仅适用于IDE讑֤)<br># dmesg | grep IDE # 查看启动时IDE讑֤状?br><br># ifconfig # 查看所有网l接口的属?br># iptables -L # 查看防火墙设|?br># route -n # 查看路由?br># netstat -lntp # 查看所有监听端?br># netstat -antp # 查看所有已l徏立的q接<br># netstat -s # 查看|络l计信息<br><br># ps -ef # 查看所有进E?br># top # 实时昄q程状?br><br># w # 查看zd用户<br># id <用户?gt; # 查看指定用户信息<br># last # 查看用户d日志<br># cut -d: -f1 /etc/passwd # 查看pȝ所有用?br># cut -d: -f1 /etc/group # 查看pȝ所有组<br># crontab -l # 查看当前用户的计划Q?br><br># chkconfig --list # 列出所有系l服?br># chkconfig --list | grep on # 列出所有启动的pȝ服务<br></pre><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/123926.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2010-08-19 09:50 <a href="http://www.shnenglu.com/guojingjia2006/archive/2010/08/19/123926.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux 内核~译http://www.shnenglu.com/guojingjia2006/archive/2010/08/12/123236.html果?/dc:creator>果?/author>Thu, 12 Aug 2010 10:46:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/12/123236.htmlhttp://www.shnenglu.com/guojingjia2006/comments/123236.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/12/123236.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/123236.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/123236.htmllibncurses5-dev
2.如果以前~译q,现执行make mrproper清理
3.make menuconfig  | make xconfig | make config| make oldconfig(已经存在.config)
(可以修改makefile,携带自己信息,~译出来的内?修改以后原来的模块要重新~译)
4.make dep(建立模块依赖)

(.config可以?boot/config-xxx copyq来Q可以先试下)
make
make modules
make modules_install
make install
////////////////////////////////////////
具体错误提示见最后面

1.make menuconfig
解决Ҏ(gu)Qsudo apt-get install libncurses5-devQubuntuQ其他的发行版找到对应的包就?br> 2.make xconfig
解决办法 Qsudo apt-get install libqt3-mt-dev
3. make gconfig
解决办法Q?apt-get install libglade2-dev


]]>
tq2440板子上的W一个运行程?/title><link>http://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123055.html</link><dc:creator>果?/dc:creator><author>果?/author><pubDate>Wed, 11 Aug 2010 05:03:00 GMT</pubDate><guid>http://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123055.html</guid><wfw:comment>http://www.shnenglu.com/guojingjia2006/comments/123055.html</wfw:comment><comments>http://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/guojingjia2006/comments/commentRss/123055.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/guojingjia2006/services/trackbacks/123055.html</trackback:ping><description><![CDATA[拿到板子3天了Q之间看了tq2440的用手册,和linux下的~译视频,感觉挺好的,于是开始了自己的第一个arm板上的程?聊天E序<br><br>q行效果Q?br><img alt="" src="http://www.shnenglu.com/images/cppblog_com/guojingjia2006/arm.jpg" height="460" width="819"><br><br>左边是tq2440板子的终端,双是win7下的控制収ͼarm上的linux作ؓ服务器,win7客户?自己前几天写的一个windows-linux跨^台的socketl于跑v来了?)<br><br>下面说下自己从搭建到q行的整个流E:<br>1.先跑裸机E序吧,我就跑了那个test的,nor flash模式下直接把tq2440_test.bin烧写q去Q那个bin我没扑ֈQ所以自q译了。裸机程序玩完后Q就可以玩linux或wince了?br>2.完后烧写linuxpȝQ因为tq光盘里附带了embedSky的编译完整的linux bin.所以推荐先用这个,按用手册来?烧写在nor模式下进行,完成后,切换到nand 模式Q进入系l?br>3.之后Q我不知道怎么在板子的linux上跑自己的程序,完了我看了光盘的linux资源下的linux~译视频Q推荐先看这几个Q他教你怎么在linux上编译uboot,内核==,~译出来的当然在板子上运行的Q所以首先你的搭建好交叉~译环境,embedSky 附带了一个交叉编译器的,可以直接用他的,在linuxUL手册中有介绍~译自己的交叉编译器的,先用q个吧。编译好后,配置完系l环境变量,有了arm-linux-gcc,arm-linux-g++了?br>4.eclipse下配|编译选项Q在目属性里gcc,g++,link的command前面加上arm-linux,q样~译出来的程序就能在arm上跑了?br>5.~译完后Q怎么弄到板子上呢。我也比较困惑,因ؓ自己也没弄过Q所以还得看手册Q现在我知道有两U方式可以,W一个就是开发板上有usb的接口,你将自己~译完的E序弄到usb里,完了usb挂蝲到l(f)inux的某个目录下Q拷贝到q行目录p了,tq2440的默认的目录是在/sbin下的Q第二种是用nfs方式Q先在pc linux端装nfs服务Q完了可以用|络方式pc端的nfs讄的共享文件夹挂蝲到板子上的linux。之后就可以直接q行了?br><br>上面是自己的从完全不懂得到能跑自己的程序的一个流E。努力,l箋自己的嵌入式之旅?br><br><br><img src ="http://www.shnenglu.com/guojingjia2006/aggbug/123055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/guojingjia2006/" target="_blank">果?/a> 2010-08-11 13:03 <a href="http://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>nfs --- 开发板挂蝲ubuntu 10.04 目录http://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123031.html果?/dc:creator>果?/author>Wed, 11 Aug 2010 02:16:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123031.htmlhttp://www.shnenglu.com/guojingjia2006/comments/123031.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/11/123031.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/123031.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/123031.html

1  NFS安装

nfs原理是通过|络Q将q程L׃n的文件系l,挂蝲到本机?a title="Ubuntu">Ubuntu 10.04上默认是没有安装NFS服务器的Q首先要安装NFS服务E序Q?/p>

#  sudo apt-get install nfs-kernel-server

(安装nfs-kernel-serverӞapt会自动安装nfs-common和portmapQ?q样Q宿Lq当于NFS Server?!--iwms_ad_begin-->


2   宿主机NFS的配|?/p>

2.1  修改配置文g/etc/exports

在终端下?  vim  /etc/exports打开exports文g?/p>

如果你没有配|过q个文g的话此文件应该是I的。在开始部分写?/p>

/home   *(rw,sync,no_root_squash)

/home  -- 与客h׃n的目录;

*        -- 表示允许L用户使用Q也可以使用具体IPQ?/p>

(rw,sync,no_root_squash)  -- rwQ挂载此目录的客hҎ(gu)目录有读写权利;

syncQ?#8230;…Q?/p>

no_root_squashQ挂载此目录的客h享有Lroot的权利;

我是主机的根目录设|ؓ׃n目录  /  *(rw,sync,no_root_squash)

OKQ保存,退出?/p>

修改完成之后输入Q?  exportfs –rv来配置文g生效

2.2   配置宿主机的IP

配置宿主机的IPQ在命o行中输入 # ifconfig   来查看本机的IP地址。如果没有设|,可以用命?# ifconfig eth0 192.168.0.18 来设|IP。其中的IP地址可以Ҏ(gu)具体情况来设定。设定完成后在通过ifconfig来再ơ查看是否已l设定成功?/p>

2.3   启动宿主机NFS服务

安装完NFS服务后就可以通过 #  /etc/init.d/nfs-kernel-server restartQ?etc/init.d/nfs-kernel-server startQ来重新开启网l文件系l服务,以便后面的开发板挂蝲。也可以通过#  /etc/init.d/nfs-kernel-server stop来停止?/p>

3   目标板的挂蝲操作

l你的目标机上电(sh)Q目标板上的Linux操作pȝh以后Q在PCZUbuntu操作pȝ上打开minicomQ通过串口向目标板发送shell命o?/p>

像主机操作一P首先查目标板Q客hQ的IP是否与宿L的IP再同一个地址D上Q否则用上面用过的命令进行检查和讄本地IP?/p>

讄完IP之后可以ping一下检查网卡、网U是否连接正?/p>

既在minicom中输? ping 192.168.0.18  Q主机IP地址Q连接成功会不断的打C息?/p>

接下来就是在开发板上进行挂载mount

mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.0.121:/Lnfs目录 /挂蝲路径


其中Q后是客h挂蝲的共享目录; /mnt是开发板的挂载目?/p>

OKQ挂在完成?/p>

通过

# cd  /mnt

# ls

可以发现L的根目录被挂载进了开发板mnt目录中?/p>

如果你想取消挂在可以使用命o# umount  /mnt可以了?/p>


-------------------------------------------


nfs:server is not responding,still trying 原因与解x?/p>


mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.0.121:/Lnfs目录 /挂蝲路径


tcp挂蝲Q不然很可能出现服务不响应,nfs默认是udp传输。。(q个把我郁闷了一天)



]]>ubuntu 10.04 root 登陆 (?http://www.shnenglu.com/guojingjia2006/archive/2010/08/10/122944.html果?/dc:creator>果?/author>Tue, 10 Aug 2010 08:26:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/10/122944.htmlhttp://www.shnenglu.com/guojingjia2006/comments/122944.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/10/122944.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/122944.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/122944.html安装后,root用户默认是被锁定了的Q不允许dQ也不允?#8220;su”? root。有q是个不好的实践Q特别是对于服务器来说。我觉得对于桌面用户来说Q这样安全性更高一些,是应该的Q但对于服务器可以设|成“允许 su 到rootQ但不允许root用户直接d”。而我Z开发时的方便,则在桌面和服务器上都采用q种方式?/p>

允许 su ?root

非常单,下面是设|的Ҏ(gu)Q?/p>

me@tipfoo:~$ sudo passwd root

Password: <--- 输入安装旉个用L(fng)密码

Enter new UNIX password: <--- 新的Root用户密码

Retype new UNIX password: <--- 重复新的Root用户密码

passwdQ已成功更新密码

允许rootd

如果要允许rootdQ不推荐Q,则这h作:

me@tipfoo:~$ gksu /usr/sbin/gdmsetup

Q或者用桌面菜单:pȝQ系l管理>dH口Q?/p>

?#8220;安全”选项,选择“允许本地理员登?#8221;?/p>

注:q一步依赖上一?/p>

在登录时直接昄root用户Q?/p>

在root用户下gedit /etc/gdm/gdm.schemas

<schema>
      <key>greeter/Include</key>
      <signature>s</signature>
      <default></default>
    </schema>

    <schema>
      <key>greeter/Exclude</key>
      <signature>s</signature>
            <default>bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pvm,rpm,nfsnobody,pcap</default>
   </schema>

把下边schema中的rootLQ放C面的那个里面Q可以在登陆框里看到root?/p>

不输入密码直接登?/p>

在论坛上也看见有人抱怨,家中的Ubuntu不能像Window$那样──不用输入密码p d。其实同栯做到Q?/p>

在上一步的“安全”选项中Q勾选:

“启用自动d”Q?#8220;用户”选择Q如Q?#8220;me”Q?

注意Q公q的计机千万不能q么讄Q?/p>


SSHdq程服务?/p>

如果q程服务器只允许root用户SSH到服务器Ӟ在Ubuntu下,必须“su 到root”用户才能d成功(具体是看服务器端的配|??/p>


首先Q复制密钥到“/root/.ssh/”目录Q?/p>

me@tipfoo:~$ su

Password:

root@tipfoo:/home/me# chmod 600 -R /root/.ssh/

root@tipfoo:/home/me# ssh -p 27482 11.22.33.44

Enter passphrase for key '/root/.ssh/id_rsa':

Last login: Thu Jun 21 14:29:00 2007 from 11.22.33.45

修改开始菜单:直接在Ubuntul端输入命oalacarte。可以Q意增、改、隐藏、显C单,但无法删除菜单,即拥有root权限

]]>
win7 下恢?ubuntu 10.04(?http://www.shnenglu.com/guojingjia2006/archive/2010/08/10/122924.html果?/dc:creator>果?/author>Tue, 10 Aug 2010 05:29:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/10/122924.htmlhttp://www.shnenglu.com/guojingjia2006/comments/122924.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/10/122924.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/122924.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/122924.html1. Win7与Ubuntu的安装顺序。如果你惌q两个系l,那么先装Win7Q再装UbuntuQ就不会出现我上面的问题Q可能是Grub比较亲和的缘故吧Q呵?..

2. 如果出现了我上面的那U情况,用Grub4Dos来解决你的问题。去我的资源 里下载吧。注意,Grub4Dos文g夹下面有3个文Ӟg2ldrQg2ldr.mbr和隐藏的boot.ini。把q?个文件复制到Win7的主盘下面,然后重启q入Ubuntu之后Q输入以下命令:

  1. /* 
  2. sudo grub-install /dev/sda 
  3. sudo update-grub 
  4. */  

然后Q再回到Win7中把Grub4Dos删除掉。这样重启就搞定了!

3. 如果你出C上面的问题,用live CD安装了GrubQ开机出CGrub的命令提C符界面。输入以下命令,q入Win7Q?/span>

  1. /* 
  2. root noverify (hd0, 0) 
  3. chainloader +1 
  4. boot 
  5. */  

然后下蝲mbrFix工具修复mbrQ然后把mbrFix攑ֈC盘根目录下,然后打开cmdQ切到C盘下面,q行q个命oQ?/span>

  1. /*  
  2. mbrfix /drive 0 fixmbr  
  3. */  

q样那个讨厌的Grub命o提示界面消׃。然后,按照W?步执行就好了?/span>


好了Q这样Win7和Ubuntu都利出现在开Z后的Grub列表 中了:) 最后,说下甌联想免费Win7升盘的事情。前D|_各个OEM厂商都给用户一个win7的免费升U计划,包括HPQDellq有联想{厂家。于是, 大家都去甌了,搞笑的是Q申L(fng)时候,用户完全可以用虚假信息,以每张不?0元的h“骗取”一张Win7旗舰版的安装光盘和厂安动盘。但是,后来 q个事儿让MS知道了,MS大怒。所以,后来用户如果要申L(fng)话,需要提供购买笔记本或者台式机的证明,而且必须满MS的升U规定。我是在MS大怒之 后,不识相地ȝL(fng)Q结果收C联想否决的emailQ说我的黑出厂是安装最低版的VistaQ所以无法申请Win7光盘Q因为当时在国买的时候, 高版本的Vista要加不少钱,我没?)?/span>

http://www.shnenglu.com/Files/guojingjia2006/Grub4Dos_mbrFix.rar



]]>
关于Uboot的NOR boot 或NAND boot问题---ZTQ2440Q{?http://www.shnenglu.com/guojingjia2006/archive/2010/08/09/122771.html果?/dc:creator>果?/author>Mon, 09 Aug 2010 06:04:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/09/122771.htmlhttp://www.shnenglu.com/guojingjia2006/comments/122771.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/09/122771.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/122771.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/122771.html又从uboot开始弄Q以前移植了uboot1.3.1Q由于太多匆忙,没有q多的注重细节,今天发现了一个以前忽略的问题Q就是开发板自己判断是从何种flash介质启动的问题,首先说一下ؓ什么要判断是哪Uflash介质启动Q因样就没有必要区分nor bootq是nand boot的bin文g了,bin文g烧到nor和nand都可以正常启动开发板?/p>

在网上看了下别h关于nor boot或nand boot 的文章,发现Tekkaman Ninja写的文章非常好,很值得推荐Q附上地址Q以便以后查找:http://blog.chinaunix.net/u1/34474/showart.php?id=2085212

下面来分析下天嵌公司的ubootQ据Tekkaman Ninja_天嵌的uboot是从openJTAG的uboot 借鉴q来的,q个我们姑且不管他。脓(chung)下天嵌TQ2440的uboot中关于启动判断的代码Q?/p>

int bBootFrmNORFlash(void)
{
volatile unsigned int *pdw = (volatile unsigned int *)0;
unsigned int dwVal;

dwVal = *pdw;
*pdw = 0x12345678;
if (*pdw != 0x12345678)
{
return 1;
}
else
{
*pdw = dwVal;
return 0;
}
}

q段代码的思想是这L(fng)Q无论是从NOR Flashq是从NAND Flash启动Q地址0处ؓ指o"b Reset", 机器码ؓ0xEA00000BQ对于从NAND Flash启动的情况,其开?KB的代码会复制到CPU内部4K内存中,对于从NOR Flash启动的情况,NOR Flash的开始地址即ؓ0。对于NOR FlashQ必通过一定的命o序列才能写数据,所以可以根据这点差别来分L是从NAND Flashq是NOR Flash启动:向地址0写入一个数据,然后d来,如果没有改变的话是NOR Flash?/p>

我们在深入的分析下,首先看下nand boot 和nor boot 时物理地址分配情况Q?/p>




从NAND闪存启动U-BOOT的设计思\

如果s3c2440被配|成从NAND闪存启动,上电(sh)后,s3c2440的NAND闪存控制器会自动把NAND闪存 中的?K数据搬移到内部RAM? q把0x00000000讄为内部RAM的v始地址, CPU从内部RAM?x00000000位置开始启动。因此要把最核心的启动程序放在NAND闪存的前4K中?/p>

当nor bootӞ0x0000_0000是nor flash的v始地址Q用语句*pdw = 0x12345678; ?x0000_0000处写0x12345678Q是没用的,因ؓ对于NOR FlashQ必通过一定的命o序列才能写数据,所?pdw中存的数据仍然是"b Reset",但当nand flash启动Ӟcpu内部?KBbootSRAM被映到0x0000_0000开始的地址处,norflashq时无效了,q时用语?pdw = 0x12345678; ?x0000_0000处写0x12345678Ӟ0x12345678会被写入Q因是对内存的操作,不需要指令序列等Q所以一旦发现写入和d 的数据一致时Q则可判断是nand bootQ这时一定要?x0000_0000处的数据q原Q用*pdw = dwVal; q句?/p>

明天看看Q得重新ULuboot了,好好研究研究Quboot很高深啊Q!

http://blog.sina.com.cn/s/blog_52009a100100hcv1.html



]]>
vim-pd-配置目录http://www.shnenglu.com/guojingjia2006/archive/2010/08/04/122231.html果?/dc:creator>果?/author>Wed, 04 Aug 2010 10:37:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2010/08/04/122231.htmlhttp://www.shnenglu.com/guojingjia2006/comments/122231.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2010/08/04/122231.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/122231.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/122231.html一直对vim的配|目录很confusedQ我发现它的配置路径有好几个Q除了home下面?vimQ还?usr/share/vim/vim72?usr/share/vimQ三个目录到底哪个才是vimd的\径呢Q?/p>

l过我的几番试和小Google了一下,l于得到了结果。原来vim?#8220;runtimepath”共有三个Q就是我上面所说的Q但是vimdq三个\径是有顺序的?/p>

首先d的目录就?home/.vim,如果vimdC该目录下的syntax或者pluginQ就不会再去dusr目录了?/p>

其次d的目录是/usr/share/vim, 最后才d/usr/share/vim/vim72?/p>

我想vim的设计者这栯计是有原因的Q当前登录用L(fng)个性化讑֮肯定是优先考虑的,?usr/share/vim是给所有用户用的讄。所 以,对vim的设|和修改q是攑֜home目录比较好,一斚w不会破坏pȝ原有讑֮Q可以随时恢复,另一斚w的好处我没有完全弄明白,具体请参见这位老兄 的文?a target="_blank">http://stackoverflow.com/questions/1384582/vim-linux-ubuntu-directory-location-vim-syntax

其实vim的documentation已经有很详细的描qCQ在vim的command模式中输?help ‘runtimepath’ 可以看到详尽的解释?/p>

]]>
kubuntu 下ip地址和网兌|问??)http://www.shnenglu.com/guojingjia2006/archive/2009/04/10/79453.html果?/dc:creator>果?/author>Fri, 10 Apr 2009 02:56:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2009/04/10/79453.htmlhttp://www.shnenglu.com/guojingjia2006/comments/79453.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2009/04/10/79453.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/79453.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/79453.html

]]>
Linux下Netbeans字体解决(?http://www.shnenglu.com/guojingjia2006/archive/2009/04/08/79283.html果?/dc:creator>果?/author>Wed, 08 Apr 2009 09:17:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2009/04/08/79283.htmlhttp://www.shnenglu.com/guojingjia2006/comments/79283.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2009/04/08/79283.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/79283.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/79283.html

]]>
amarok音乐标题q解决http://www.shnenglu.com/guojingjia2006/archive/2009/04/08/79241.html果?/dc:creator>果?/author>Wed, 08 Apr 2009 03:10:00 GMThttp://www.shnenglu.com/guojingjia2006/archive/2009/04/08/79241.htmlhttp://www.shnenglu.com/guojingjia2006/comments/79241.htmlhttp://www.shnenglu.com/guojingjia2006/archive/2009/04/08/79241.html#Feedback0http://www.shnenglu.com/guojingjia2006/comments/commentRss/79241.htmlhttp://www.shnenglu.com/guojingjia2006/services/trackbacks/79241.html

]]>
ݺɫۺվþþþþþ| Ưޱ˾þþƷ| þùƷþþƷ| ˾þþƷӰԺ| Ʒþþþþ벻| պ޹ۺϾþþ| Ʒþþþþþþþþþþþþ| Ʒһþþþþþվ| þþƷҹҹҹҹҹþ| þAv뾫Ʒϵ| þ99ۺϾƷ| þþþһƷɫav| ˾þô߽| ĻþþƷˮ| ŷþ18| 97þù¶Ʒ| ˳ɾƷþþþ| ξþ99ƷþþþþС˵ | þˬˬƬAV鷳| ˳ɵӰվþ| ĻƷþ| þˬһ | þ91ƷۺϹҳ| Ʒ99þaaaһëƬ| þۺϳDž| ޾Ʒþþþþò| һAvëƬþþƷ| þˬˬAV| þһ| ˾þAV| ۿ ۺϾþþþùɫ ŷ һ| 99þֻоƷ| þþù׾Ʒ| Ʒһþ| ƷȾþþø| ҹƷþþþþ˳| ҹƷþþþþ99| 99þۺϹƷ| þۺϾþۺ| ھƷþ޻| þþþavӰ|