共享内存和信号量

共享内存:

可以通过ipcs -lm命令查看目前系统共享内存的参数限制:

# ipcs -lm

—— Shared Memory Limits ——–

max number of segments = 4096

max seg size (kbytes) = 1048576

max total shared memory (pages) = 2097152

min seg size (bytes) = 1

这里涉及到3个于共享内存相关的参数:SHMMAXSHMMNISHMALL


SHMMAX

含义:每个共享内存段的最大字节数

设置:比SGA略大

查看:cat /proc/sys/kernel/shmmax

$ cat /proc/sys/kernel/shmmax

1073741824

修改:

sysctl -w kernel.shmmax=1073741824

echo “kernel.shmmax = 1073741824” >> /etc/sysctl.conf


SHMMIN

含义:每个共享内存段的最小字节数


SHMSEG

含义:每进程最大共享内存段数量


SHMMNI

含义:系统范围最大共享内存段的数量

设置:至少4096

查看:cat /proc/sys/kernel/shmmni

# cat /proc/sys/kernel/shmmni

4096

修改:

# sysctl -w kernel.shmmni=4096

# echo “kernel.shmmni = 4096” >> /etc/sysctl.conf


SHMALL

含义:系统中共享内存页总数

设置:至少ceil(shmmax/PAGE_SIZE)ORACLE DOC 默认值:2097152*4096=8GB

查看:cat /proc/sys/kernel/shmall

$ getconf PAGE_SIZE

4096

# cat /proc/sys/kernel/shmall

2097152

修改:

# sysctl -w kernel.shmall=2097152

# echo kernel.shmall = 2097152 >> /etc/sysctl.conf



信号量:

当前系统信号量限制:

$ ipcs -ls

—— Semaphore Limits ——–

max number of arrays = 128

max semaphores per array = 250

max semaphores system wide = 32000

max ops per semop call = 32(设置成100比较好)

semaphore max value = 32767


SEMMNI

含义:信号灯标识符的最小数量(也就是说,套)

设置:最少128


SEMMSL

含义:每套信号灯最小信号灯数量

设置:最小250;对于processes参数设置较大的系统建议设置为processes+10

一套信号灯里可以有多少信号灯,对于Postgres而言应该至少是 17


SEMMNS

含义:linux系统中信号量最大个数

设置:至少32000SEMMNI *SEMMSL


SEMOPM

含义:semop系统调用允许的信号量最大个数

设置:至少100;或者等于SEMMSL

查看信号量设置:cat /proc/sys/kernel/sem


SEMVMX
信号灯的最大值(semaphore max value = 32767

orderSEMMSL, SEMMNS, SEMOPM, SEMMNI

$ cat /proc/sys/kernel/sem

250    32000    100    128

修改:

sysctl -w kernel.sem=”250 32000 100 128

echo kernel.sem = 250 32000 100 128 >> /etc/sysctl.conf

ORACLE提供了sysresv工具管理共享内存以及信号量,操作系统级别可以通过ipcs管理。

kernel.shmall = 2097152 # 可以使用的共享内存的总量,单位:页。

kernel.shmmax = 2147483648 # 最大单个共享内存段大小。取物理内存大小的一半,单位为字节

kernel.shmmni = 4096 # 整个系统共享内存段的最大数目。

kernel.sem = 250 32000 100 128 # 每个信号对象集的最大信号对象数;系统范围内最大信号对象数;每个信号对象支持的最大操作数;系统范围内最大信号对象集数。

fs.file-max = 65536 # 系统中所允许的文件句柄最大数目。

net.ipv4.ip_local_port_range = 1024 65000 # 应用程序可使用的IPv4端口范围。

net.core.rmem_default = 1048576 # 套接字接收缓冲区大小的缺省值

net.core.rmem_max = 1048576 # 套接字接收缓冲区大小的最大值

net.core.wmem_default = 262144 # 套接字发送缓冲区大小的缺省值

net.core.wmem_max = 262144 # 套接字发送缓冲区大小的最大值

Zend Framework 的 PHP 编码标准

C.2. PHP File 文件格式 
C.2.1.  常规 
    对于只包含有 PHP 代码的文件,结束标志(”?>”)是不允许存在的,PHP自身不需要(”?>”), 这样做, 可以防止它的末尾的被意外地注入相应。 
    重要: 由 __HALT_COMPILER() 允许的任意的二进制代码的内容被 Zend Framework 中的 PHP 文件或由它们产生的文件禁止。这个功能的使用只对一些安装脚本开放。

C.2.2.  缩进
    缩进由四个空格组成,禁止使用制表符 TAB 。

C.2.3.  行的最大长度 
    一行 80 字符以内是比较合适,就是说,ZF 的开发者应当努力在可能的情况下保持每行代码少于 80 个字符,在有些情况下,长点也可以, 但最多为 120 个字符。 

C.2.4.  行结束标志 
    行结束标志遵循 Unix 文本文件的约定,行必需以单个换行符(LF)结束。换行符在文件中表示为 10,或16进制的 0x0A。 
    注:不要使用 苹果操作系统的回车(0x0D)或 Windows 电脑的回车换行组合如(0x0D,0x0A)。 

C.3.  命名约定 
C.3.1.  类 
    Zend Framework 的类命名总是对应于其所属文件的目录结构的,ZF 标准库的根目录是 “Zend/”,ZF 特别(extras)库的根目录是 “ZendX/”,所有 Zend Framework 的类在其下按等级存放。 
    类名只允许有字母数字字符,在大部分情况下不鼓励使用数字。下划线只允许做路径分隔符;例如 Zend/Db/Table.php 文件里对应的类名称是 Zend_Db_Table。 
    如果类名包含多个单词,每个单词的第一个字母必须大写,连续的大写是不允许的,例如 “Zend_PDF” 是不允许的,而 “Zend_Pdf” 是可接受的。 
    这些约定为 Zend Framework 定义了一个伪命名空间机制。如果对开发者在他们的程序中切实可行,Zend Framework 将采用 PHP 命名空间特性(如果有的话)。 
    参见在标准和特别库中类名作为类名约定的例子。 重要: 依靠 ZF 库展开的代码,但又不是标准或特别库的一部分(例如程序代码或不是 Zend 发行的库),不要以 “Zend_” 或 “ZendX_” 开头。 

C.3.2.  文件名 
    对于其它文件,只有字母数字字符、下划线和短横线(”-“)可用,空格是绝对不允许的。 
    包含任何 PHP 代码的任何文件应当以 “.php” 扩展名结尾,众所周知的视图脚本除外。下面这些例子给出 Zend Framework 类可接受的文件名: 
    Zend/Db.php
    Zend/Controller/Front.php
    Zend/View/Helper/FormRadio.php
文件名必须遵循上述的对应类名的规则。 

C.3.3.  函数和方法 
    函数名只包含字母数字字符,下划线是不允许的。数字是允许的但大多数情况下不鼓励。 
    函数名总是以小写开头,当函数名包含多个单词,每个子的首字母必须大写,这就是所谓的 “驼峰” 格式。 
    我们一般鼓励使用冗长的名字,函数名应当长到足以说明函数的意图和行为。 
    这些是可接受的函数名的例子: 
    filterInput()
    getElementById()
    widgetFactory()

    对于面向对象编程,实例或静态变量的访问器总是以 “get” 或 “set” 为前缀。在设计模式实现方面,如单态模式(singleton)或工厂模式(factory), 方法的名字应当包含模式的名字,这样名字更能描述整个行为。 
    在对象中的方法,声明为 “private” 或 “protected” 的, 名称的首字符必须是一个单个的下划线,这是唯一的下划线在方法名字中的用法。声明为 “public” 的从不包含下划线。 
    全局函数 (如:”floating functions”) 允许但大多数情况下不鼓励,建议把这类函数封装到静态类里。 

C.3.4.  变量 
    变量只包含数字字母字符,大多数情况下不鼓励使用数字,下划线不接受。 
    声明为 “private” 或 “protected” 的实例变量名必须以一个单个下划线开头,这是唯一的下划线在程序中的用法,声明为 “public” 的不应当以下划线开头。 
    对函数名(见上面 3.3 节)一样,变量名总以小写字母开头并遵循“驼峰式”命名约定。 
    我们一般鼓励使用冗长的名字,这样容易理解代码,开发者知道把数据存到哪里。除非在小循环里,不鼓励使用简洁的名字如 “$i” 和 “$n” 。如果一个循环超过 20 行代码,索引的变量名必须有个具有描述意义的名字。 

C.3.5.  常量 
    常量包含数字字母字符和下划线,数字允许作为常量名。 
    常量名的所有字母必须大写。 
    常量中的单词必须以下划线分隔,例如可以这样 EMBED_SUPPRESS_EMBED_EXCEPTION 但不许这样 EMBED_SUPPRESSEMBEDEXCEPTION。 
    常量必须通过 “const” 定义为类的成员,强烈不鼓励使用 “define” 定义的全局常量。 

C.4.  编码风格 
C.4.1. PHP 代码划分(Demarcation)
    PHP 代码总是用完整的标准的 PHP 标签定界: 
<?php

?>
短标签( )是不允许的,只包含 PHP 代码的文件,不要结束标签 (参见 Section C.2.1, “ 常规 ”)。 

C.4.2.  字符串 
C.4.2.1.  字符串文字 
    当字符串是文字(不包含变量),应当用单引号( apostrophe )来括起来: 
    $a = \’Example String\’;

C.4.2.2.  包含单引号(\’)的字符串文字 
    当文字字符串包含单引号(apostrophe )就用双引号括起来,特别在 SQL 语句中有用: 
    $sql = “SELECT id, name from people WHERE name=\’Fred\’ OR name=\’Susan\'”;
    在转义单引号时,上述语法是首选的,因为很容易阅读。 

C.4.2.3.  变量替换 
    变量替换有下面这些形式: 
    $greeting = “Hello $name, welcome back!”;
    $greeting = “Hello {$name}, welcome back!”;
    为保持一致,这个形式不允许: 
    $greeting = “Hello ${name}, welcome back!”;

C.4.2.4.  字符串连接 
    字符串必需用 “.” 操作符连接,在它的前后加上空格以提高可读性:
    $company = \’Zend\’ . \’ \’ . \’Technologies\’;
    当用 “.” 操作符连接字符串,鼓励把代码可以分成多个行,也是为提高可读性。在这些例子中,每个连续的行应当由 whitespace 来填补,例如 “.” 和 “=” 对齐: 
$sql = “SELECT id, name FROM people
     . “WHERE name = \’Susan\’ ”
     . “ORDER BY name ASC “;

C.4.3.  数组 
C.4.3.1.  数字索引数组 
    索引不能为负数,建议数组索引从 0 开始。 
    当用 array 函数声明有索引的数组,在每个逗号的后面间隔空格以提高可读性: 
    $sampleArray = array(1, 2, 3, \’Zend\’, \’Studio\’);

    可以用 “array” 声明多行有索引的数组,在每个连续行的开头要用空格填补对齐: 
$sampleArray = array(1, 2, 3, \’Zend\’, \’Studio\’,
                     $a, $b, $c,
                     56.44, $d, 500);

C.4.3.2.  关联数组 
    当用声明关联数组,array 我们鼓励把代码分成多行,在每个连续行的开头用空格填补来对齐键和值: 
$sampleArray = array(\’firstKey\’  => \’firstValue\’,
                     \’secondKey\’ => \’secondValue\’);
C.4.4.  类 
C.4.4.1.  类的声明 
    用 Zend Framework 的命名约定来命名类。 
    花括号应当从类名下一行开始(the “one true brace” form)。 
    每个类必须有一个符合 PHPDocumentor 标准的文档块。 
    类中所有代码必需用四个空格的缩进。 
    每个 PHP 文件中只有一个类。 
    放另外的代码到类里允许但不鼓励。在这样的文件中,用两行空格来分隔类和其它代码。 

下面是个可接受的类的例子: // 459 9506 - 441 9658 下次从这里开始 
/**
 * Documentation Block Here
 */
class SampleClass
{
    // 类的所有内容
    // 必需缩进四个空格
}

C.4.4.2.  类成员变量 
    必须用Zend Framework的变量名约定来命名类成员变量。 
    变量的声明必须在类的顶部,在方法的上方声明。 
    不允许使用 var (因为 ZF 是基于 PHP 5 的 ),要用 private、 protected 或 public。 直接访问 public 变量是允许的但不鼓励,最好使用访问器 (set/get)。 

C.4.5.  函数和方法 
C.4.5.1.  函数和方法声明 
    必须用Zend Framework的函数名约定来命名函数。 
    在类中的函数必须用 private、 protected 或 public 声明它们的可见性。 
    象类一样,花括号从函数名的下一行开始(the “one true brace” form)。 
    函数名和括参数的圆括号中间没有空格。 
    强烈反对使用全局函数。 
下面是可接受的在类中的函数声明的例子: 
/**
 * Documentation Block Here
 */
class Foo
{
    /**
     * Documentation Block Here
     */
    public function bar()
    {
        // 函数的所有内容
        // 必需缩进四个空格
    }
}
注: 传址(Pass-by-reference)是在方法声明中允许的唯一的参数传递机制。  

/**
 * Documentation Block Here
 */
class Foo
{
    /**
     * Documentation Block Here
     */
    public function bar(&$baz)
    {}
}

传址在调用时是严格禁止的。 
返回值不能在圆括号中,这妨碍可读性而且如果将来方法被修改成传址方式,代码会有问题。 

/**
 * Documentation Block Here
 */
class Foo
{
    /**
     * WRONG
     */
    public function bar()
    {
        return($this->bar);
    }

    /**
     * RIGHT
     */
    public function bar()
    {
        return $this->bar;
    }
}

C.4.5.2.  函数和方法的用法 
    函数的参数应当用逗号和紧接着的空格分开,下面可接受的调用的例子中的函数带有三个参数: 
    threeArguments(1, 2, 3);
    传址方式在调用的时候是严格禁止的,参见函数的声明一节如何正确使用函数的传址方式。 
    带有数组参数的函数,函数的调用可包括 “array” 提示并可以分成多行来提高可读性,同时,书写数组的标准仍然适用: 
threeArguments(array(1, 2, 3), 2, 3);
threeArguments(array(1, 2, 3, \’Zend\’, \’Studio\’,
                     $a, $b, $c,
                     56.44, $d, 500), 2, 3);

C.4.6.  控制语句 
C.4.6.1. if/Else/Elseif
    使用 if and elseif 的控制语句在条件语句的圆括号前后都必须有一个空格。 
    在圆括号里的条件语句,操作符必须用空格分开,鼓励使用多重圆括号以提高在复杂的条件中划分逻辑组合。 
    前花括号必须和条件语句在同一行,后花括号单独在最后一行,其中的内容用四个空格缩进。 
if ($a != 2) {
    $a = 2;
}

    对包括”elseif” 或 “else”的 “if” 语句,和 “if” 结构的格式类似, 下面的例子示例 “if” 语句, 包括 “elseif” 或 “else” 的格式约定: 
if ($a != 2) {
    $a = 2;
} else {
    $a = 7;
}

if ($a != 2) {
    $a = 2;
} elseif ($a == 3) {
    $a = 4;
} else {
    $a = 7;
}

    在有些情况下, PHP 允许这些语句不用花括号,但在(ZF) 代码标准里,它们(”if”、 “elseif” 或 “else” 语句)必须使用花括号。 
    “elseif” 是允许的但强烈不鼓励,我们支持 “else if” 组合。 

C.4.6.2. Switch
    在 “switch” 结构里的控制语句在条件语句的圆括号前后必须都有一个单个的空格。 
    “switch” 里的代码必须有四个空格缩进,在”case”里的代码再缩进四个空格。 
switch ($numPeople) {
    case 1:
        break;

    case 2:
        break;

    default:
        break;
}

switch 语句应当有 default。 
    注: 有时候,在 falls through 到下个 case 的 case 语句中不写 break or return 很有用。 为了区别于 bug,任何 case 语句中,所有不写 break or return 的地方应当有一个 “// break intentionally omitted” 这样的注释来表明 break 是故意忽略的。  

C.4.7.  注释文档 
C.4.7.1.  格式 
    所有文档块 (“docblocks”) 必须和 phpDocumentor 格式兼容,phpDocumentor 格式的描述超出了本文档的范围,关于它的详情,参考:http://phpdoc.org/。 
    所有类文件必须在文件的顶部包含文件级 (”file-level”)的 docblock ,在每个类的顶部放置一个 “class-level” 的 docblock。下面是一些例子: 

C.4.7.2.  文件 
    每个包含 PHP 代码的文件必须至少在文件顶部的 docblock 包含这些 phpDocumentor 标签: 
/**
 * 文件的简短描述
 *
 * 文件的详细描述(如果有的话)… …
 *
 * LICENSE: 一些 license 信息
 *
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/3_0.txt   BSD License
 * @version    $Id:$
 * @link       http://framework.zend.com/package/PackageName
 * @since      File available since Release 1.5.0
*/

C.4.7.3.  类 
    每个类必须至少包含这些 phpDocumentor 标签: 
/**
 * 类的简述
 *
 * 类的详细描述 (如果有的话)… …
 *
 * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com)
 * @license    http://framework.zend.com/license/   BSD License
 * @version    Release: @package_version@
 * @link       http://framework.zend.com/package/PackageName
 * @since      Class available since Release 1.5.0
 * @deprecated Class deprecated in Release 2.0.0
 */

C.4.7.4.  函数 
    每个函数,包括对象方法,必须有最少包含下列内容的文档块(docblock): 
    函数的描述 
    所有参数 
    所有可能的返回值 

    因为访问级已经通过 “public”、 “private” 或 “protected” 声明, 不需要使用 “@access”。 
    如果函数/方法抛出一个异常,使用 @throws 于所有已知的异常类: 
    @throws exceptionclass [description]

Linux信号处理

1.信号集概念

信号集是一个能表示多个信号的数据类型,sigset_t set ;set即一个信号集。既然是一个集合,就需要对集合进行添加/删除等操作。

int sigemptyset(sigset_t *set); 将set集合置空
int sigfillset(sigset_t *set); 将所有信号加入set集合
int sigaddset(sigset_t *set,int signo); 将signo信号加入到set集合
int sigdelset(sigset_t *set,int signo); 从set集合中移除signo信号
int sigismember(const sigset_t *set,int signo); signo判断信号是否存在于set集合中


代码举例:

  1. <span style=“font-size:16px;color:#000000;”>#include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<sys/types.h>  
  4. #include<sys/stat.h>  
  5. #include<signal.h>  
  6.   
  7. int main()  
  8. {  
  9.  sigset_t sigset;  
  10.  sigfillset(&sigset);/*填充所有信号*/  
  11.  if(sigismember(&sigset,SIGINT))/*判断SIGINT*/  
  12.  printf(“SIGINT exist in signal_set!\n”);  
  13.  if(sigismember(&sigset,SIGTERM))  
  14.   printf(“SIGTERM exist in signal_set!\n”);  
  15.  if(sigismember(&sigset,SIGABRT))  
  16.   printf(“SIGABRT exist in signal_set!\n”);  
  17.  if(sigdelset(&sigset,SIGINT)<0)/*移除SIGINT*/  
  18.   perror(“del error\n”);  
  19.  else  
  20.   printf(“SIGINT have been removed!\n”);  
  21.  if(sigismember(&sigset,SIGINT))/*再次判断*/  
  22.   printf(“SIGINT exist in signal_set!\n”);  
  23.  else  
  24.   printf(“SIGINT not exist in signal_set!\n”);  
  25. }  
  26.   
  27. </span>  

 

输出:

 $ ./sigset
    SIGINT exist in signal_set!
 SIGTERM exist in signal_set!
 SIGABRT exist in signal_set!
 SIGINT have been removed!
 SIGINT not exist in signal_set!

2. 信号集的使用

   定义信号集->设置信号屏蔽位->定义信号处理函数->检测信号
   <1>使用1中的函数即可完成信号集的定义,之后是
   <2>设置信号屏蔽位
   其作用为设置某个进程需要屏蔽的信号

   Int sigprocmask(int how,const sigset_t *set,sigset_t *oset);

参数

 How 指示如何修改屏蔽信号
 Set是一个非空指针时,根据how修改屏蔽信号
 Oset是一个非空指针时,存放当前屏蔽信号集
 若set为NULL,不改变该进程的信号屏蔽字,how也无意义

 How的取值:

   S I G B L O C K
   该进程新的信号屏蔽字是其当前信号屏蔽字和s e t指向信号集的并集。s e t包含了我们希望阻塞的附加信号

   S I G U N B L O C K
   该进程新的信号屏蔽字是其当前信号屏蔽字和s e t所指向信号集的交集。s e t包含了我们希望解除阻塞的信号

   S I G S E T M A S K
   该进程新的信号屏蔽是s e t指向的值

   举例

  1. <span style=“font-size:16px;color:#000000;”>#include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<sys/types.h>  
  4. #include<sys/stat.h>  
  5. #include<signal.h>  
  6.   
  7. /*sigprocmsk的使用*/  
  8.   
  9. void msg(int signo)  
  10. {  
  11.  if(signo==SIGINT)  
  12.   printf(“Get SIGINT!\n”);  
  13.  else  
  14.   printf(“Get SIGQUIT!\n”);  
  15. }  
  16.   
  17. int main()  
  18. {  
  19.  sigset_t sigset,oset;/*sigset存放屏蔽信号,oset保存当前屏蔽信号*/  
  20.  sigemptyset(&sigset);/*清空信号集*/  
  21.  sigaddset(&sigset,SIGINT);/*添加SIGINT信号,信号集中仅有SIGINT*/  
  22.  sigprocmask(SIG_BLOCK,&sigset,&oset);/*加入屏蔽信号*/  
  23.   
  24.  signal(SIGINT,msg);  
  25.  signal(SIGQUIT,msg);  
  26.   
  27.  sleep(2);  
  28.   
  29.  raise(SIGINT);/*发送SIGINT信号*/  
  30.  raise(SIGQUIT);   
  31.   
  32.  return 0;  
  33. }   
  34.   
  35. </span>  

  输出

  Get SIGQUIT!

 <3>定义信号处理函数

  s i g a c t i o n函数的功能是检查或修改(或两者)与指定信号相关联的处理动作。此函数取代了U N I X早期版本使用的s i g n a l函数
  Int sigaction(int signo,const struct sigaction *act,struct sigaction *oact);

  参数:signo 要检测或修改动作的信号量
     Act 非空时,表示要修改的动作
     Oact非空时,返回处理该信号的原先动作

     结构体sigaction如下:

      struct sigaction {
      void (*sa_handler)();/*处理函数或SIG_IGN(忽略)或SIG_DFL(默认)*/
       sigset_t sa_mask; /*处理函数过程中被阻塞*/
     int sa_flags; /*标志位,对信号进程处理选项*/
     } ;

  举例

  1. <span style=“font-size:16px;color:#000000;”>#include<stdio.h>  
  2. #include<stdlib.h>  
  3. #include<sys/types.h>  
  4. #include<sys/stat.h>  
  5. #include<signal.h>  
  6.   
  7. void msg(int signo)  
  8. {  
  9.  if(signo==SIGINT)  
  10.   printf(“Get SIGINT!\n”);  
  11. }  
  12.   
  13. int main()  
  14. {  
  15.  sigset_t sigset,oset;/*sigset存放屏蔽信号,oset保存当前屏蔽信号*/  
  16.  struct sigaction action1,action2;/*信号处理*/  
  17.   
  18.  action1.sa_handler=msg;  
  19.  sigaction(SIGINT,&action1,&action2);  
  20.   
  21.  sleep(2);  
  22.   
  23.  raise(SIGINT);/*发送SIGINT信号*/  
  24.  return 0;  
  25. }   
  26. </span>  

  输出:

   Get SIGINT

 <4>检测被搁置信号

  Int sigpending(sigset_t *set);
  返回对于调用进程被阻塞不能递送和当前未决的信号集。该信号集通过s e t参数返回。


原文链接:http://linux.chinaitlab.com/command/857706.html

 

附:linux信号

信号是一种进程间通信的方法,它应用于异步事件的处理。信号的实质是一种软中断,它被发送给一个正在被执行的进程以通知进程有某一特定事件发生了。
一、信号含义

 信号拥有自己特定的名字,均以SIG开始,它们在头文件中被定义为一个正整数,这些正整数被称为信号编号(signal number)。
 以下为各个信号的具体含义:

 1.         SIGHUP:当终端发现断线情况时发送给与控制终端相连的控制进程的信号,或控制进程运行结束时发出的信号。它通常用来通知守护进程重新读取系统配置文件。
 2.         SIGINT:进程中断信号,可以用来中断一个正在运行的进程。通常是从终端输入的中断指令,如Ctrl+C键或Delete键。
 3.         SIGQUIT:用于中断前台进程组中的所有进程的信号。由终端输入的退出指令Ctrl+\所产生。这一信号在终端进程的同时,还将产生一个core文件。
 4.         SIGILL:执行非法硬件指令时产生的错误。
 5.         SIGTRAP:跟踪陷阱信号。
 6.         SIGIOT:I/O错误信号。
 7.         SIGBUS:系统总线错误时产生的信号。
 8.         SIGFPE:浮点运算中发生溢出错误时产生的信号。
 9.         SIGKILL:可用于终止任何一个进程的信号,只能由系统管理员发出,是不可捕捉和被忽略的信号之一。
 10.     SIGUSR1:用于用户自定义的预留信号。可由用户在应用程序中自行定义。
 11.     SIGSEGV:使用非法内存地址所产生的信号。
 12.     SIGUSR2:同SIGUSR1。
 13.     SIGPIPE:当对一个读进程已经运行结束的管道执行写操作时产生的信号。
 14.     SIGALRM:由alarm函数设定的时间段终止时,会产生此信号。
 15.     SIGTERM:调用kill(1)命令时缺省产生的信号。
 16.     SIGCHLD:当一个子进程结束或中断时,用于通知其父进程的信号。必要时,父进程可以通过这一信号来了解子进程的状态变化及结束状态等信息。但在大多数情况下,这一信号将被忽略。
 17.     SIGCONT:是使已被中断的进程继续执行的信号。当此信号为某一特定进程产生后,如果此时该进程并没有被中断,将不会有任何操作发生;但如果该进程是一中断了的进程,即使SIGCONT信号被阻塞或被忽略,此进程也将会继续进行。
 18.     SIGSTOP:中断进程的信号。它是一个作业信号,同时也是不可被捕捉和被忽略的信号之一。
 19.     SIGTSTP:交互式的中断信号。通常是在输入中断键Ctrl+Z时,由终端驱动器所产生。
 20.     SIGTTIN:当一个后台进程需要从终端读取数据时,终端驱动器产生的信号。当读取数据的进程忽略或阻塞这个信号,或者读取数据的进程所在的进程组是孤立进程组时,信号不会产生,并且读操作会发生错误返回,将errno置EIO。
 21.     SIGTTOU:当一个后台进程需要向终端写入数据时,终端驱动器产生的信号。当写入数据的进程忽略或阻塞这个信号,或者写数据的进程所在的进程组是孤立进程组时,信号不会产生,并且写操作会发生错误返回,将errno置EIO。与SIGTTIN不同的是,进程可以选择对控制终端进行后台写。如果后台写不被允许则同SIGTTIN信号一样。
 22.     SIGURG:套接字上出现出现紧急情况时产生的信号。
 23.     SIGXCPU:超出CPU时间限制时产生的信号。
 24.     SIGXFSZ:超出文件大小时产生的信号。
 25.     SIGVTALRM:虚拟定时器报警信号。
 26.     SIGPROF:Profiling定时器报警信号。
 27.     SIGWINCH:终端窗口改变时产生的信号。
 28.     SIGIO:表示某个特定文件描述符上可以进行I/O操作的信号。
 29.     SIGPWR:电源失效信号。
 30.     SIGABRT:调用abort函数时产生的信号,将会使进程非正常结束。
 31.     SIGEMT:实现性定义硬件错误发生时产生的信号。

二、信号的处理

 信号是用于处理异步事件的发生的。在一个进程执行过程中,如果有信号被发送到该进程,则该进程将按预先设定好的处理方法进行相应处理。总体上来讲,当信号发生时,进程所采取的处理方法可以分为两种:

 1.         捕捉信号。当某个信号被发送到一个正在运行的进程时,该进程及对此特定信号注册相应的信号处理函数,以完成所需处理。也就是说,在编写程序代码时,对需要进行捕捉处理的信号给出相应的处理程序代码。一旦接收到此信号,则通知系统调用相应信号处理函数做出处理。对应于每一个信号,系统中都有相应的缺省处理函数(通常为终止进程)。可以设定进程在信号发生时使用缺省处理函数进行处理。
 2.         忽略信号。当不希望接收到的信号对进程的执行产生影响,而让进程继续进行时,可以忽略该信号。进程将继续进行而不对信号进行任何处理。


原文链接:http://hi.baidu.com/xiboliya/blog/item/f60153ee5a5fa8f3b2fb95b6.html

Linux线程-sysconf系统变量

使用sysconf( )

了解系统的线程资源限制是使得应用程序恰当地管理它们的关键。前面已经讨论了利用系统资源的示例。当设置线程的栈大小时,最小值为PTHREAD_MIN_STACK。栈大小不应当低于由pthread_attr_getstacksize( )返回的默认栈大小的最小值。每个进程的最大线程数决定了能够为每个进程创建的worker线程的上限。函数sysconf( )用于返回可配置系统限制或选项的当前值。系统中定义了同线程、进程和信号量相关的多个变量和常量。在表6-8中,列出了部分变量和常量。

表6-8

    

名字值(Name Value)

    

_SC_THREADS

_POSIX_THREADS

支持线程

_SC_THREAD_ATTR_

STACKADDR

_POSIX_THREAD_ATTR_

STACKADDR

支持线程栈地址属性

_SC_THREAD_ATTR_

STACKSIZE

_POSIX_THREAD_ATTR_

STACKSIZE

支持线程栈大小属性

_SC_THREAD_STACK_MIN

PTHREAD_STACK_MIN

线程栈存储区的

最小大小,以字节为单位


(续表)

    

名字值(Name Value)

    

_SC_THREAD_THREADS_MAX

PTHREAD_THREADS_MAX

每个进程的

最大线程数

_SC_THREAD_KEYS_MAX

PTHREAD_KEYS_MAX

每个进程关键

字的最大数目

_SC_THREAD_PRIO_INHERIT

_POSIX_THREAD_PRIO_

INHERIT

支持优先

级继承选项

_SC_THREAD_PRIO

_POSIX_THREAD_PRIO_

支持线程

优先级选项

_SC_THREAD_PRIORITY_

SCHEDULING

_POSIX_THREAD_PRIORITY_

SCHEDULING

支持线程优

先级调度选项

_SC_THREAD_PROCESS_

SHARED

_POSIX_THREAD_PROCESS_

SHARED

支持进程共享同步

_SC_THREAD_SAFE_

FUNCTIONS

_POSIX_THREAD_SAFE_

FUNCTIONS

支持线程安全函数

_SC_THREAD_DESTRUCTOR_

ITERATIONS

_PTHREAD_THREAD_

DESTRUCTOR_ITERATIONS

决定在线程退

出时尝试销毁

线程特定数据

的尝试次数

_SC_CHILD_MAX

CHILD_MAX

每个UID允许

的最大进程数目

_SC_PRIORITY_SCHEDULING

_POSIX_PRIORITY_

SCHEDULING

支持进程调度

_SC_REALTIME_SIGNALS

_POSIX_

REALTIME_SIGNALS

支持实时信号

_SC_XOPEN_REALTIME_

THREADS

_XOPEN_

REALTIME_THREADS

支持X/Open

POSIX实时

线程特性组

_SC_STREAM_MAX

STREAM_MAX

决定进程能够

打开的流的数目

_SC_SEMAPHORES

_POSIX_SEMAPHORES

支持信号量

_SC_SEM_NSEMS_MAX

SEM_NSEMS_MAX

决定线程能

够拥有的信号

量的最大数目

_SC_SEM_VALUE_MAX

SEM_VALUE_MAX

决定信号量的最大值

_SC_SHARED_MEMORY_

OBJECTS

_POSIX_SHARED_MEMORY_

OBJECTS

支持共享内存对象

 

下面是调用sysconf( )的示例:

代码中将sysconf( )返回的_SC_THREAD_STACK_MIN的值同PTHREAD_STACK_MIN这个常量值进行了比较。

int epoll_create(int size) size参数的含义

 Since Linux 2.6.8, the size argument is unused.  (The kernel dynamically sizes
the required data structures without needing this initial hint.)

http://www.kernel.org/doc/man-pages/online/pages/man2/epoll_create.2.html



DoxyGen常用标记

Doxygen可以为C++, C, Java, IDL (Corba and Microsoft flavors) PHP和C#生成文档 


大致用途有三:
1. 可以生成一个在线html文档或者一个离线的LATEX格式文档也支持RTF(MS-Word) PostScript, hyperlinked PDF, compressed HTML, 和Unix man pages多种格式生成。文档直接由源码生成,这使得保持文档和代码一致性更加轻松。 


2. 可以配置doxygen从无文档的源码中提取代码结构。这就便于在大型源码中迅速上路。也可以将这些不同元素间的关系使用图形表达出来,包括依赖图,继承图和collaboration图,这些都是自动生成的。 


3. 甚至可以使用它来生成平常的文档,例如手册

标记以“\”开头,或是一个“@”(使用JavaDoc风格),后面是命令名和一或多个参数。

这些标记都是写在注释块中的,详见随邮件的例子(_common\obj.h)。

说明类型:
分为摘要说明和详细说明
   \brief 后紧跟摘要说明,也可以直接使用“//!”开始注释。
  
详细说明:在摘要说明后,间隔一行书写,见实例。
  
基本结构的说明标记:
\file [file name] 写文件的说明, 后跟此文件的文件名;另起一行书写此文件的说明文字。
\class [class name] 写类的说明,后跟类名;另起一行书写类的说明文字。


用于函数内部的说明标记:
这些标记会在函数的详细说明中使用不同的字体和格式,突出显示。
\param [param name] 写函数参数的说明,后跟参数名;紧跟参数的说明文字。
\return     写函数返回值得说明,后紧跟返回值得说明。
\warning    警告,后紧跟警告的内容。
\remarks    评论,后紧跟评论的内容。

可单独生成主题的说明标记:
\todo     被此标记说明的代码会在Todo列表中出现。
\bug     被此标记说明的代码会在Bug列表中出现。
\test     被此标记说明的代码会在Test列表中出现。
\deprecated    被此标记说明的代码会在deprecated列表中出现。

\defgroup [group name] [brief] 定义一个代码块,可对代码块写说明;注意group name必须是唯一的;
           另起一行写详细说明
   \{ 代码块开始
   \} 代码块技术


格式化说明标记:
– 主题
   -# 子标题1\n
    说明
   -# 子标题2\n
    说明
生成文档中可显示为编号的列表
注意:在注释中,可完全使用html格式化标记。

@author           作者
@brief              摘要
@version          版本号
@date              日期
@file                文件名,可以默认为空,DoxyGen会自己加
@class             类名
@param            函数参数
@return            函数返回值描述
@exception       函数抛异常描述
@warning         函数使用中需要注意的地方
@remarks        备注
@see               see also字段
@note             brief下空一行后的内容表示详细描述,但也可以不空行用note表示
@par               开始一个段落,段落名称描述由你自己指定,比如可以写一段示例代码
@code             引用代码段
@endcode       引用代码段结束
@pre                函数前置条件,比如对输入参数的要求
@post             函数后置条件,比如对系统状态的影响或返回参数的结果预期

不太常用的标记:

@defgroup       模块名
@name             分组名
@{                   模块开始
@}                   模块结束
@deprecated     今后可能将被废弃或已经有替代品的函数
@since             从哪个版本后开始有这个函数的
@todo              被标记的代码会在ToDo列表中出现
@bug               被标记的代码会在Bug列表中出现
@test               被标记的代码会在Test列表中出现
–                      一级项目符号
-#                   二级项目符号

深入理解Linux系统下proc文件系统内容

http://www.itshanghai.net/technology/2009/0209/article_238.html

 
  • 内容摘要:Linux系统上的/proc目录是一种文件系统,即proc文件系统。
Linux系统上的/proc目录是一种文件系统,即proc文件系统。与其它常见的文件系统不同的是,/proc是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,用户可以通过这些文件查看有关系统硬件及当前正在运行进程的信息,甚至可以通过更改其中某些文件来改变内核的运行状态。

基于/proc文件系统如上所述的特殊性,其内的文件也常被称作虚拟文件,并具有一些独特的特点。例如,其中有些文件虽然使用查看命令查看时会返回大量信息,但文件本身的大小却会显示为0字节。此外,这些特殊文件中大多数文件的时间及日期属性通常为当前系统时间和日期,这跟它们随时会被刷新(存储于RAM中)有关。

为了查看及使用上的方便,这些文件通常会按照相关性进行分类存储于不同的目录甚至子目录中,如/proc/scsi目录中存储的就是当前系统上所有SCSI设备的相关信息,/proc/N中存储的则是系统当前正在运行的进程的相关信息,其中N为正在运行的进程(可以想象得到,在某进程结束后其相关目录则会消失)。

大多数虚拟文件可以使用文件查看命令如cat、more或者less进行查看,有些文件信息表述的内容可以一目了然,但也有文件的信息却不怎么具有可读性。不过,这些可读性较差的文件在使用一些命令如apm、free、lspci或top查看时却可以有着不错的表现。

一、        进程目录中的常见文件介绍

/proc目录中包含许多以数字命名的子目录,这些数字表示系统当前正在运行进程的进程号,里面包含对应进程相关的多个信息文件。

[root@rhel5 ~]# ll /proc
total 0
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 1
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 10
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 11
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 1156
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 139
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 140
dr-xr-xr-x  5 root      root              0 Feb  8 17:08 141
dr-xr-xr-x  5 root      root              0 Feb  8 17:09 1417
dr-xr-xr-x  5 root      root              0 Feb  8 17:09 1418

上面列出的是/proc目录中一些进程相关的目录,每个目录中是当程本身相关信息的文件。下面是作者系统(RHEL5.3)上运行的一个PID为2674的进程saslauthd的相关文件,其中有些文件是每个进程都会具有的,后文会对这些常见文件做出说明。

[root@rhel5 ~]# ll /proc/2674
total 0
dr-xr-xr-x 2 root root 0 Feb  8 17:15 attr
-r——– 1 root root 0 Feb  8 17:14 auxv
-r–r–r– 1 root root 0 Feb  8 17:09 cmdline
-rw-r–r– 1 root root 0 Feb  8 17:14 coredump_filter
-r–r–r– 1 root root 0 Feb  8 17:14 cpuset
lrwxrwxrwx 1 root root 0 Feb  8 17:14 cwd -> /var/run/saslauthd
-r——– 1 root root 0 Feb  8 17:14 environ
lrwxrwxrwx 1 root root 0 Feb  8 17:09 exe -> /usr/sbin/saslauthd
dr-x—— 2 root root 0 Feb  8 17:15 fd
-r——– 1 root root 0 Feb  8 17:14 limits
-rw-r–r– 1 root root 0 Feb  8 17:14 loginuid
-r–r–r– 1 root root 0 Feb  8 17:14 maps
-rw——- 1 root root 0 Feb  8 17:14 mem
-r–r–r– 1 root root 0 Feb  8 17:14 mounts
-r——– 1 root root 0 Feb  8 17:14 mountstats
-rw-r–r– 1 root root 0 Feb  8 17:14 oom_adj
-r–r–r– 1 root root 0 Feb  8 17:14 oom_score
lrwxrwxrwx 1 root root 0 Feb  8 17:14 root -> /
-r–r–r– 1 root root 0 Feb  8 17:14 schedstat
-r——– 1 root root 0 Feb  8 17:14 smaps
-r–r–r– 1 root root 0 Feb  8 17:09 stat
-r–r–r– 1 root root 0 Feb  8 17:14 statm
-r–r–r– 1 root root 0 Feb  8 17:10 status
dr-xr-xr-x 3 root root 0 Feb  8 17:15 task
-r–r–r– 1 root root 0 Feb  8 17:14 wchan

1.1、cmdline — 启动当前进程的完整命令,但僵尸进程目录中的此文件不包含任何信息;

[root@rhel5 ~]# more /proc/2674/cmdline
/usr/sbin/saslauthd

1.2、cwd — 指向当前进程运行目录的一个符号链接;

1.3、environ — 当前进程的环境变量列表,彼此间用空字符(NULL)隔开;变量用大写字母表示,其值用小写字母表示;

[root@rhel5 ~]# more /proc/2674/environ
TERM=linuxauthd

1.4、exe — 指向启动当前进程的可执行文件(完整路径)的符号链接,通过/proc/N/exe可以启动当前进程的一个拷贝;

1.5、fd — 这是个目录,包含当前进程打开的每一个文件的文件描述符(file descriptor),这些文件描述符是指向实际文件的一个符号链接;

[root@rhel5 ~]# ll /proc/2674/fd
total 0
lrwx—— 1 root root 64 Feb  8 17:17 0 -> /dev/null
lrwx—— 1 root root 64 Feb  8 17:17 1 -> /dev/null
lrwx—— 1 root root 64 Feb  8 17:17 2 -> /dev/null
lrwx—— 1 root root 64 Feb  8 17:17 3 -> socket:[7990]
lrwx—— 1 root root 64 Feb  8 17:17 4 -> /var/run/saslauthd/saslauthd.pid
lrwx—— 1 root root 64 Feb  8 17:17 5 -> socket:[7991]
lrwx—— 1 root root 64 Feb  8 17:17 6 -> /var/run/saslauthd/mux.accept

1.6、limits — 当前进程所使用的每一个受限资源的软限制、硬限制和管理单元;此文件仅可由实际启动当前进程的UID用户读取;(2.6.24以后的内核版本支持此功能);

1.7、maps — 当前进程关联到的每个可执行文件和库文件在内存中的映射区域及其访问权限所组成的列表;

[root@rhel5 ~]# cat /proc/2674/maps
00110000-00239000 r-xp 00000000 08:02 130647     /lib/libcrypto.so.0.9.8e
00239000-0024c000 rwxp 00129000 08:02 130647     /lib/libcrypto.so.0.9.8e
0024c000-00250000 rwxp 0024c000 00:00 0
00250000-00252000 r-xp 00000000 08:02 130462     /lib/libdl-2.5.so
00252000-00253000 r-xp 00001000 08:02 130462     /lib/libdl-2.5.so

1.8、mem — 当前进程所占用的内存空间,由open、read和lseek等系统调用使用,不能被用户读取;

1.9、root — 指向当前进程运行根目录的符号链接;在Unix和Linux系统上,通常采用chroot命令使每个进程运行于独立的根目录;

1.10、stat — 当前进程的状态信息,包含一系统格式化后的数据列,可读性差,通常由ps命令使用;

1.11、statm — 当前进程占用内存的状态信息,通常以“页面”(page)表示;

1.12、status — 与stat所提供信息类似,但可读性较好,如下所示,每行表示一个属性信息;其详细介绍请参见 proc的man手册页;

[root@rhel5 ~]# more /proc/2674/status
Name:   saslauthd
State:  S (sleeping)
SleepAVG:       0%
Tgid:   2674
Pid:    2674
PPid:   1
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 32
Groups:
VmPeak:     5576 kB
VmSize:     5572 kB
VmLck:         0 kB
VmHWM:       696 kB
VmRSS:       696 kB
…………

1.13、task — 目录文件,包含由当前进程所运行的每一个线程的相关信息,每个线程的相关信息文件均保存在一个由线程号(tid)命名的目录中,这类似于其内容类似于每个进程目录中的内容;(内核2.6版本以后支持此功能)

二、/proc目录下常见的文件介绍

2.1、/proc/apm
高级电源管理(APM)版本信息及电池相关状态信息,通常由apm命令使用;

2.2、/proc/buddyinfo
用于诊断内存碎片问题的相关信息文件;

2.3、/proc/cmdline
在启动时传递至内核的相关参数信息,这些信息通常由lilo或grub等启动管理工具进行传递;

[root@rhel5 ~]# more /proc/cmdline
ro root=/dev/VolGroup00/LogVol00 rhgb quiet

2.4、/proc/cpuinfo
处理器的相关信息的文件;

2.5、/proc/crypto
系统上已安装的内核使用的密码算法及每个算法的详细信息列表;

[root@rhel5 ~]# more /proc/crypto
name         : crc32c
driver       : crc32c-generic
module       : kernel
priority     : 0
type         : digest
blocksize    : 32
digestsize   : 4
…………

2.6、/proc/devices
系统已经加载的所有块设备和字符设备的信息,包含主设备号和设备组(与主设备号对应的设备类型)名;

[root@rhel5 ~]# more /proc/devices
Character devices:
  1 mem
  4 /dev/vc/0
  4 tty
  4 ttyS
  …………

Block devices:
  1 ramdisk
  2 fd
  8 sd
  …………

2.7、/proc/diskstats
每块磁盘设备的磁盘I/O统计信息列表;(内核2.5.69以后的版本支持此功能)

2.8、/proc/dma
每个正在使用且注册的ISA DMA通道的信息列表;

[root@rhel5 ~]# more /proc/dma
2: floppy
4: cascade

2.9、/proc/execdomains
内核当前支持的执行域(每种操作系统独特“个性”)信息列表;

[root@rhel5 ~]# more /proc/execdomains
0-0     Linux                   [kernel]

2.10、/proc/fb
帧缓冲设备列表文件,包含帧缓冲设备的设备号和相关驱动信息;

2.11、/proc/filesystems
当前被内核支持的文件系统类型列表文件,被标示为nodev的文件系统表示不需要块设备的支持;通常mount一个设备时,如果没有指定文件系统类型将通过此文件来决定其所需文件系统的类型;

[root@rhel5 ~]# more /proc/filesystems
nodev   sysfs
nodev   rootfs
nodev   proc
        iso9660
        ext3
…………
…………

2.12、/proc/interrupts
X86或X86_64体系架构系统上每个IRQ相关的中断号列表;多路处理器平台上每个CPU对于每个I/O设备均有自己的中断号;

[root@rhel5 ~]# more /proc/interrupts
           CPU0      
  0:    1305421    IO-APIC-edge  timer
  1:         61    IO-APIC-edge  i8042
185:       1068   IO-APIC-level  eth0
…………

2.13、/proc/iomem
每个物理设备上的记忆体(RAM或者ROM)在系统内存中的映射信息;

[root@rhel5 ~]# more /proc/iomem
00000000-0009f7ff : System RAM
0009f800-0009ffff : reserved
000a0000-000bffff : Video RAM area
000c0000-000c7fff : Video ROM
  …………
3.2.12. /proc/iomem
http://www.centos.org/docs/5/html/5.1/Deployment_Guide/s2-proc-iomem.html

This file shows you the current map of the system\’s memory for each physical device:

The first column displays the memory registers used by each of the different types of memory. The second column lists the kind of memory located within those registers and displays which memory registers are used by the kernel within the system RAM or, if the network interface card has multiple Ethernet ports, the memory registers assigned for each port.

/opt/qtmarvell/mvqt # cat /proc/iomem
00000000-0fffffff : System RAM
  0002b000-00554fff : Kernel text
  00556000-005a22f3 : Kernel data
10000000-1fffffff : System RAM
e0000000-e7ffffff : PEX0 Memory
  e0000000-e0003fff : 0000:00:01.0
  e0004000-e0004fff : 0000:00:01.0
e8000000-efffffff : PEX1 Memory
f1012100-f10121ff : serial8250.0
  f1012100-f101211f : serial
f1090000-f10903ff : mvsdio
  f1090000-f10903ff : mvsdio
f10a0000-f10a3fff : mv88fx_snd.0
  f10a0000-f10a3fff : mv88fx_snd
f10c0000-f10d0000 : dovefb.0  寄存器地址映射到这个
  f10c0000-f10d0000 : dovefb_ovly.0

 

/opt/qtmarvell/mvqt # ./framebuffer
The framebuffer device was opened successfully.

Fixed screen info:
        id:          GFX Layer 0
        smem_start:  0x12000000
        smem_len:    33554432
        type:        0
        type_aux:    0
        visual:      2
        xpanstep:    1
        ypanstep:    1
        ywrapstep:   0
        line_length: 2560
        mmio_start:  0xf10c0000
        mmio_len:    65537

2.14、/proc/ioports
当前正在使用且已经注册过的与物理设备进行通讯的输入-输出端口范围信息列表;如下面所示,第一列表示注册的I/O端口范围,其后表示相关的设备;

[root@rhel5 ~]# less /proc/ioports
0000-001f : dma1
0020-0021 : pic1
0040-0043 : timer0
0050-0053 : timer1
0060-006f : keyboard
…………

2.15、/proc/kallsyms
模块管理工具用来动态链接或绑定可装载模块的符号定义,由内核输出;(内核2.5.71以后的版本支持此功能);通常这个文件中的信息量相当大;

[root@rhel5 ~]# more /proc/kallsyms
c04011f0 T _stext
c04011f0 t run_init_process
c04011f0 T stext
  …………

2.16、/proc/kcore
系统使用的物理内存,以ELF核心文件(core file)格式存储,其文件大小为已使用的物理内存(RAM)加上4KB;这个文件用来检查内核数据结构的当前状态,因此,通常由GBD通常调试工具使用,但不能使用文件查看命令打开此文件;

2.17、/proc/kmsg
此文件用来保存由内核输出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要试图使用查看命令打开此文件;

2.18、/proc/loadavg
保存关于CPU和磁盘I/O的负载平均值,其前三列分别表示每1秒钟、每5秒钟及每15秒的负载平均值,类似于uptime命令输出的相关信息;第四列是由斜线隔开的两个数值,前者表示当前正由内核调度的实体(进程和线程)的数目,后者表示系统当前存活的内核调度实体的数目;第五列表示此文件被查看前最近一个由内核创建的进程的PID;

[root@rhel5 ~]# more /proc/loadavg
0.45 0.12 0.04 4/125 5549

[root@rhel5 ~]# uptime
06:00:54 up  1:06,  3 users,  load average: 0.45, 0.12, 0.04

2.19、/proc/locks
保存当前由内核锁定的文件的相关信息,包含内核内部的调试数据;每个锁定占据一行,且具有一个惟一的编号;如下输出信息中每行的第二列表示当前锁定使用的锁定类别,POSIX表示目前较新类型的文件锁,由lockf系统调用产生,FLOCK是传统的UNIX文件锁,由flock系统调用产生;第三列也通常由两种类型,ADVISORY表示不允许其他用户锁定此文件,但允许读取,MANDATORY表示此文件锁定期间不允许其他用户任何形式的访问;

[root@rhel5 ~]# more /proc/locks
1: POSIX  ADVISORY  WRITE 4904 fd:00:4325393 0 EOF
2: POSIX  ADVISORY  WRITE 4550 fd:00:2066539 0 EOF
3: FLOCK  ADVISORY  WRITE 4497 fd:00:2066533 0 EOF

2.20、/proc/mdstat
保存RAID相关的多块磁盘的当前状态信息,在没有使用RAID机器上,其显示为如下状态:

[root@rhel5 ~]# less /proc/mdstat
Personalities :
unused devices: <none>

2.21、/proc/meminfo
系统中关于当前内存的利用状况等的信息,常由free命令使用;可以使用文件查看命令直接读取此文件,其内容显示为两列,前者为统计属性,后者为对应的值;

[root@rhel5 ~]# less /proc/meminfo
MemTotal:       515492 kB
MemFree:          8452 kB
Buffers:         19724 kB
Cached:         376400 kB
SwapCached:          4 kB
…………

2.22、/proc/mounts
在内核2.4.29版本以前,此文件的内容为系统当前挂载的所有文件系统,在2.4.19以后的内核中引进了每个进程使用独立挂载名称空间的方式,此文件则随之变成了指向/proc/self/mounts(每个进程自身挂载名称空间中的所有挂载点列表)文件的符号链接;/proc/self是一个独特的目录,后文中会对此目录进行介绍;

[root@rhel5 ~]# ll /proc |grep mounts
lrwxrwxrwx  1 root      root             11 Feb  8 06:43 mounts -> self/mounts

如下所示,其中第一列表示挂载的设备,第二列表示在当前目录树中的挂载点,第三点表示当前文件系统的类型,第四列表示挂载属性(ro或者rw),第五列和第六列用来匹配/etc/mtab文件中的转储(dump)属性;


[root@rhel5 ~]# more /proc/mounts
rootfs / rootfs rw 0 0
/dev/root / ext3 rw,data=ordered 0 0
/dev /dev tmpfs rw 0 0
/proc /proc proc rw 0 0
/sys /sys sysfs rw 0 0
/proc/bus/usb /proc/bus/usb usbfs rw 0 0
…………

2.23、/proc/modules
当前装入内核的所有模块名称列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模块名,第二列表示此模块占用内存空间大小,第三列表示此模块有多少实例被装入,第四列表示此模块依赖于其它哪些模块,第五列表示此模块的装载状态(Live:已经装入;Loading:正在装入;Unloading:正在卸载),第六列表示此模块在内核内存(kernel memory)中的偏移量;

[root@rhel5 ~]# more /proc/modules
autofs4 24517 2 – Live 0xe09f7000
hidp 23105 2 – Live 0xe0a06000
rfcomm 42457 0 – Live 0xe0ab3000
l2cap 29505 10 hidp,rfcomm, Live 0xe0aaa000
…………

2.24、/proc/partitions
块设备每个分区的主设备号(major)和次设备号(minor)等信息,同时包括每个分区所包含的块(block)数目(如下面输出中第三列所示);

[root@rhel5 ~]# more /proc/partitions
major minor  #blocks  name

   8     0   20971520 sda
   8     1     104391 sda1
   8     2    6907950 sda2
   8     3    5630782 sda3
   8     4          1 sda4
   8     5    3582463 sda5

2.25、/proc/pci
内核初始化时发现的所有PCI设备及其配置信息列表,其配置信息多为某PCI设备相关IRQ信息,可读性不高,可以用“/sbin/lspci –vb”命令获得较易理解的相关信息;在2.6内核以后,此文件已为/proc/bus/pci目录及其下的文件代替;

2.26、/proc/slabinfo
在内核中频繁使用的对象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了这些对象相关slap的信息;详情可以参见内核文档中slapinfo的手册页;

[root@rhel5 ~]# more /proc/slabinfo
slabinfo – version: 2.1
# name            <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <limit> <batchcount> <sharedfactor> : slabdata <ac
tive_slabs> <num_slabs> <sharedavail>
rpc_buffers            8      8   2048    2    1 : tunables   24   12    8 : slabdata      4      4      0
rpc_tasks              8     20    192   20    1 : tunables  120   60    8 : slabdata      1      1      0
rpc_inode_cache        6      9    448    9    1 : tunables   54   27    8 : slabdata      1      1      0
…………
…………
…………

2.27、/proc/stat
实时追踪自系统上次启动以来的多种统计信息;如下所示,其中,
“cpu”行后的八个值分别表示以1/100(jiffies)秒为单位的统计值(包括系统运行于用户模式、低优先级用户模式,运系统模式、空闲模式、I/O等待模式的时间等);
“intr”行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数;
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒;
“processes (total_forks) 自系统启动以来所创建的任务的个数目;
“procs_running”:当前运行队列的任务的数目;
“procs_blocked”:当前被阻塞的任务的数目;

[root@rhel5 ~]# more /proc/stat
cpu  2751 26 5771 266413 2555 99 411 0
cpu0 2751 26 5771 266413 2555 99 411 0
intr 2810179 2780489 67 0 3 3 0 5 0 1 0 0 0 1707 0 0 9620 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5504 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12781 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 427300
btime 1234084100
processes 3491
procs_running 1
procs_blocked 0

2.28、/proc/swaps
当前系统上的交换分区及其空间利用信息,如果有多个交换分区的话,则会每个交换分区的信息分别存储于/proc/swap目录中的单独文件中,而其优先级数字越低,被使用到的可能性越大;下面是作者系统中只有一个交换分区时的输出信息;

[root@rhel5 ~]# more /proc/swaps
Filename                                Type            Size    Used    Priority
/dev/sda8                               partition       642560  0       -1

2.29、/proc/uptime
系统上次启动以来的运行时间,如下所示,其第一个数字表示系统运行时间,第二个数字表示系统空闲时间,单位是秒;

[root@rhel5 ~]# more /proc/uptime
3809.86 3714.13

2.30、/proc/version
当前系统运行的内核版本号,在作者的RHEL5.3上还会显示系统安装的gcc版本,如下所示;

[root@rhel5 ~]# more /proc/version
Linux version 2.6.18-128.el5 (mockbuild@hs20-bc1-5.build.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-44)) #1 SMP Wed Dec 17 11:42:39 EST 2008

2.31、/proc/vmstat
当前系统虚拟内存的多种统计数据,信息量可能会比较大,这因系统而有所不同,可读性较好;下面为作者机器上输出信息的一个片段;(2.6以后的内核支持此文件)

[root@rhel5 ~]# more /proc/vmstat
nr_anon_pages 22270
nr_mapped 8542
nr_file_pages 47706
nr_slab 4720
nr_page_table_pages 897
nr_dirty 21
nr_writeback 0
…………

2.32、/proc/zoneinfo
内存区域(zone)的详细信息列表,信息量较大,下面列出的是一个输出片段:

[root@rhel5 ~]# more /proc/zoneinfo
Node 0, zone      DMA
  pages free     1208
        min      28
        low      35
        high     42
        active   439
        inactive 1139
        scanned  0 (a: 7 i: 30)
        spanned  4096
        present  4096
    nr_anon_pages 192
    nr_mapped    141
    nr_file_pages 1385
    nr_slab      253
    nr_page_table_pages 2
    nr_dirty     523
    nr_writeback 0
    nr_unstable  0
    nr_bounce    0
        protection: (0, 0, 296, 296)
  pagesets
  all_unreclaimable: 0
  prev_priority:     12
  start_pfn:         0
…………

三、/proc/sys目录详解

与 /proc下其它文件的“只读”属性不同的是,管理员可对/proc/sys子目录中的许多文件内容进行修改以更改内核的运行特性,事先可以使用“ls -l”命令查看某文件是否“可写入”。写入操作通常使用类似于“echo  DATA > /path/to/your/filename”的格式进行。需要注意的是,即使文件可写,其一般也不可以使用编辑器进行编辑。

3.1、/proc/sys/debug 子目录
此目录通常是一空目录;

3.2、/proc/sys/dev 子目录
为系统上特殊设备提供参数信息文件的目录,其不同设备的信息文件分别存储于不同的子目录中,如大多数系统上都会具有的/proc/sys/dev /cdrom和/proc/sys/dev/raid(如果内核编译时开启了支持raid的功能) 目录,其内存储的通常是系统上cdrom和raid的相关参数信息文件。