标签:
线程-》信号
信号,是unix和linux系统响应某些条件而产生的一个事件。接收到该信号的进程会相应地采取一些行动。
raise生成表示一个信号的产生
catch捕获表示接受到一个信号的产生;信号是由于某些错误条件而产生,内存段冲突,浮点处理器错误或者非法指令等。它们由shell和终端处理器生成
引起中断,可以作为进程见传递消息或修改行为的一种方式,明确地由一个进程发送给另一个进程。无论什么情况,它们的编程接口都是相同的,信号可以被
生成,捕获,响应,忽略。
signal.h======
sigabort *进程异常终止
sigalrm 超时警告
sigfpe *浮点运算错误
sighup 链接挂断
sigill *非法指令
sigint 终端中断
sigkill 终止进程(此信号不能被不或忽略)
sigpipe 向无读进程的管道写数据
sigquit 中断退出
sigsegv *无效内存段访问
sigterm 终止
siguser1 用户定义信号
siguser2 用户定义信号2
注意:*表示系统对信号的响应随具体实现而定
-----------》如果进程接受到这些信号中的一个,但事先没有安排不或他,进程将会立刻终止。通常系统会生产核心转储文件core,并将其放在当前
目录下。该文件是进程自爱内存中的印象,他对程序的调试很有帮助。
其他信号
sigchld 子进程已经停止或退出
sigcont 继续执行暂停进程
sigstop 停止执行(此信号不能被捕获或忽略)
sigstsp 终端挂起
sigttin 后台进程尝试读操作
sigttou 后台进程尝试写操作
如果shell和终端驱动程序是按通常情况配置的话,在键盘上敲入中断字符(Ctrl+C)就会向前台(即当前正在执行的程序)发生sigint信号,这将引起该
进程的终止,除非它事先安排了捕获这个信号。
如果想发送一个命令给进程,但该进程不是当前的前台进程,就需要使用kill命令,该命令需要
一个可选的信号代码或信号名称和
一个接受信号的目标进程的PID(pid一般需要ps命令查看)
kill -- 发送一个命令给一个进程,常用的信号包括HUP,INT,KILL,STOP,CONT,0.
程序可以使用signal库函数来处理信号,
#include <signal.h>
void (*signal(int sig,void (*func)(int)))(int);
signal是一个带有sig和func两个参数的函数;
准备捕获/忽略的信号有参数sig给出,接受到指定的信号后将要调用的函数由参数func给出,
信号处理函数必须有一个int类型的参数(即接收到的信号代码)并且返回类型为void,
signal函数本身也返回一个同类型的函数,即先前用来处理这个信号的函数(不是func函数);
返回的是先前对指定信号进行处理的信号处理函数的函数指针,如果未定义信号处理函数,则返回SIG_ERR,并设置errno为一个正整数值,
如果给出的是一个无效的信号,或者尝试处理的信号不可捕获/不可忽略(如SIGKILL),errno将被设置为EINVAL。
也可以使用特殊值(sig_ign,sig_dfl)来代替信号处理函数;
sig_ign 忽略信号
sig_dfl 恢复默认信号
-----------------------
信号处理例子:编写一个程序ctrlc.c,来响应用户敲入的Ctrl+c组合键,在屏幕上打印一条适当的消息而不是终止程序的运行;再次ctrl+c时,结束。
#include <signal.h> #include <stdio.h> #include <unistd.h> void ouch(int sig) { printf("ouch! - I got signal %d\n",sig); (void) signal(SIGINT,SIG_DFL); } int main(){ (void) signal(SIGINT,ouch); while(1){ printf("hello world\n"); sleep(1); } }
main()的作用是捕获ctrl+c产生的SIGINT信号,没有信号产生时,它会在一个无限循环中打印字符;
(void) signal(SIGINT,ouch),在捕获SIGINT信号后,会调用ouch函数进行处理;
(void) signal(SIGINT,SIG_DFL),再次捕获SIGINT信号,SIG_DFL来恢复信号的默认行为;
------------
标签:
原文地址:http://www.cnblogs.com/li-daphne/p/5322608.html