96SEO 2026-02-19 21:01 0
程序设计特性之一一个信号可以认为是一种软中断通过用来向进程通知异步事件。

信号默认行为Term默认行为是终止进程Ign默认行为是忽略这个信号Core默认行为是终止进程并转储内核dump
coreStop默认行为是停止进程Cont默认行为是在进程停止后继续执行该进程
接口修改信号的处置方法。
后者在建立信号处理函数时移植性差一些参考
获得详细信息。
通过这些系统调用在信号发生时进程可以选择以下行为处理信号
默认情况下信号处理函数是在普通进程栈上调用的不过也可以设置它使用其他可选的栈参考
信号处置是每个进程的属性在多线程应用中信号处置函数对于所有线程都是一样的。
执行的过程中进程想要处理的信号处置方法会被设置为默认值而处置方法为忽略的信号保持不变。
下面系统调用会暂停当前调用线程直至捕捉到一个信号或者无法处理的信号终止该进程
除了通过信号处理函数异步处理信号我们还可以通过同步接收信号也就是说程序会阻塞运行直至接收到信号同时也是在这一点内核会返回调用者一些关于信号的信息。
通常有两种方式实现同步信号接收
sigwaitinfo(2)、sigtimedwait(2)、sigwait(3)
都会阻塞执行直到收到指定集合里的信号发生每个调用都会返回接收到信号的信息。
signalfd(2)
一个信号是可以被屏蔽的也就是说只有在打开屏蔽后才会得到分发。
其实我们上面说的信号发生更确切的说是信号分发到了进程。
那么信号在生成和被分发之前的状态我们成为等待pending。
mask或者也可以称为掩码它只是了线程当前屏蔽掉的信号集合。
线程可以通过
一个信号可以是发给进程的也可以是发给线程的。
发给进程的信号通常是由内核产生的而不是由特定硬件异常产生的通常是由类似
产生的。
而发给线程的信号可能是因为执行了一些特定机器语言指令导致硬件异常比如非法内存访问的
发给进程的信号是可以被分发到进程内任何没有屏蔽整个信号的线程的。
如果不止一个线程没有屏蔽该信号那么内核会随便选一个线程分发该信号。
接口来获得当前处于等待状态的信号集信号集是一个进程等待信号和线程等待信号的共用体。
在每次内核模式到用户模式的切换时也就是一个系统调用返回或者调用一个线程到
上运行内核都会检查该进程建立信号处理函数的信号的非屏蔽信号的等待状态。
如果有这样的信号存在那么就会进行以下几步
1.3信号相关的一些上下文片段会被封装到栈上的特定帧里保存的信息包括
为信号处理函数的第一条指令并配置信号处理函数的返回地址到一个称为信号蹦床的用户空间代码片段在
3内核将控制权返还给用户空间这样就会从信号处理函数的开始执行。
中创建的栈帧来恢复信号发生之前的线程状态。
信号掩码和备用信号栈也会在这个过程中得到恢复。
在完成
调用后内核将控制权交给用户空间线程会接着从被信号打断的点继续执行。
执行了一个程序那么最后的步骤就不会执行。
这种情况下程序设计者应该特别注意如果想要恢复在进入信号处理函数时屏蔽掉的信号的话就必须自己恢复这些信号掩码使用
从内核的角度来看执行信号处理函数和执行其他任何用户空间代码没有什么区别也就是说内核并不会记录线程当前是否在执行信号处理函数。
所有的状态都被保存到了用户空间寄存器和用户空间栈里了所以信号处理函数的嵌套深度完全取决于用户栈大小以及合理的软件设计。
支持的标准信号入下表所示。
表中第二列标明了信号出现的规范“P1990”
信号标准行为备注SIGABRTP1990Coreabort(3)
的定时器信号SIGBUSP2001Core总线错误错误内存访问SIGCHLDP1990Ign子进程停止或者终止了SIGCLD-Ign同
SIGCHLDSIGCONTP1990Cont如果停止了就继续执行SIGEMT-Term模拟器陷入SIGFPEP1990Core浮点异常SIGHUPP1990Term控制终端上检测到挂机或者控制进程死掉了SIGILLP1990Core非法指令SIGINFO-同
SIGPWRSIGINTP1990Term键盘中断SIGIO-TermI/O
SIGABRTSIGKILLP1990Term杀死信号SIGLOST-Term文件锁丢失不用了SIGPIPEP1990Term破坏的管道写一个没有读者的管道参考
pipe(7)SIGPOLLP2001Term可查询事件Sys
SIGIOSIGPROFP2001Term分析定时器超时SIGPWR-Term电源失效System
VSIGQUITP1990Core键盘上的退出SIGSEGVP1990Core无效的内存引用SIGSTKFLT-Term协处理器栈错误不用了SIGSTOPP1990Stop停止进程SIGTSTPP1990Stop终端输入的停止信号SIGSYSP2001Core非法的系统调用SVr4参考
seccomp()SIGTERMP1990Term终止信号SIGTRAPP2001Core追踪/断电
陷入SIGTTINP1990Stop后台进程终端输入SIGTTOUP1990Stop后台进程终端输出SIGUNUSED-Core同
SIGSYSSIGURGP2001Ign套接字上的紧急事件4.2
setrlimit(2)SIGWINCH-Ign窗口大小重设信号4.3
标准信号没有排队如果一个标准信号的多个实例在信号屏蔽期间到达那么只有一个信号会被设置为等待状态信号只能在其取消屏蔽后会分发给进程。
如果一个信号已经在等待和这个信号关联的
sigaction(2)并不会被后面的同一信号的其他实例覆盖。
因此进程会接收到第一个达到的信号实例。
下表列出了各个标准信号的号码。
在表中我们可以看出一些信号在不同架构上的号码是不一样的。
-
以及其他大多数Alpha/SPARCMIPSPARISC备注SIGHUP1111SIGINT2222SIGQUIT3333SIGILL4444SIGTRAP5555SIGABRT6666SIGIOT66
66SIGBUS7101010SIGEMT-77-SIGFPE8889SIGKILL9999SIGUSR110301616SIGSEGV11111111SIGUSR212311717SIGPIPE13131313SIGALRM14141414SIGTERM15151515SIGSTKFLT16---SIGCHLD17201818SIGCLD--18-SIGCONT18192526SIGSTOP19172324SIGTSTP20182425SIGTTIN21212627SIGTTOU22222728SIGURG23162129SIGXCPU24243012SIGXFSZ25253130SIGVTVLRM26262820SIGPROF27272921SIGWINCH28282023SIGIO29232222SIGPOLLSIGPWR3029/-1919SIGINFO-29/---SIGLOST----SIGSYS31121231SIGUNUSED31--31
系统不同而不同所以程序不应该使用硬编码值指定实时信号而应该使用
和标准信号不同实时信号没有预定义的含义即整个实时信号集都可以被应用使用。
发送可以附带一个这个数值可以是整数或者指针。
接收进程通过sigaction(2)
ID。
实时信号的分发的顺序是能够得到保证的。
同一个类型实时信号的多个实例会按照它们实际的发送顺序分发。
多个信号发送到同一个进程那么会从号码最小的信号依次分发即号码越小优先级越高。
相反多个标准信号处于等待状态先分发谁是没有定义的。
之前只暴漏了对所有进程总共实时信号数的系统级限制这个限制可以通过需要特权/proc/sys/kernel/rtsig-max
rt_sigsuspend(2)sigtimedwait(2)
至于采用哪种行为主要取决于具体的接口以及建立信号处理函数时是否使用了
如果如下接口中的一个阻塞调用被信号处理函数自动打断那么如果使用了
read(2)/readv(2)/write(2)/writev(2)/ioctl(2)
调用可能会无限期阻塞的设备比如终端、管道以及套接字。
如果这些慢速设备上的
调用在被打断时已经传输了一些数据那么调用会返回成功状态通常情况下时传输的字节数。
注意根据这个定义本地磁盘不是慢速设备磁盘上的
操作不会被信号打断。
open(2)如果它可能阻塞比如当打开一个
fifo(7)wait(2)/wait3(2)/wait4(2)/waitid(2)/waipid(2)套接字接口accept(2)/connect(2)/recv(2)/recvfrom(2)/recvmmsg(2)/recvmsg(2)/send(2)/sendto(2)/sendmsg(2)除非套接字设置了超时下面会提到文件锁定接口flock(2)
消息队列接口mq_receive(3)/mq_timedreceive(3)/mq_send(3)/mq_timedsend(3)futex(2)
EINTRgetrandom(2)pthread_mutex_lock(3)/pthread_cond_wait
信号量语义接口wem_wait(3)/sem_timedwait(3)Linux
设置了超时SO_RCVTIMEO的输入套接字接口accept(2)/recv(2)/recvfrom(2)/recvmmsg(2)(同时有非空
设置了超时SO_RCVTIMEO的输出套接字接口connect(2)/send(2)/sendto(2)/sendmsg(2)等待信号的接口pause(2)/sigsuspend(2)/sigtimedwait(2)/sigwaitinfo(2)文件描述符多路复用接口epoll_wait(2)/epoll_pwait(2)/poll(2)/select(2)/pselect(2)System
接口msgrcv(2)/msgsnd(2)/semop(2)/semtimedop(2)睡眠接口clock_nanosleep(2)/nanosleep(2)/usleep(3)io_getevents(2)
上即使没有信号处理函数一些阻塞接口也可能在收到停止信号停止在收到
设置了超时SO_RCVTIMEO的输入套接字接口accept(2)/recv(2)/recvfrom(2)/recvmmsg(2)(同时有非空
设置了超时SO_RCVTIMEO的输出套接字接口connect(2)/send(2)/sendto(2)/sendmsg(2)epoll_wait(2)/epoll_pwait(2)semop(2)/semtimedop(2)sigtimedwait(2)/gitwaitinfo(2)Linux
FUTEX_WAIT/sem_timedwait(3)/sem_wait(3)Linux
文件包含了一些用于显示一个线程正处于阻塞SigBlk、捕获SigCgt或者忽略SigIgn的字段。
进程中所有线程的阻塞和忽略信号相同。
其他字段展示了发给线程SigPnd或者进程ShdPnd的等待信号。
/proc/pid/status
中关于硬件异常的信号SIGBUS/SIGEMT/SIGFPE/SIGILL/SIGSEGV/SIGTRAP。
至于这些信号哪些会真的分发文档中并没有给出描述并且也并不总是有效。
SA_EXPOSE_TAGBITS)){_exit(EXIT_FAILURE);}_exit(EXIT_SUCCESS);}intmain(void){struct
SA_EXPOSE_TAGBITS;act.sa_sigaction
{perror(sigaction);exit(EXIT_FAILURE);}raise(SIGSEGV);}
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback