线程-》信号信号,是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来恢复信号的默认行为;------------
时间: 2024-10-05 07:10:10