信号是软件中断。信号提供了一种处理异步事件的方法。
通过 kill -l 查看所有信号
前32个(习惯上称)信号为操作系统使用的信号,后32个为实时信号,做驱动编程可能用到。
man 7 signal
那么信号是如何产生的?
1.终端按键
ctrl+c SIGINT 终端中断符
ctrl+z SIGTSTP (terminal stop)终端停止符 进程暂停
通过fg 1 继续运行
通过bg 1 后台运行
ctrl+\ SIGQUIT 终端退出符
2. 硬件异常(非法操作硬件)
(1)除以0操作,CPU不能除0,
发送8)SIGFPE 浮点数例外信号
(2)访问非法内存,(无效的内存引用)
如对只读数据段进行写操作、访问一个未初始化的指针
信号11)SIGSEGV,会报段错误
SEGV---(segmentation violation) 段违例
3.kill函数或kill命令向进程发送信号
kill 在这里本意不是杀死,而是向进程传递一个信号,默认是SIGINT
使用kill的限制:
接收信号进程和发送信号进程的所有者必须相同,或发送信号进程的所有者必须是超级用户。
int kill(pid_t pid, int sig)
pid > 0,sig发送给ID为pid的进程
pid == 0,sig发送给与发送进程同组的所有进程
pid <0,sig发送给组ID为|-pid|的进程,并且发送进程具有向其发送信号的权限pid == -1,sig发送给发送进程有权限向他们发送信号的系统上的所有进程
(sudo kill -9 -1 把进程都杀掉,就会关机)
sig为0时,用于检测,特定为pid进程是否存在,如不存在,返回-1。
4.某种软件条件已发生
如:SIGURG(在网络连接上传来带外的数据)
SIGPIPE(在管道的读进程已终止后,一个进程写此管道)
SIGALRM(定时器已经超时)
用alarm测试你的机器一秒钟可以加多少次
#include<stdio.h>
#include<unistd.h>
int main(void){
int counter;
alarm(1);
for(counter=0;1;counter++){
printf("counter=%d ",counter);
}
return 0;
}
附录:
1) SIGHUP:当用户退出shell时,由该shell启动的所有进程将收到这个信号,默认动作为终止进程
2)SIGINT:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止里程。
3)SIGQUIT:当用户按下<ctrl+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号。默认动作为终止进程。
4)SIGILL:CPU检测到某进程执行了非法指令。默认动作为终止进程并产生core文件
5)SIGTRAP:该信号由断点指令或其他 trap指令产生。默认动作为终止里程 并产生core文件。
6 ) SIGABRT:调用abort函数时产生该信号。默认动作为终止进程并产生core文件。
7)SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。
8)SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默认动作为终止进程并产生core文件。
9)SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法。
10)SIGUSE1:用户定义 的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。
11)SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。
12)SIGUSR2:这是另外一个用户自定义信号 ,程序员可以在程序中定义 并使用该信号。默认动作为终止进程。
13)SIGPIPE:Broken pipe向一个没有读端的管道写数据。默认动作为终止进程。
14) SIGALRM:定时器超时,超时的时间 由系统调用alarm设置。默认动作为终止进程。
15)SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行shell命令Kill时,缺省产生这个信号。默认动作为终止进程。
16)SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。
17)SIGCONT:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为终止进程。
18)SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。
19)SIGTSTP:停止进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。
21)SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。
22)SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据到达,默认动作为忽略该信号。
23)SIGXFSZ:进程执行时间超过了分配给该进程的CPU时间 ,系统产生该信号并发送给该进程。默认动作为终止进程。
24)SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。
25)SIGVTALRM:虚拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默认动作为终止进程。
26)SGIPROF:类似于SIGVTALRM,它不公包括该进程占用CPU时间还包括执行系统调用时间。默认动作为终止进程。
27)SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。
28)SIGIO:此信号向进程指示发出了一个异步IO事件。默认动作为忽略。
29)SIGPWR:关机。默认动作为终止进程。
30)SIGSYS:无效的系统调用。默认动作为终止进程并产生core文件。
31)SIGRTMIN~(64)SIGRTMAX:LINUX的实时信号,它们没有固定的含义(可以由用户自定义)。所有的实时信号的默认动作都为终止进程。