signal 异步系统事件

来源:互联网 发布:淘宝美工教程全集 编辑:程序博客网 时间:2024/06/05 11:37

signal 异步系统事件

信号由整数标示。是一个操作系统特性,它提供一个途径可以通知程序发生了一个时间并异步处理这个事件。信号可以由系统本身生成,也可以从一个进程发送到另一个进程。由于信号会中断程序的正常控制流。比如我的例子中,程序执行time.sleep(10)这个的时候,收到一个信号,那么就会立即中断而执行注册的那个函数,执行完毕之后也不会继续sleep剩下的时间,而是跳过了。还有,I/O操作可能就产生错误了。

>>> import os>>> os.getpid()4152                         #进程号,等一下发送信号的时候要用>>> def signal_handle(signum,frame_info):    print 'recv signal:%d' % signum

这是一个用来接受信号的回调函数,称为信号处理程序(signal handler),他会在出现信号的时候调用。信号处理程序的参数包括信号编号以及程序被信号中断那一个刻的帧栈。

>>> import signal   >>> while 1:    signal.signal(10,signal_handle)    import time    time.sleep(2)    print '2s'    time.sleep(10)    print '10s'02srecv signal:1010s<function sh at 0xb5735144>2srecv signal:1010s<function sh at 0xb5735144>2s10s<function sh at 0xb5735144>2srecv signal:1010s<function sh at 0xb5735144>2s

通过命令好号我们就可以发送信号了。可以使用os.kill()或者UNIX命令行程序kll向程序发送信号。

打开终端。kill -10 4152即向4152程序发送了一个信号。signal_handle函数立即被调用。

这里可以看看信号中的数字表示什么

>>> lt=[]>>> for i in dir(signal):    if i.startswith('SIG'):        lt.append((getattr(signal,i),i))>>> lt.sort()>>> for i in lt:    print i(0, 'SIG_DFL')(1, 'SIGHUP')(1, 'SIG_IGN')(2, 'SIGINT')(3, 'SIGQUIT')(4, 'SIGILL')(5, 'SIGTRAP')(6, 'SIGABRT')(6, 'SIGIOT')(7, 'SIGBUS')(8, 'SIGFPE')(9, 'SIGKILL')(10, 'SIGUSR1')(11, 'SIGSEGV')(12, 'SIGUSR2')(13, 'SIGPIPE')(14, 'SIGALRM')(15, 'SIGTERM')(17, 'SIGCHLD')(17, 'SIGCLD')(18, 'SIGCONT')(19, 'SIGSTOP')(20, 'SIGTSTP')(21, 'SIGTTIN')(22, 'SIGTTOU')(23, 'SIGURG')(24, 'SIGXCPU')(25, 'SIGXFSZ')(26, 'SIGVTALRM')(27, 'SIGPROF')(28, 'SIGWINCH')(29, 'SIGIO')(29, 'SIGPOLL')(30, 'SIGPWR')(31, 'SIGSYS')(34, 'SIGRTMIN')(64, 'SIGRTMAX')

SIGHUP 1 A 终端挂起或者控制进程终止
SIGINT 2 A 键盘中断(如break键被按下)
SIGQUIT 3 C 键盘的退出键被按下
SIGILL 4 C 非法指令
SIGABRT 6 C 由abort(3)发出的退出指令
SIGFPE 8 C 浮点异常
SIGKILL 9 AEF Kill信号
SIGSEGV 11 C 无效的内存引用
SIGPIPE 13 A 管道破裂: 写一个没有读端口的管道
SIGALRM 14 A 由alarm(2)发出的信号
SIGTERM 15 A 终止信号

SIGUSR1 30,10,16 A 用户自定义信号1
SIGUSR2 31,12,17 A 用户自定义信号2
SIGCHLD 20,17,18 B 子进程结束信号
SIGCONT 19,18,25 进程继续(曾被停止的进程)
SIGSTOP 17,19,23 DEF 终止进程
SIGTSTP 18,20,24 D 控制终端(tty)上按下停止键
SIGTTIN 21,21,26 D 后台进程企图从控制终端读
SIGTTOU 22,22,27 D 后台进程企图从控制终端写

处理动作一项中的字母含义如下:
A 缺省的动作是终止进程
B 缺省的动作是忽略此信号
C 缺省的动作是终止进程并进行内核映像转储(dump core)
D 缺省的动作是停止进程
E 信号不能被捕获
F 信号不能被忽略

0 0