1、信号的概念:信号是系统预先定义好的某些特定事件。接收到该信号的进程会采取相应的行动。
信号可以被产生,可以被接受。信号产生和接受的主体都是进程。
2、信号在系统中的定义:/usr/include/bits/signum.h/
3、信号怎样使用:
(1)信号如何发送:进程可以通过调用kill函数向包括它在内的其他进程发送一个信号。如果程序没有发送该信号的权限,
则对kill函数将调用失败,失败的常见原因是目标文件由另一个用户所拥有。
Int kill (pid_t pid , int signum)
Kill函数把参数signum指定的信号发送给由参数pid给出的进程号指定的进程。
成功时返回0,失败时返回-1。
Pid > 0 (向pid指定的进程发送信号)
Pid == 0 (发送给同一进程组的所有进程)
Pid == -1 (发送给所有进程,除系统进程)
Pid < -1 (将信号传给进程组识别码为pid绝对值的所有进程)
Int raise(int signum)//向调用这个函数的进程发送一个signum指定的信号
==》int kill (getpid(),int signum)
(2)信号如何接受 & signal 函数的底层实现
在进程PCB中成员变量signal来表示接收到的信号
task_struct *p = 当前进程的PCB
P->signal |= 1<<(signum - 1)
signal函数的实现原理:信号绑定信号处理函数
Int sys_signal(int signum ,long handler)
{
If(signum < 1 || signum > 32 || signum == SIGKILL)
return -1;
Current->sigation[signum - 1].sa_handle = handler;
return 0;
}
当信号发生后,设置PCB中signal成员变量的值,通过signal的值计算出收到的信号的值signum。
Call PCB->sigaction[signum - 1].sa_handler.
(2)信号接收以后做什么事情
信号的响应方式:
a.)默认 SIG_DFI 表示接收到此信号后的动作是系统默认动作
b.)忽略 SIG_IGN 则向内核表示忽略此信号(有两个信号SIGKILL 和SIGSTOP不能忽略)
C.)自定义(捕捉) 自己写的函数 信号发生时调用该函数,我们称这种处理为“捕捉”该信号。称此函数为信号处理程序或信号捕捉函数。
怎样修改信号的响应方式:
typedef void (*Fun_Handle)(int)
Fun_Handle signal(int signum ,Fun_Handle fun)
SIGINT 当用户按中断键(一般为DELETE或ctrl + c)时,终端驱动程序产生此信号并送至前台进程组中的每一个进程。
当一个进程运行失控时,特别是屏幕上产生大量不必要的输出,常用此信号终止它。
SIGCHLD 在一个进程终止或停止时,将SIGCHLD信号发送给其父进程。按系统默认将忽略此信号。
如果父进程希望被告知其子进程的这种状态改变,则应捕捉此信号。信号捕捉函数中通常要调用wait 这个函数来获取子进程id和终止状态。
signal函数功能:完成signum参数指定的信号与函数fun的绑定,当接受到signum这个信号执行fun函数。
如果第一次接受到信号,进入信号处理函数,主函数不会同时执行,主函数会等待信号处理函数执行完成后再接着运行。
如果信号处理函数正在被执行,信号再次被触发,则第二次触发的信号会被放到信号的等待队列当中,直到之前的信号处理函数执行完成,才会被处理。