signal

Linux系统编程信号

信号的概念

clip_image001

       信号时提供处理异步事件机制的软件中断。这些事件可以来自系统外部(用户能够通过输入CTRL+cCtrl+\,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号;),或者来自程序或内核内部的活动(内核:当进程执行出错时,内核会给进程发送一个信号,例如非法段存取(内存访问违规)、浮点数溢出等;进程:一个进程可以通过系统调用kill给另一个进程发送信号,一个进程可以通过信号和另外一个进程进行通信。由进程的某个操作产生的信号称为同步信号(synchronous signals),例如除0;由象用户击键这样的进程外部事件产生的信号叫做异步信号。(asynchronous signals))。

       这里要注意的是,不仅仅事件的发生是异步的,程序对信号的处理也是异步的。

三个处理信号过程

clip_image002

l  接收默认处理:接收默认处理的进程通常会导致进程本身消亡。例如连接到终端的进程,用户按下CTRL+c,将导致内核向进程发送一个SIGINT的信号,进程如果不对该信号做特殊的处理,系统将采用默认的方式处理该信号,即终止进程的执行;

l  忽略信号:进程可以通过代码,显示地忽略某个信号的处理,例如:signal(SIGINT,SIGDEF);但是某些信号是不能被忽略的;

l  捕捉信号并处理:进程可以事先注册信号处理函数,当接收到信号时,由信号处理函数自动捕捉并且处理信号。

l  注意:有两个信号既不能被忽略也不能被捕捉,它们是SIGKILLSIGSTOP。即进程接收到这两个信号后,只能接受系统的默认处理,即终止线程。

Linux支持的信号列表

可以使用kill –l来查看linux支持的信号列表

clip_image003

信号处理函数的过程:

(1)注册信号处理函数

 信号的处理是由内核来代理的,首先程序通过sigalsigaction函数为每个信号注册处理函数,而内核中维护一张信号向量表,对应信号处理机制。这样,在信号在进程中注销完毕之后,会调用相应的处理函数进行处理。

(2)信号的检测与响应时机

在系统调用或中断返回用户态的前夕,内核会检查未决信号集,进行相应的信号处理。

(3)处理过程:

程序运行在用户态时->进程由于系统调用或中断进入内核->转向用户态执行信号处理函数->信号处理函数完毕后进入内核->返回用户态继续执行程序

 首先程序执行在用户态,在进程陷入内核并从内核返回的前夕,会去检查有没有信号没有被处理,如果有且没有被阻塞就会调用相应的信号处理程序去处理。首先,内核在用户栈上创建一个层,该层中将返回地址设置成信号处理函数的地址,这样,从内核返回用户态时,就会执行这个信号处理函数。当信号处理函数执行完,会再次进入内核,主要是检测有没有信号没有处理,以及恢复原先程序中断执行点,恢复内核栈等工作,这样,当从内核返回后便返回到原先程序执行的地方了。

fork信号

clip_image005

当使用fork()函数时,子进程会继承父进程完全相同的信号语义,这也是有道理的,因为父子进程共享一个地址空间,所以父进程的信号处理程序也存在于子进程中。

 

more bash shell command

更多bash shell命令

4.1 监控程序

4.1.1 进程查看

       ps默认只显示属于当前用户并正在当前终端中运行的进程。

 

       Linux系统中使用的GNU ps命令支持3中不同的命令行:

l  Unix类型参数:前面有一个短划线;

l  BSD类型参数:前面没有短划线;

l  GNU长参数:前面有双短划线;

 

ps –H 可以将进程组织为分层格式,可以显示哪些流程是随其他进程一起启动的。

4.1.2 实时进程监控

       top命令可以内存中换进换出的进程,它是实时模式,而ps只能显示特定时间点的信息。

4.1.3 停止进程

       linux中,各进程使用信号相互通信。大多数精心编写的应用程序都能够接受标准Unix进程信号,并对此作出响应。

Linux进程信号

SIGHUP     终止进程     终端线路挂断
SIGINT     
终止进程     中断进程
SIGQUIT   
建立CORE文件终止进程,并且生成core文件
SIGILL   
建立CORE文件       非法指令
SIGTRAP   
建立CORE文件       跟踪自陷
SIGBUS   
建立CORE文件       总线错误
SIGSEGV   
建立CORE文件       段非法错误
SIGFPE   
建立CORE文件       浮点异常
SIGIOT   
建立CORE文件       执行I/O自陷
SIGKILL   
终止进程     杀死进程
SIGPIPE   
终止进程     向一个没有读进程的管道写数据
SIGALARM   
终止进程     计时器到时
SIGTERM   
终止进程     软件终止信号
SIGSTOP   
停止进程     非终端来的停止信号
SIGTSTP   
停止进程     终端来的停止信号
SIGCONT   
忽略信号     继续执行一个停止的进程
SIGURG   
忽略信号     I/O紧急信号
SIGIO     
忽略信号     描述符上可以进行I/O
SIGCHLD   
忽略信号     当子进程停止或退出时通知父进程
SIGTTOU   
停止进程     后台进程写终端
SIGTTIN   
停止进程     后台进程读终端
SIGXGPU   
终止进程     CPU时限超时
SIGXFSZ   
终止进程     文件长度过长
SIGWINCH   
忽略信号     窗口大小发生变化
SIGPROF   
终止进程     统计分布图用计时器到时
SIGUSR1   
终止进程     用户定义信号1
SIGUSR2   
终止进程     用户定义信号2
SIGVTALRM
终止进程     
虚拟计时器到时

Linux提供了两个命令用于发送进程信号给运行中的进程:

l  kill命令

n  只能使用进程PID来终止信号,将发送TERM命令给指定的PID

l  killall命令

n  该命令非常强大,可以根据进程的名称来停止进程,还允许使用通配符,它对于处理出错的系统非常有用。

4.2 监控磁盘空间

4.2.1 挂载介质

       mount –t type device directory

       mount –a :挂载/etc/fstab文件中指定的所有文件系统

其中可能的类型为:

l  vfat Windows长文件系统

l  ntfs Windows高级文件系统

l  iso9660 标准CD-ROM文件系统

常用的选项:

l  ro:以只读形式挂载;

l  rw:以读写形式挂载;

l  user:允许普通用户挂载文件系统;

l  check=none:挂载文件系统,而不执行完整性检查;

l  loop:挂载某个文件

4.2.2 使用df命令

       某个设备上有多少可用磁盘空间,较常用的参数为-h,用于以可读形式显示磁盘空间。

4.2.3 使用du命令

       du命令显示当前目录下的所有的文件、目录和子目录,并显示各文件或目录占用了多大空间。可以使用参数-s来汇总各自变量。

4.3 操作数据文件

4.3.1 数据排序

       sort:默认按照标准字符排序,所以如果是数字,需要加上参数-n来将其识别为数字而不是字符,并根据数值大小对它们进行排序;使用-M参数,可以按照月份排序;使用-k-t参数可以方便对使用字段的数据进行排序,其中-t参数用于指定字段分隔符,-k参数用于指定排序的字段。

       比如可以对一个文件夹中的所有文件大小进行一个排序:du –sh * | sort –n即可。

4.3.2 搜索数据

       grep patterm file

可用使用-v参数来反向搜索;使用-n参数显示与模式匹配的数据所在的行号;使用-c参数显示有多少行包含匹配模式;使用-e参数指定多个匹配模式;

       egrep命令式grep命令的一个分支,它允许您指定POSIX扩展的正则表达式,即使用多个字符指定匹配模式;fgrep命令则允许您使用一列由换行符分隔的固定字符串值来指定匹配模式。

4.3.3 压缩数据

Linux文件压缩格式:

l  *.Z       compress 程序压缩的档案; 

l  *.bz2     bzip2 程序压缩的档案; 

l  *.gz      gzip 程序压缩的档案; 

l  *.tar     tar 程序打包的数据,并没有压缩过 

l  *.tar.gz  tar 程序打包的档案,其中并且经过gzip 的压缩!

l  *.zip     zip 程序压缩文件

l  *.rar     rar 程序压缩文件

使用bzip2的文件可以使用bzcat命令查看内容

4.3.4 归档数据

       虽然zip命令在压缩和归档数据方面格外出色,但是它不是UnixLinux世界中的标准工具。目前,UnixLinux中最流行的归档工具是tar命令。

kill pkill killall xkill

kill pkill killall xkill

clip_image002

其实对于死掉的进程,处理使用kill命令,还有其他几个可选。

与进程相关的指令

ps 报告当前进程的快照

kill 向一个进程发出信号

killall 按名字消灭进程

pkill 根据名字和其它属性查看或者发出进程信号

skill 发送一个信号或者报告进程状态

xkill 按照X资源消灭一个客户程序

 

终止一个进程或终止一个正在运行的程序,一般是通过 kill killallpkillxkill 等进行。比如一个程序已经死掉,但又不能退出,这时就应该考虑应用这些工具。

 

另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的危险。比如mysql服务器最好是按其正常的程序关闭,而不是用pkill mysqld killall mysqld 这样危险的动作;当然对于占用资源过多的数据库子进程,我们应该用kill 来杀掉。

 

killall 通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。

 

xkill 是在桌面用的杀死图形界面的程序。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。当xkill运行时出来和个人脑骨的图标,哪个图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消;