信号是进程间通信机制中唯一的异步通信机制,可以视为异步通知,通知接收信号的进程有哪些事件发生看,还可以传递附加信息。
从软件层次上说,信号是对中断机制的一种模拟,当一个进程收到一个信号与处理器收到一个中断请求是一样的。因为信号是异步的,所以一个进程不必通过任何操作来等待信号的到来,同时进程也不知道信号什么时候到来。
信号的来源分为两种:1、硬件来源:比如按下了键盘或其他硬件故障;2、软件来源:最常用发送信号的系统函数kill、raise、alarm以及一些非法操作。
信号处理方式:
1、忽略信号:即对信号不做任何处理,其中有两个信号不能忽略,即SIGKILL和SIGSTOP;
2、捕捉信号:定义信号处理函数,当信号发生时,执行相应的处理函数;
3、执行默认操作:Linux对每一种信号都规定了默认操作,进程对实时信号的默认 反应是进程终止。
但Linux究竟会采用哪一种方式来响应信号,取决于传递给相应API函数的参数。
信号发送函数:
1、kill()
功能:传递信号给指定的进程
头文件:#include <sys/types.h>
#include <signal.h>
原型:int kill(pid_t pid,int sig)
说明:将参数sig指定的信号传送给参数pid指定的进程;
pid:pid > 0,将信号传递给进程识别码位pid的进程;
pid = 0,将信号传递给和目前进程相同进程组 的所有进程;
pid = -1,将信号广播给系统所有的进程;
pid < 0,将信号传递给进程组识别码位pid绝对值的所有进程。
返回值:成功,返回0;失败,返回-1。
2、alarm()
功能:设置信号传送闹钟
头文件:#include <unistd.h>
原型:unsigned int alarm(unsigned int seconds)
说明:用来设置信号SIGALRM,在将经过参数seconds指定的秒数后传递给当前的进程;
如果seconds为0,则之前设置的闹钟会被取消,并将剩下的时间返回。
返回值:成功,返回之前闹钟的剩余秒数;如果之前没有设置闹钟则返回0。
自定义处理信号方式:
当进程要处理某一信号,那么就要在进程中安装该信号,安装信号的主要目的是用来确定信号值以及进程针对该信号值的动作之间的映射关系,即进程将要处理哪一个信号,该信号被传递给进程时,将执行何种操作。
signal()
功能:传递信号给指定的进程
头文件:#include <signal.h>
原型:void (*signal(int signum,void (*handler) (int)))(int)
说明:依照参数signum指定的信号编号来设置该信号的处理函数,当指定的信号到达时就会跳转到参数handler指定的函数执行
返回值:成功,返回先前的信号处理函数指针;错误,返回-1.