整型(int)数字溢出在程序和数据库设计中的考虑 (PHP心得)
发布于 2009-07-02 20:13 阅读:100613 评论:0 标签: 溢出

    在数据库设计和程序中需要考虑数字的范围,否则可能导致一些问题。主要是考虑溢出的问题,比如如果数据库中有一个整型的数字字段,里面的数据可能随着业务的增长而膨胀,而这个数字有可能会超出列属性的范围,也就是溢出,与此同时,程序中也需要处理这个日益庞大的数字,如果其中有运算、数字类型的逻辑比较等等,也可能导致某天就出现了异常。而这种错误又是难以发现的。

    以下试以整型(int)抛砖引玉:

    一:MySQL5

    以MySQL5版本为例,大多数管理员可能把自增数字、或者其它应用数字字段的列属性设置为int类型,int占用4个字节,而int又分为无符号型和有符号性。对于无符号型的范围是0 到 4294967295;有符号型的范围是-2147483648 到 2147483647。参考资料可见mysql手册:11.2. 数值类型.

    当要在一个数值列内保存一个超出该列允许范围的值时,MySQL的操作取决于此时有效的SQL模式。如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。但是,如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。请参见mysql手册5.3.2节:“SQL服务器模式”。

    如果INT列是UNSIGNED,列范围的大小相同,但其端点会变为到0和4294967295。如果你试图保存-9999999999和9999999999,以非严格模式保存到列中的值是0和4294967296。

    如果在浮点或定点列中分配的值超过指定(或默认)精度和标度规定的范围,MySQL以非严格模式保存表示范围相应端点的值。

    当MySQL没有工作在严格模式时,对于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT语句,由于裁剪发生的转换将报告为警告。当MySQL工作在严格模式时,这些语句将失败,并且部分或全部值不会插入或更改,取决于是否表为事务表和其它因素。详情参见mysql手册5.3.2节:“SQL服务器模式”。

    二:php5:
 
    1:整型数的字长和平台有关,PHP 不支持无符号整数。
    2:如果给定的一个数超出了 integer 的范围,将会被解释为 float。同样如果执行的运算结果超出了 integer 范围,也会返回 float。如果在程序中有对数字类型做比较,可能会产生问题。
    3:可以查看PHP_INT_SIZE、PHP_INT_MAX,以确定整数的范围。
 
    以下列子可供参考:
 
    在32位服务器下:

以下是代码片段:
[shengting@localhost ~]$ php -r "echo PHP_INT_SIZE;"
4
[shengting@localhost ~]$ php -r "echo PHP_INT_MAX;"
2147483647
[shengting@localhost ~]$ php -r "var_dump(2147483647);"
int(2147483647)
[shengting@localhost ~]$ php -r "var_dump(2147483648);"
float(2147483648)
[shengting@localhost ~]$ php -r "var_dump(-2147483647);"
int(-2147483647)
[shengting@localhost ~]$ php -r "var_dump(-2147483648);"
float(-2147483648)
[shengting@localhost ~]$ php -r "var_dump(4294967295);"
float(4294967295)
[shengting@localhost ~]$ php -r "var_dump(4294967296);"
float(4294967296)


    在64位服务器下:
 

以下是代码片段:
[root@login shengting]# php -r "echo PHP_INT_SIZE;"
8
[root@login shengting]# php -r "echo PHP_INT_MAX;"
9223372036854775807
[root@login shengting]# php -r "var_dump(2147483647);"
int(2147483647)
[root@login shengting]# php -r "var_dump(2147483648);"
int(2147483648)
[root@login shengting]# php -r "var_dump(-2147483647);"
int(-2147483647)
[root@login shengting]# php -r "var_dump(-2147483648);"
int(-2147483648)
[root@login shengting]# php -r "var_dump(4294967295);"
int(4294967295)
[root@login shengting]# php -r "var_dump(4294967296);"
int(4294967296)

    三:C/C++
 
    对C/C++也存在有符号和无符号类型的问题。
 
    对于32位系统,如果使用有符号int、long来定义变量保存唯一号就可能出现溢出,并出现上述问题。

    对于64位系统,如果使用int来定义变量保存唯一号就可能出现溢出,并出现上述问题。
 
    可参考 http://www.ibm.com/developerworks/cn/linux/l-port64.html

展开全文  
收起全文  
利用find和sed批量替换文件内容 (Linux/Unix)
发布于 2009-06-12 23:49 阅读:163817 评论:0 标签: find sed

    这是这个连锁反应:发现apache的log没有分日期、分正误记录 --> 改为分日期、分正误记录log --> 观察错误log,发现有大量404错误 --> 需要修正程序,发现文件路径错误 --> 本机使用Dreamweaver替换路径,提交SVN --> 部署到服务器上时发现文件太多、且分散在子目录中

    怎么办?一个一个找一个一个上传?傻子才干!既然是在FreeBSD下,那就是用强大的命令行工具吧!实践中发现这个方法真的很实用,记录下来!

    需求:把本目录下,包括子目录下的文件,把所有含有“/adm/images/c.gif”的地方替换为“/Admin/Images/c.gif”。

    步骤:找出文件,找到地方,替换。

    寻找命令:找到文件(find,ls),找到地方(grep),替换(sed)。

    现在需要做的,就是组合起来。

    查找资料,有前辈告诫:“find 命令是所有 Linux 命令中最有用的一个,同时也是最混乱的一个”,顿时奔溃。

    还好,发现find命令有个叫“-exec”的,很是强大:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} \;,注意{}和\;之间的空格。

    个人理解:-exec参数中的“{}”是该参数前命令产生的结果的一个变量。感觉类似管道的作用了。

    而且还可以有多个-exec参数,很是强大。基本上grep和sed都可以作为子命令在其中运行了。

    如此一来,可以使用以下命令列出需要替换的字符串所在的行了:

以下是代码片段:

find ./ -exec grep "/adm/images/c.gif" '{}' \;

    然后再使用一个-exec参数吧sed包含进来吧。

    sed 的工作方式:

以下是引用片段:

sed 实用工具按顺序逐行将文件读入到内存中。然后,它执行为该行指定的所有操作,并在完成请求的修改之后将该行放回到内存中,以将其转储至终端。完成了这一行上的所有操作之后,它读取文件的下一行,然后重复该过程直到它完成该文件。默认输出是将每一行的内容输出到屏幕上。在这里,开始涉及到两个重要的因素―首先,输出可以被重定向到另一文件中,以保存变化;第二,源文件(默认地)保持不被修改。sed 默认读取整个文件并对其中的每一行进行修改。不过,可以按需要将操作限制在指定的行上。

    注意后面提到的源文件不会修改,不过sed提供了-i参数,可以做到控制是否可以修改源文件。-i参数的描述,Linux和FreeBSD下不太一样,后来也发现Linux在命令的使用方便上的确是要强于FreeBSD的。分述如下:

以下是引用片段:

 FreeBSD 4.7-STABLE下:
     -i extension
             Edit files in-place, saving backups with the specified extension.
             If a zero-length extension is given, no backup will be saved.  It
             is not recommended to give a zero-length extension when in-place
             editing files, as you risk corruption or partial content in situ-
             ations where disk space is exhausted, etc.

Linux下:
       -i[SUFFIX], --in-place[=SUFFIX]
              edit files in place (makes backup if extension supplied)

    FreeBSD下说如果-i参数后面的后缀如果为0,则不产生备份文件,结果我试了好几次都没有搞定,不得已,使用了一个备份文件来存储源文件,然后修改源文件:

以下是代码片段:
find ./ -exec grep "/adm/images/c.gif" '{}' \; -exec sed -i .bak 's/\/adm\/images\/c.gif/\/Admin\/Images\/c.gif/g' {} \;

    比如下面的就不行,老提示错误,望知情者指教:

以下是代码片段:
find ./ -exec grep "/adm/images/c.gif" '{}' \; -exec sed -i 's/\/adm\/images\/c.gif/\/Admin\/Images\/c.gif/g' {} \;

    Linux下,可以不产生备份文件直接修改了:

以下是代码片段:
find ./ -exec grep "/adm/images/c.gif" '{}' \; -exec sed -i 's/\/adm\/images\/c.gif/\/Admin\/Images\/c.gif/g' {} \;

    当然,需要强调的是:备份还是很重要的!切记切记!

    本文环境如下:

以下是引用片段:
FreeBSD:
FreeBSD 4.7-STABLE

Linux:
[root@bsso Admin_bak]# cat /etc/issue
CentOS release 4.1 (Final)
Kernel \r on an \m
[root@bsso Admin_bak]# sed --version
GNU sed version 4.1.2
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,
to the extent permitted by law.

    另:
    1:FreeBSD下如何查看sed的版本呢?
    2:网上看见资料说,类似下面的语句应该是可以达到目的,当我在FreeBSD和Linux下都没有运行成功

以下是代码片段:
sed -i 's/\/adm\/images\/c.gif/\/Admin\/Images\/c.gif/g' `grep -rf "/adm/images/c.gif"`


    参考资料:

以下是引用片段:

Linux文件查找命令find,xargs详述
http://www.linuxsir.org/main/?q=node/137
Linux Find 命令精通指南
http://www.oracle.com/technology/global/cn/pub/articles/calish-find.html
使用 sed 编辑器
http://www.oracle.com/technology/global/cn/pub/articles/dulaney_sed.html
linux sed 批量替换多个文件中的字符串
http://www.admin99.net/read.php/108.htm

展开全文  
收起全文  
在北京混那可是奋斗的一生哇! (随便说说)
发布于 2009-05-19 23:43 阅读:36908 评论:0 标签: 奋斗
    看北京房价,有感,如题。
展开全文  
收起全文  
sort命令分析日志 (Linux/Unix)
发布于 2009-04-28 22:52 阅读:35126 评论:1 标签: cut sort uniq

    很久没有更新blog了,上来冒个泡。

    之前,常用cut,sort,uniq命令的组合分析程序的log,或者查看数据以便统计。例如:cut -d "|" -f 4 | sort | uniq -n -r。

    今天遇到一个问题,需要查看多个用户的操作记录。数据第一列可顺利的按照时间排序,然而用户名在中间,既然是log,那源数据便可能是多个用户的交叉记录了。比如:

以下是引用片段:
time0 | userA | action
time1 | userB | action
time2 | userC | action
time3 | userA | action
time4 | userC | action
time5 | userB | action
time6 | userC | action
time7 | userB | action

    很显然,我们希望的顺序是:

以下是引用片段:
time0 | userA | action
time3 | userA | action
time1 | userB | action
time5 | userB | action
time7 | userB | action
time2 | userC | action
time4 | userC | action
time6 | userC | action

    我们既想按照中间的数据的排序又要保持数据的完整性!也许可以用其他的命令实现这个,但我更倾向于使用常用的命令搞定复杂的事情。

    其实sort命令是可以实现这个的。sort的-t选项可以实现cut的-d功能,再利用+m -n参数可以实现cut的-f的功能,只是,sort的这个+m -n是从0开始计数的。+m -n是指从第m个字段开始,到第n个字段排序,其中包含第m个但不包含第n个。比如:sort -t "|" +1 -2 filename 就可以得到我们想要的结果了。

    sort的功能是排序,应用起来会有很多种排序的方式,可以用指定的参数来控制:

    - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。这个选项对 uniq -d 后的结果尤为有用。
    - f 将小写字母与大写字母同等对待。也就是忽略大小写。
    - I 忽略非打印字符。
    - M 作为月份比较:“JAN”<“FEB”
    - r 按逆序输出排序结果。这个可与 -d 同时使用,实现数字从大到小的排列

    还有一个很实用的功能,如果你想把一个过滤后的文件内容重新写入到原文件,那么- o 参数可以达到这个要求,但是效率呢?嗯,是个问题,看取舍了!毕竟这种情况重定向是不行的。

    - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。

    很多系统实用小工具就是用这种常用名字组建的,嗯哼。

展开全文  
收起全文  
在招行专业版查看信用卡信息 (随便说说)
发布于 2009-03-31 14:41 阅读:16600 评论:0 标签: 信用卡 招行

    晕菜,想在招行专业版上信用卡的信息,看了专业版给的提示,提示我要么去柜台,要么先自动关联自动还款的一卡通。不想关联自动还款,于是去柜台,结果一进门就被工作人员忽悠到打招行信用卡800电话,然后被接线生很温柔地忽悠说招行专业版的客户服务里面就可以搞定。Y的,一群骗子。

    最后通过招行的网站客服搞定了事情,没办法,还是得先关联自动还款的一卡通。下面是网上客服的解释。

    招行网上客服的效率还是不错的,于是想想天朝的备案什么时候也能有这个效率呢?!从事互联网,还是这个备案的单位轻松啊。

------------------------ 喜欢忽悠的分割线 ------------------------

    您可以通过大众版或者电话办理。

    请您登录信用卡网上银行www.8008205555.com,点击“系统登录”输入身份证件号码、查询密码和附加码就能登录网上银行,然后在“还款管理”的下拉框中选择“自动还款设置”即可设置自动还款功能。向您说明一下:到期还款日前一天24点之前申请,当期自动还款才能生效,生效后即会从您一卡通上扣除本期帐款。需提醒您,您只能关联本人的一卡通,且一卡通证件号码、证件类型需与信用卡的一致,同时自扣当日勿往信用卡内存款,以免引起重复扣款。

    或请您致电客服热线800-820-5555,手机用户拨打021-38784800或者4008205555,在语音中选择“1”中文服务后,选择“1”持卡人服务,选择“1”帐务查询与还款,选择“2”自动还款,再选择“1”申请自动还款,即可开通一卡通自动扣款功能。

    绑定后就可以在“专业版管理”--“证书关联信用卡操作”,把信用卡关联到专业版了。

展开全文  
收起全文  
估算Apache所需要的内存 (Linux/Unix)
发布于 2009-03-25 19:21 阅读:29857 评论:2 标签: apache 内存

    精确的计算所需要的内存是很困难的,为了尽可能的精确,需要观察类似线上环境下观察服务器的负载和进程。毕竟如果不同的服务器配置和装的模块是有差异的,只有查看自己才可靠,所谓核心的东西要掌握在自己手里大概如此。。。。

    一个简单可靠的法子是,在压力测试时,找到httpd进程,查看一个进程使用了多少的内存,然后看看总的进程,即可估算一下。

    比如:
    ps aux | grep httpd
    查看每个httpd进程使用了多少内存,数字在第四列,格式为百分之几。

    ps aux | grep httpd | wc -l
    得到一共有多少进程,记得结果要减1,因为grep httpd也在结果中。

    free
    查看服务器内存总量,单位为K

    然后就可以估算了。比如一个进程占2%的内存,有27个httpd,总内存为4148424。那就是:
php -r "echo 0.002*4148424*26/1024;"
    结果为210.66215625M内存,这个只仅仅是为apache分配的。还得给其它服务留出足够空余的内存。而且考虑高峰期可能会比平时大12倍,这个时候仅仅考虑Apache就够了,嘿嘿。曾经出现过因磁盘IO过高导致服务器崩溃的场景。

    如果怎么算都不能让服务器有空余的内存,就得考虑限制最大进程数了。使用MaxClient指令可以用来限制。

    以上说得有误之处,还请各位指点!

展开全文  
收起全文  
介绍“最好的编程字体”Monaco (扩展学习)
发布于 2009-03-24 15:09 阅读:50132 评论:6 标签: Monaco 字体

    同事看见我的编程界面,不禁大呼“你的编程字体好丑”。立马无地自容,我真太不专业了!竟然不知道还有“编程字体”这个概念。。。。。。

    于是同事立即推荐了好几个字体,看我都不满意,于是拿出了他的压箱货:Monaco。苹果出品,据称是最好看的编程字体,主要是优化英文字体,对中文也有效。尤其能分清楚0oO,而且很锐化,看见的不再是规规矩矩了。

    为方便大家下载,我把字体放到新浪旗下产品爱问了:http://ishare.iask.sina.com.cn/f/4944524.html

    Windows下,下载字体解压后放到C:\WINDOWS\Fonts下即可,然后就可以到编辑器里设置了。比如EditPlus下在字体中选择“Monaco”即可,如果不希望中文也是Monaco,第一次看见时会感觉有点奇怪,可以在language中选择“East Europe”。

    Ubuntu下将字体mv至字体目录下:/usr/share/fonts/truetype/ 任一地方,建一个新目录也行。记得给每个用户/组有读权限。然后需要做的是刷新FreeType字体文件的索引。

    需要使用命令fc-cache。作用:“build font information cache files”。其实就是扫描字体目录,把信息写入缓存文件,然后应用程序在启动时会读这个文件,这样你就可以在应用程序配置中选择这个缓存文件中的字体了。这个命令可以扫描系统全部字体目录也可以只扫描更新你指定的,就看你在命令后是否给出字体目录了。

    常用的选项有:
    -f 强行重建缓存,force的意思。
    -v 显示命令执行信息,view的意思。

    正确执行命令后,在当前终端或新开一个终端,均不能选择Monaco字体,需要关掉打开的终端,再新开的终端才能进行选择。

    希望对你有用!

展开全文  
收起全文  
Apache配置文件学习(一) (Linux/Unix)
发布于 2009-03-11 21:40 阅读:12751 评论:1 标签: apache 配置

    1:<IfDefine [!]parameter-name> ... </IfDefine>
    而parameter-name是在服务启动时,通过httpd命令行的 -Dparameter 这样的形式指定的。

    2:<IfModule [!]module-file|module-identifier> ... </IfModule>
    module可以是模块的标识符或者是编译模块时的文件名。比如,rewrite_module就是一个模块标识符,而mod_rewrite.c则是编译模块时的文件名。如果模块包含多个源代码文件,您应当使用包含 STANDARD20_MODULE_STUFF 字符串的那个。

    而STANDARD20_MODULE_STUFF请参考:《编写第一个Apache模块――mod_helloworld

    3:User/Group指令用于设置实际提供服务的子进程的用户/组。为了使用这个指令,服务器必须以root身份启动和初始化。如果你以非root身份启动服务器,子进程将不能够切换至非特权用户/组,并继续以启动服务器的原始用户身份运行。如果确实以root用户启动了服务器,那么父进程将仍然以root身份运行。

    Unix-userid是下列值之一:

以下是引用片段:

 1:一个用户名/组:通过用户名/组引用用户/组
 2:"#"号后面跟一个用户/组编号 :通过用户/组编号引用用户/组

    用于运行子进程的用户必须是一个没有特权的用户/组,这样才能保证子进程无权访问那些不想为外界所知的文件,同样的,该用户/组亦需没有执行那些不应当被外界执行的程序的权限。

    进程的用户及层次关系可见:

以下是引用片段:
[root@login yayu]# pstree -apu | grep http
  |-httpd,10914 -DSSL
  |   |-httpd,8483,web -DSSL
  |   |-httpd,8489,web -DSSL
  |   |-httpd,8551,web -DSSL
  |   |-httpd,8552,web -DSSL
  |   |-httpd,8553,web -DSSL
  |   |-httpd,8554,web -DSSL
  |                       |-grep,8558 http


    4:如果在<VirtualHost>外设置了一个ServerName,而一个请求不能与某个ServerName指令相匹配,它将会由第一个<VirtualHost>段所伺服。

    5:ServerRoot指令设置了服务器所在的目录。一般来说它将包含conf/和logs/子目录。其它配置文件的相对路径即基于此目录 (比如Include或LoadModule)。而指定ServerRoot、DocumentRoot时不应包括最后的"/"。

    6:Order指令控制默认的访问状态与Allow和Deny指令生效的顺序,变态的命令。

    下面例子中,apache.org域中所有主机,除了foo.apache.org子域包含的主机被拒绝以外,其他都允许访问。而所有不在apache.org域中的主机都不允许访问,因为默认状态是拒绝对服务器的访问。

以下是引用片段:
Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org

    另一方面,如果上个例子中的Order指令改变为"Deny,Allow",将允许所有主机的访问。这是因为,不管配置文件中指令的实际顺序如何,"Allow from apache.org"指令会最后被评估到并覆盖之前的"Deny from foo.apache.org"。所有不在apache.org域中的主机也允许访问是因为默认状态被改变到了允许。说白了就是控制Allow和Deny两个指定的顺序。

展开全文  
收起全文  
Apache配置之ServerType的standalone和inetd模式 (Linux/Unix)
发布于 2009-03-09 18:35 阅读:22521 评论:0 标签: inetd ServerType standalone

   不仔细看httpd.conf配置文件还不知道有这回事,汗。

   ServerType这个配置选项指定如何运行Apache。Apache可以使用两种方法来运行:standalone(独立式)和inetd(超级守护进程式)。

   standalone模式表示Apache进程以一个单独的守护进程方式在后台监听是否有客户端的请求,如果有则生成一个子进程来为其服务。在standalone模式下,apache进程一次性启动,运行期间一直驻留在内存中,尽管损耗了一定的系统资源,但接入信号反应快;而且子httpd进程在http请求完毕后并没有直接断掉,这样就可以重新用来接受新的http请求,请参考apache的keepalive指令(请看这里)。由于不存在对每个请求都启动新的apache根进程,所以它的效率更高。

   inetd模式表示Apache服务不是以一个单独的守候进程的形式支持。而是由Inetd这个超级守候进程进行代劳,当它监听一个客户端的http请求的时候,再启动一个httpd进程为其服务。一个由inted运行的服务器进程在它结束对请求服务的同时立刻退出,虽然不占用了系统资源,但是也由此不适合应用在同时连接数量较多的系统。因为如果请求完毕后就结束httpd进程,会使服务器负担加重。

   具体使用如下:

   standalone模式

   此种模式下,Apache服务器监听特定端口的连接请求。当用户发起特定端口地址的连接请求时,主服务器进程启动子httpd进程来响应该请求。

   这样还需要告诉主服务器进程侦听的特定端口地址,使用命令:


以下是代码片段:

Port [number] (缺省值为80)


   inetd模式

   inetd是监听所有小于1024的端口连接请求的Internet守护进程(一个服务器进程)。与standalone模式不同,当客户系统发出到Apache服务器的连接请求时,inetd启动一个httpd进程,由此进程服务此请求,完成服务后即退出。

   如果选择通过inetd服务器来运行Apache,需要编辑/etc/inetd.conf文件为Apache添加一条新的记录:


以下是代码片段:

httpd stream tcp nowait httpd /etc/httpd/bin/httpd


展开全文  
收起全文  
Linux进程的层次关系 (Linux/Unix)
发布于 2009-02-16 19:40 阅读:39681 评论:0 标签: Linux 进程

    前段时间在看清华大学出版社出版的《Linux教程》(05年6月第一版)。在248页第十三章《进程》有一节是简述Linux进程的层次关系的,把操作系统自启动后都做了什么,说得比较清晰,看过后受益匪浅。

    就是喜欢看这种能把整个框架说得比较清楚的文章!特抄来以共享:

    当打开Linux系统,LILO(LInux LOader)找到Linux内核把它加载到内存。它初始化各种硬件,包括磁盘控制器。然后转到保护模式,加载操作系统,执行初始化各种内核数据结构的代码,例如inode和文件表。此进程的PID为0。它启动初试进程(init进程,PID为1)完成引导过程的其余工作。init进程启动守护进程kflushd、kupdate、kpiod和kswapd,其PID分别为2、3、4、5。Init进程然后初始化文件系统,安装根文件系统。接下来试着执行/sbin/init程序,在每一个激活的终端上执行minegetty进程(经常被称为getty进程)。getty进程设置终端属性,如波特率,这些属性在/etc/termcap文件中都有定义。它显示login:提示符,等待用户登录。

    在login:提示符下,输入登录名并按回车键,getty进程产生一个子进程。它转变为以登录名为参数的登录进程。登录进程提示输入密码,并检查输入名和密码的有效性。如果两者均正确,登录进程产生一个子进程,它将转变为登录shell。如果登录进程没有在/etc/passwd文件中找到登录名或者输入的密码与/etc/passwd文件中(或者/etc/shadow文件)存放的密码不匹配,他将显示错误提示信息然后终止。控制权又回到getty进程,重新显示login:提示符。一旦进入登录shell,就可以完成自己的工作,还可以按<ctrl-D>键终止当前shell。如果这样做了,shell进程会终止,控制权又回到getty进程,再次显示login:提示符,又开始循环。

    就是说,当登录到Linux系统,系统产生第一个进程,称为登录进程,它又创建登录shell。登录shell为所输入的命令创建进程,用以解释/执行命令。

    两个Linux进程贯穿系统生命周期:swapper和init进程。监视终端行的getty进程,只要终端与系统关联上就会一直存在。登录进程和登录shell进程只有在登录时才存在。所有其它进程生存期较短,只在命令或者程序执行时短暂存在。

    ps -ef 命令或者pstree命令可以用图的形式显示当前系统中执行进程的进程树,勾勒出进程间的父子关系。pstree命令显示的图比ps -ef命令更简洁。pstree显示的结果,前有“+”的是当前的后台进程,而前面的有“-”的是后续后台进程。pstree命令使用-h参数,输出用粗体(加亮)显示当前进程。使用“-a”选项,pstree显示带参数的命令。如“pstree 402 -a”可以显示PID为402的进程的那个的层次关系。

    Bash shell可以使用ulimit显示用户可以同时执行的最大进程个数。TC shell下为limit。两个命令都可以用来显示硬件和操作系统资源的使用限制。

展开全文  
收起全文