欧美电影免费网站,广告平台,以及在增加外链时应当注意什么?,西部数码网站管理助手2基本概念
信号是事件发生时对进程的通知机制#xff0c;也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程#xff0c;其实是在软件层次上对中断机制的一种模拟。信号提供了一种处理异步事件的方法。
信号目的
**信号的目的是用来通信…基本概念
信号是事件发生时对进程的通知机制也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程其实是在软件层次上对中断机制的一种模拟。信号提供了一种处理异步事件的方法。
信号目的
**信号的目的是用来通信的。**一个具有合适权限的进程能够向另一个进程发送信号信号的这一用法可作为一种同步技术甚至是进程间通信IPC的原始形式。
可产生信号情况
发生硬件中断。中断输入能够产生信号的特殊字符。如CTRL C 组合按键可以产生中断信号SIGINT通过这个方法可以终止在前台运行的进程。进程调用 kill()系统调用可将任意信号发送给另一个进程或进程组。用户可以通过 kill 命令将信号发送给其它进程。发生了软件事件即当检测到某种软件条件已经发生。是软件的触发条件、触发了某种软件条件进程所设置的定时器已经超时、进程执行的 CPU 时间超限、进程的某个子进程退出等等情况。
信号处理
忽略信号。也就是说当信号到达进程后该进程并不会去理会它、直接忽略就好像是没有出该信号信号对该进程不会产生任何影响。事实上大多数信号都可以使用这种方式进行处理。捕获信号。当信号到达进程后执行预先绑定好的信号处理函数。通知内核在某种信号发生时执行用户自定义的处理函数该处理函数中将会对该信号事件作出相应的处理Linux 系统提供了 signal()系统调用用于注册信号的处理函数。执行系统默认操作。进程不对该信号事件作出处理而是交由系统进行处理每一种信号都会有其 对应的系统默认的处理方式。
信号是异步事件的经典实例产生信号的事件对进程而言是随机出现的这就如同硬件中断事件程序是无法得知中断事件产生的具体时间只有当产生中断事件时才会告知程序、然后打断当前程序的正常执行流程、跳转去执行中断服务函数这就是异步处理方式。
信号本质
信号本质上是 int 类型的数字编号这就好比硬件中断所对应的中断号。内核针对每个信号都给其定义了一个唯一的整数编号从数字 1 开始顺序展开。并且每一个信号都有其对应的名字其实就是一个宏信号名字与信号编号乃是一一对应关系。 这些信号在signum.h头文件中定义每个信号都是以 SIGxxx 开头。
信号分类
可以两种不同的角度进行分类。 从可靠性方面将信号分为可靠信号与不可靠信号 从实时性方面将信号分为实时信号与非实时信号
可靠信号与不可靠信号
可靠信号
Linux 信号机制基本上是从 UNIX 系统中继承过来的早期 UNIX 系统中的信号机制比较简单和原始。进程每次处理信号后就将对信号的响应设置为系统默认操作。用户如果不希望这样的操作那么就要在信号处理函数结尾再一次调用 signal()重新为该信号绑定相应的处理函数。可靠信号具有处理函数解绑现象。
不可靠信号
早期 UNIX 下的不可靠信号主要指的是进程可能对信号做出错误的反应以及信号可能丢失处理信号时又来了新的信号则导致信号丢失。Linux 支持不可靠信号但是对不可靠信号机制做了改进在调用完信号处理函数后不必重新调用signal()。Linux 下的不可靠信号问题主要指的是信号可能丢失.。在 Linux 系统下信号值小于 SIGRTMIN34的信号都是不可靠信号。编号 34~64 对应的是可靠信号。
可靠信号支持排队不会丢失同时信号的发送和绑定也出现了新版本信号发送函数 sigqueue()及信号绑定函数 sigaction()。
实时信号与非实时信号
实时信号与非实时信号其实是从时间关系上进行的分类与可靠信号与不可靠信号是相互对应的非实时信号都不支持排队都是不可靠信号实时信号都支持排队都是可靠信号。实时信号保证了发送的多个信号都能被接收实时信号是 POSIX 标准的一部分可用于应用进程。 非实时信号不可靠信号也称为标准信号.
常见信号与系统默认行为
进程对信号的处理
当进程接收到内核或用户发送过来的信号之后根据具体信号可以采取不同的处理方式忽略信号、捕获信号或者执行系统默认操作。Linux 系统提供了系统调用 signal()和 sigaction()两个函数用于设置信号的处理方式。
signal()函数
Linux 系统下设置信号处理方式最简单的接口可将信号的处理方式设置为捕获信号、忽略信号以及系统默认操作。
#include signal.h
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);函数参数和返回值 signum:该参数需要设置指定的信号建议使用信号名。 handler:sighandler_t类型的函数指针指向信号对应的信号处理函数当进程接收到信号后自动执行该处理函数 参数 handler 既可以设置为用户自定义的函数也就是捕获信号时需要执行的处理函数也可以设置为 SIG_IGN 或 SIG_DFL SIG_IGN 表示此进程需要忽略该信号 SIG_DFL 则表示设置为系统默认操作。 sighandler_t 函数指针的 int 类型参数指的是当前触发该函数的信号可将多个信号绑定到同一个信号处理函数上此时就可通过此参数来判断当前触发的是哪个信号。
其中typedef是简化函数指针定义
sighandler_t sig 等价于 void (*sig)(int).sigaction
sigaction()具灵活性以及移植性。sigaction()允许单独获取信号的处理函数而不是设置并且还可以设置各种属性对调用信号处理函数时的行为施以更加精准的控制其函数原型如下所示
#include signal.h
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);函数参数和返回值 signum:需要设置的信号除SIGKILL和SIGSTOP外。 act:act参数是一个struct sigaction类型指针sigaction数据结构描述了信号处理。参数act不为NULL则表示需要为信号设置新的处理方式如果参数act为NULL则表示无需改变信号当前的处理方式。 oldact:oldact 是一个 struct sigaction 类型指针指向一个 struct sigaction 数据结构。如果参数oldact 不为 NULL则会将信号之前的处理方式等信息通过参数 oldact 返回出来如果无意获取此类信息那么可将该参数设置为 NULL。
返回值成功返回 0失败将返回-1并设置 errno
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};